更新:
- CBC翻转攻击脚本
- 格式化字符串sql注入详细解答
趁着期中考,复习累了做几道ctf玩玩,只做出来3道web。感谢师傅们出的题!
Task
|
|
Solution
源码泄露
|
|
下载下来后,用vim -r
恢复,得到源代码:
login.php
admin.php的源码后面放出。
经过测试,存在账号和密码,分别为admin和admin。在login.php页面登陆后会跳转到admin.php。默认情况下,由于并非真实admin,在跳转后会显示you are not admin.
CBC翻转字节攻击
鉴于篇幅的原因,关于CBC翻转字节攻击这里就不多讲了。在观察login.php,以及加上一点点的社工后,可以发现跟NJCTF的某题神似。借网络的脚本,修改了一下,增加登陆页面的验证以及跑出token后的结束标志:
|
|
得到:
成功进入后台。
格式化串sql注入
这里放上admin.php的源码:
在看到sprintf后,可以很直接的联系到前阵子爆出的关于wordpress的格式化字符串SQL注入漏洞。传送门:从WordPress SQLi谈PHP格式化字符串问题(2017.11.01更新)
基于泄露出的源码,添加一些变量打印语句,本地测试代码:
payload:
观察传入的title参数。
title传入的值为flag%1$' or 1=1#
,经过mysql_real_escape_string
,会使得单引号'
前加上斜杠,也就是图片中的第四行:
接下来执行一次sprintf("AND title='%s'", $title);
,也就是将前面得到的title值title值为:
接下来,又一次执行了sprintf
:
由于PHP的sprintf中,%1$\
这样的语法,百分号%
后面的数表示使用第几个参数,$
后面的表示类型,常见的类型比如s
表示字符串等等。比如%1$s
,表示使用第一个参数,类型为字符串(%s)
|
|
前两个示例是演示选择参数的用法。第三个和前两个比较,变成类型%\
,会直接跳过不处理,并直接输出。第四个和第三个对比,少了参数选择,这会导致报错,无法正常打印。
回到前面的sprintf
通过百分号后的1,选择了一个参数(即id)不会爆错。利用类型%\
,使得跳过。而原本在\
后面的单引号,由于前面斜杠被当作了sprintf的类型,得以成功逃逸。
剩下的工作就是盲注了,比如:
脚本写得太丑,基于以前的写的框架修改的,这里就不贴啦。
最后注出来的表结构如下:
flag:
回到PHP的sprintf中,sprintf能吃掉\
呢?在源码中,采用了case进行分类处理,而对于未知情况,则采取break。明显%\
是未知情况,因此成功绕过。
小结
- 源码泄露
- CBC翻转字节攻击
- 格式化串sql注入