萌新赛-给她
信息收集
进去是一个SQL语句展示,emmm,那就写几句SQL注入看看,抓包,用字典FUZZ,一个没出,发现单引号都被转义了,猜测后台是有一个addslashes
函数,那么我们可以联想到sprintf
函数与addslashes
函数连用造成的逻辑漏洞,但是不确定,目录扫描可不能少,扫一下,发现有git,直接访问报403,那用GitHack拉取一下,发现hint.php
发现确实如我们所想,存在sprintf函数
sprintf函数的底层逻辑漏洞
由于该函数的底层逻辑上只对15中占位符有分支,而其他的则直接没处理,而造成的被替换为空字符,如:
<?php
$sql="select * from user where username='%\' and 1=1 #';";
$user='admin';
echo sprintf($sql,$user);
?>
//打印出来:select * from user where username='' and 1=1 #';
可被替换为空的占位符:%\
,%1$\
解题
那么我可以构造如下payload:name=admin&pass=1%1$'or 1=1%23
在后台应该是:select * from user where name ='admin' and pass='1'or 1=1#'
返回了一个报错页面,发现不是原生的报错,check一下源码:
发现存在hint,那么文件位置我们已经知晓,下面就是如何读取文件,首先想到的是用load_file函数,但是没搞出来,然后无意间抓了一个包,好家伙,cookie里竟然藏了一个file,抓出来转16进制,得到flag.txt
,那么我们放入/flag
的16进制进去2f666c6167
,放包,得到flag:ctfshow{9cd199ec-f7ef-41e0-9a1f-234d9ab5628d}