PHP伪协议绕过死亡代码

PHP伪协议处理死亡代码

file_put_contents模型:

<?php
$filename = $_GET["f"];
$content = $_POST['c'];
if (isset($content) && isset($filename)) {
	@file_put_contents($filename, '<?php exit(); ?>'.$content);
}else{
	highlight_file(__FILE__);
}

file_put_contents函数介绍

base64解码

​ 了解base64编码的基础可以发现其由大小写字母和数字组成,特殊会带有” = “补全解码,编码会将连续符合的3个字符编成4个字符,遇到不符合的字符则跳过或者忽略。解码则相反。我们需要处理模型的内容是<?php exit(); ?>,这个信息会导致php中断,无法执行后面的内容。

​ 可以发现这个需要处理的内容中只有php exit是可以进行base64编码的,其他进行了忽略或者跳过,通过上面的解说,我们需要将phpexit变成8字符才可以进行base64解码,所以随意添加两个字符,比如aphpexit。于是我们可以写入payload为c=aPD9waHAgc3lzdGVtKCJkaXIiKTsgPz4=,f=php://filter/convert.base64-decode/resource=1.php

作用就是将<?php exit(); ?>.$content进行base64编码后写入文件1.php中,因为phpexita会被进行base64解码成php无法识别的内容而无法解析,但是PD9waHAgc3lzdGVtKCJkaXIiKTsgPz4=的base64解码成<?php system("dir");?>被php解析执行。

image-20230909232206715

image-20230909232355002

string.rot13解码

注意:该方法需要短标签关闭,即查看short_open_tag是否打开,一般在Windows下是默认开启,在Linux中默认关闭

rot13是回转13位,可以认为是凯撒密码的一种变形,string.rot13会对php内容进行rot13解码

​ 还是和上面一样,需要通过编码进行处理<?php exit(); ?>,那么需要处理的就是将'<?php exit(); ?>'.$content进行rot.13编码,但是进行解码后会发现仍然有<?,需要短标签关闭才不会报错,然后执行后面的内容。思路就是对$content的内哦内容进行rot编码,那么payload为c=在<?cuc flfgrz("qve"); ?>,f=php://filter/string.rot13/resource=1.php

image-20230909234134732

如果没有关闭short_open_tag:

image-20230909234211008

关闭后:

fb873a500cb45306e8cbad8c77f79d0

string.strip_tags组合

该协议的使用是将字符串中的 HTML、XML 以及 PHP 的标签或者数组中的 HTML、XML 以及 PHP 的标签剥除.(PHP 7.3.0 起废弃),而<?php?>就是php的标签,使用该协议即将<?php exit();?>直接去除

介绍

php://filter的协议可以进行组合使用的,介绍了strip_tags的内容,那么就是使用该内容配合base64或者其他编码进行文件内容的写入了,payload为c=php://filter/string.strip_tags|convert.base64-decode/resource=1.php,f=D9waHAgc3lzdGVtKCJscyIpOyA/Pg==

思路就是:首先第一个strip_tags协议将<?php exit();?>D9waHAgc3lzdGVtKCJscyIpOyA/Pg的内容进行了剥除,导致剩下的内容为D9waHAgc3lzdGVtKCJscyIpOyA/Pg,然后在使用base64-decode进行编码,使写入内容为<?php system("dir"); ?>。

image-20230910000404421

image-20230910000446568

posted @ 2023-09-10 00:07  ntrack  阅读(123)  评论(0编辑  收藏  举报