作者:whale

近期,小编对研究SQL注入颇有兴趣。于是便搜集了一些资料发现了SQLI-LABS平台,SQLI-LABS是专门学习SQL注入测试的。根据搜集到的资料自己在本地搭了一个平台环境进行学习。

一关一关的学习跟做游戏一样非常的有意思,其中有一道题在做的过程中研究了很久觉得很有意义就拿出来跟大家分享分享。

打开题目链接,是一个登录表单。

经过测试,输入错误的用户名,提示「username error!

输入正确的用户名和错误的密码,提示「password error! "

用户名admin貌似是存在的。

1.测试单引号,没有报错。看来不是基于报错类型的注入。

2.经过十多分钟的探测,all tested parameters appear to be not injectable.

sqlmap -u "http://08d205bc93194b6198b7e4939a6b6d0b68358ed1e4fc4b46.game.icfangyou.com/" --data="username=admin&password=admin" --dbs --level 3

3.测试admin and 1=1,发现『空格』被替换为『+

于是将空格替换为/**/注释,admin/**/and/**/1=1,提示,username error!

看来也不是布尔型注入,而且有WAF的说(特殊符号被替换/转义)

估计我的水平是绕不过WAF了,然后看看答案

我前面判断错误,没有WAF,而且是布尔型注入ORZ,只不过注入条件有点奇怪,以前没见过。

用burp检测下,网页对于waf字典的反应,发现网页对于%报错了。

参考:sprintf( )格式化字元串

简单的说,就是使用该函数,会将格式化的字元串写入变数中。

%符号是格式化字元串符号,例如:%s表示转换为string类型,%d表示转换为double float双精度浮点型。

于是可以用%1$s,表示第一个替换位置是字元串类型。原理可以看php手册sprintf()

如果我们写入%1$,因为sql会自动加单引号,于是,单引号被转义,于是闭合了前面第一个引号,然后就可以写入其他语句了。

如果我们写入如下语句,那么就会认为是正确的用户名。

admin%1$ or 1=1#admin%1$ or 1=2#

两个语句返回值不一样,说明是布尔型盲注

参考文章:freebuf.com/articles/we

admin%1$ or length(database())>2# //正确admin%1$ or length(database())>3# //错误

说明资料库名称长度为3,参考文章中已经讲的很清楚了,就不赘述了。

最后通过脚本,用代码代替手工即可快速得出flag。

问题发生在第9行,python中转义了单引号,导致我查错误查了半天!!!

admin%1$ or xxx就相当于admin or 1=2 因为前面是正确的,于是整条语句都是正确的,导致结果一直都是password errror......


推荐阅读:
相关文章