布尔盲注与脚本

::: {.container}
::: {.post}
::: {.show-content}
打开题目链接,是一个登录表单。

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

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

用户名admin貌似是存在的。

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

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

sqlmap
-u "http://08d205bc93194b6198b7e4939a6b6d0b68358ed1e4fc4b46.game.ichunqiu.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字典的反应

发现网页对于%报错了。

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

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

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

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

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

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

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

\

admin%1$\' or 1=1#

\

admin%1$\' or 1=2#

\

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


参考文章:http://www.freebuf.com/articles/web/120985.html

\

admin%1$\' or length(database())>2#    正确

\

admin%1$\' or length(database())>3# 错误

\

说明数据库名称长度为3

\

参考文章中已经讲的很清楚了,就不赘述了。

\

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

\

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

问题:第9行,python中\'转义了单引号,导致我查错误查了半天!!!

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

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::
:::
:::
:::