从这道题学到了挺多
一打开题目就是登陆页面,遂扫描文件检测是否存在文件泄露
用dirsearch扫出了robots.txt,.DS_Store和其他php。DS_Store没有可用信息(buuoj的题扫描一定不能太快。。。。429警告)
打开robots.txt,要素察觉,有备份文件。
逐个尝试,发现了image.php.bak文件,分析一波源码
<?php include "config.php"; $id=isset($_GET["id"])?$_GET["id"]:"1"; $path=isset($_GET["path"])?$_GET["path"]:""; $id=addslashes($id); $path=addslashes($path); $id=str_replace(array("\\0","%00","\\‘","‘"),"",$id); $path=str_replace(array("\\0","%00","\\‘","‘"),"",$path); $result=mysqli_query($con,"select * from images where id=‘{$id}‘ or path=‘{$path}‘"); $row=mysqli_fetch_array($result,MYSQLI_ASSOC); $path="./" . $row["path"]; header("Content-Type: image/jpeg"); readfile($path);
addslashes函数会在预定字符前加\,如果我们在id参数传入\0,经过addslashes函数处理就会变为\\0,然而后面的str_replace把\0置换为空,那
么我们插入的\\0就会变成\,把id参数后的‘转义。此时我们的sql语句如下
select * from images where id=‘or path=‘‘
可以在path参数进行注入,注释掉后面的单引号并用and 1=1构造注入
select * from images where id=‘or path=‘and 1=1--+‘
也可以利用path重新构造id进行注入
select * from images where id=‘or path=‘ or id=1--+‘
脚本如下
注入这里搞了半天,密码比较长。把n的范围设到20才爆出完整密码
因为手工太慢了所以尝试了sqlmap
sqlmap牛逼!!不过这里有个坑。。。。\0前要加\转义让\失去转义功能,可以用v参数查看注入的payload来调整语句
查到用户名和密码登录之后发现上传点
随便传个文件,返回结果里显示有上传路径
打开之后发现是日志文件,用来记录上传的文件名
接下来思路就很清晰了,这是个php文件,并且会记录文件名。我们只需要把文件名改成一句话。上传之后就会被解析成php。一般的一句话会被拦截,因为出现了"php"。我们可以采用短标签<?= ?>代替<?php ?>
蚁剑连接,flag在根目录