1.源码泄露
根据题目的给他,念起来其实就是git,应该存在.git源码泄露。使用githack下载源码发现了暗示hint.php
<?php
$pass=sprintf("and pass='%s'",addslashes($_GET['pass']));
$sql=sprintf("select * from user where name='%s' $pass",addslashes($_GET['name']));
?>
2.addslashes绕过
源码出现了一个没见过的函数,百度了一下addslashes函数的作用是返回在预定义的字符前添加反斜杠的字符串,这里预定义的是单引号,也就是将我们传入的单引号转义掉了。这里我尝试了宽字节绕过和base64编码绕过都不行。通过大佬文章了解到addslashes的漏洞。
sprintf函数使用switch case对15种类型做了匹配,包括%s、%d、%u…但如果在15种类型之外就会直接break。
当我们输入%\或%1$\时,sprintf会把反斜杠当做格式化字符串的类型,但他们并不在15种类型之中,就会未经任何处理而被替换为空
通过这个漏洞我们构建payload:/?name=1&pass=%1$' or 1=1--+
就可以绕过单引号转义。
3.文件包含
登陆成功后进入一个404界面,发现提示
访问一下/flag。
访问不到,通过抓包发现了新提示。
cookie里面有个参数file,经过解码发现file=flag.txrt
访问一下
发现这里的话与404界面一样,猜测在404界面包含了file文件,我们将/flag编码之后替换flag.txt。
成功拿到flag。