参考自:https://www.gem-love.com/ctf/2283.html
参考:https://www.gem-love.com/ctf/2283.html
一、自己做:
到时候,自己再开环境再做一遍。
先看了WP。。弄到了提示:
phpinfo()看了,
diabled_functions,open_basedir都没有什么东西,
<?php
error_reporting(0);
//give you all information you want
if (isset($_GET['all_info_i_want'])) {
phpinfo();
}
if (isset($_GET['file'])) {
$file = "/var/www/html/" . $_GET['file'];
//really baby include
include($file);
}
?>
拼接../../../../../flag
。是假的falg。
flag{this_is_fake_flag_realflag_is_in_/etc_find_it_by_yourself}
去/etc
下面去找,这就需要扫描目录了,但是题目给的hint又是不用扫目录,
那么既然这样包含日志看看,
包含了, 没有反应,,
all_info_u_want.php?file=../../../../../var/log/apache2/access.log
不对,,,
二、学到的:
三、学习WP
这个题的 session.upload_progress.enalbed
是关闭的,如果是开启的化,也可以用条件竞争session。
1. 预期解 1 ---- 包含日志文件
。。这个要抓包,,看htpp返回头中的header得知是ngix。
然后?file=../../../../../var/log/nginx/access.log
。
然后就可以拿啥了。试试看:
但是url传参会 进行编码,然后就不行,
然后可以在User-Agent:
这个传,在后面添加就好。
2. 预期解 2 — 包含临时文件,
常规的包含临时文件的方法有2:
- 条件竞争,不断上传,然后包含。
- 利用 PHP7 的 segment fault
但是本题都不适用,怎么包含临时文件呢???
PHP会在脚本执行结束后删掉临时文件,而 段错误方法就是让PHP执行突然中止,这样临时文件就保留了。
既然 " PHP会在 脚本执行结束后删掉临时文件 ", 不让PHP的脚本执行结束,这样不就行了嘛?,只要自身包含自身就会进入死循环中。 死循环 要么被用户打断,要么被nginx超时掉,PHP 执行没有结束,临时文件不就 得以保存了吗?
这个自己包含自己,总是进入自己哪里就是死循环了。我们访问all_info_u_want.php,然后include 又是all_info_u_want.php,然后就进入了死循环了。
另外,可以通过 phpinfo() 来查看 临时文件的位置,带上 all_info_i_awnt 参数打开 phpinfo ,然后开始自身包含,写个上传表单:
<html>
<form action="http://5e66626f-8703-41ee-ae70-0a6446a94440.challenge.ctf.show:8080/all_info_u_want.php?file=all_info_u_want.php&all_info_i_want" method="post" enctype="multipart/form-data">
<input type="file" name="filename">
<input type="submit" value= "submit">
</form>
</body>
</html>
手动停下就好了。
/tmp/phphdpIOc
不好找flag啊。
linux命令考察:
文件名不是flag。那就 找文件的内容。:
find /etc -name "*" | xargs grep "flag{"
就找到了flag了