代码整理
重新整理了下代码(已注释)
这代码逻辑看得我有点迷,尝试分析了一波,怀疑是从$_SERVER
当中扣取字符串充当payload
,所以将正则匹配结果进行输出,但是只是看到语言的首字母和权重数字,但是没看懂是怎么回事,所以就回复朋友说这不是后门。
直到今天,看到了weevely的相关资料才发现,之前给的PHP特么就是个后门,原谅我的无知。
站在前辈们的臂膀上,决定重新尝试了一波。
代码走读
通过了解,这段PHP代码是Weevely
的stegaref_php.tpl模板
生成的。对处理过的php代码重新走读。
$kh = "cdb9";
、$kf = "b740";
这两个参数是在生成后门文件时定义的密码在经过md5加密后的前8位,$r;$rr;$ra;
是从server中去取http协议请求头中的REFERER数据和ACCEPT_LANGUAGE数据- 正则匹配ACCEPT_LANGUAGE中的数组偏移量
$h; $f;
求出真正有用的payload的header值和footer(当时不知道weevely,所以卡在了这里,不知道是干嘛用的)- 最后的eval是用来解密payload,得到真正攻击的payload
$d=base64_encode(x(gzcompress($o),$k));
把执行结果通过相同的方式进行加密,放在自己密码加密后的标签中print(“<$k>$d</$k>”);
我们将变量进行打印以方便理解:
方法就是这样,一个一个变量的去理解。
代码中心思想
- 获取
Accept-Language
和Referer
信息 - 从
Accept-Language
中匹配出每种语言的首字母和权重数字 - 对匹配出的字符串进行处理得出
$h
,$f
- 从Referer获取其各个value并解析到
$q
数组,遍历到$q
中 - 判断
$h
是否存在于$q
中,如果存在,则$p
取$h
之后的子串 - 取值后的
$p
结尾必须是$f
作为停止字符串
- 去除
$p
中的$f
,得出真正的payload
$p
的组成:$h . $payload . $f
- 将
payload
进行base64的解码、循环异或、zlib 解密、执行 - 执行的结果不输出,存入缓冲区,并取出
- 对缓冲区的内容进行zlib解密、循环异或、base64加密、打印结果
利用方式
理解了代码之后,就很简单的知道是怎么利用了。
注意看preg_replace
函数的方法,就很简单的逆推出加密过的payload
实践图忘记保存,有时间再补上
效果图: