建议的学习方法

  1. 学习并灵活掌握常见的编程语言,如 PHP、JAVA 等。

  2. 熟悉并可灵活运用常见的程序框架,如 Strut 2、ThinkPHP 等。

  3. 手工和工具结合运用,可对程序源代码进行针对性审计。

很多人喜欢把代码执行称为命令执行漏洞,因为命令执行和代码执行都可以执行系统命令。

区别:

命令执行漏洞直接执行操作系统的命令;

代码执行漏洞是靠脚本代码调用系统命令,然后执行。

常见攻击流程

  1. 前期准备

    下载程序源码,并部署测试环境

  2. 代码审计

    • 结合手工和工具对程序源代码进行白盒审计
    • 利用常见黑盒技术手段对当前环境进行检测
  3. 攻击利用

    针对第二阶段发现的问题进行分析和利用

定义及原理

定义

命令执行漏洞,就是指用户通过浏览器或其他辅助程序提交执行命令,由于服务器端有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。

通俗地讲:当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如 php 中的 system、exec、shell_exec 等,当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常的命令中,造成命令执行攻击。

原理

命令执行漏洞之所以会产生,原因就是由于开发人员编写源码,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端执行。命令注入攻击中 WEB 服务器没有过滤类似 system(),eval(),exec() 等函数是该漏洞攻击成功的最主要原因。

危害

  1. 继承 Web 服务程序的权限去执行系统命令或读写文件
  2. 反弹 Shell
  3. 控制整个网站甚至控制服务器
  4. 进一步内网渗透
  5. 挂马、钓鱼、敏感信息泄露

分类

  • 框架组件层:

    很典型的就是 WordPress 中,可以选择使用 ImageMagick 这个常用的图片处理组件,对用户上传的图片进行处理,造成命令执行;JAVA 中的命令执行漏(struts2/Elasticsearch 等);ThinkPHP 命令执行

  • 代码层: 一些商业应用需要执行命令,商业应用的一些核心代码可能封装在二进制文件中,在 web 应用中通过 system 等函数来调用。当用户可以控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。

  • 系统层:

    (bash 破壳漏洞)如果我们能够控制执行的 bash 的环境变量,就可以通过破壳漏洞来执行任意代码;

利用条件

  1. 应用调用执行系统命令的函数
  2. 将用户输入作为系统命令的参数拼接到命令行中
  3. 没有对用户输入进行过滤或过滤不严

框架组件层

Apache Struts2 s2-032 技术分析及漏洞检测脚本 自己去搭建环境,测试。

代码层

PHP 下命令执行函数

在 PHP 中具有执行系统命令功能的函数如下:

  1. system
  2. exec
  3. shell_exec
  4. passthry
  5. popen
  6. proc_popen

提示:某些情况下,要注意存在以上函数的 PHP 文件,有可能是 Webshell

命令执行漏洞代码分析

以下给出一个存在命令执行漏洞的简单代码

参考链接:php.net -->system

1
2
3
4
5
6
7
8
<?php
echo "<pre>";
if(isset($_GET['cmd']))
{
system($_GET["cmd"]);
}
echo "</pre>";
?>

Windows 下命令执行漏洞技巧

命令执行代码分析

以下使用 PHP 代码,对指定目标执行 ping 命令

1
2
3
4
5
6
7
8
<?php
echo "<pre>";
$arg = $_GET["cmd"];
if($arg){
system('ping $arg');
}
echo "</pre>";
?>

命令执行漏洞利用思路

代码中拼接用户的输入并通过 system 函数执行,但是无法直接执行用户的自定义命令。

思路:

截断输入,重新拼接。两条命令都输入并执行

命令执行漏洞拼接符

在 Windows 系统下的 cmd 命令中,有以下一些阶段拼接符

& :前面的语句为假,则直接执行后面的 -->

&& :前面的语句为假,则直接出错,后面的也不执行 --> 逻辑与

|:直接执行后面的语句 --> 管道符,将前面命令的结果传给后面,然后执行后面命令

||:前面出错执行后面的 --> 逻辑或

使用拼接符,从而利用命令执行漏洞执行 ipconfig 命令

这四个命令拼接符有可能在不同的 Windows 平台下,有些不一样,我们测试的时候,可以四种都试一试,找到可以利用的。

Linux 命令执行漏洞利用技巧

命令执行示例代码分析

以下使用 PHP 代码,对指定目标执行 ping 命令

1
2
3
4
5
6
7
8
<?php
echo "<pre>"
$arg = $_GET['cmd'];
if($arg){
system("ping -c 4 $arg");
}
echo "</pre>";
?>

Linux 下的 ping 命令与 Windows 下的 ping 命令的区别:

Linux 的 ping 默认一直执行。需要加上 -c 4 指定执行参数为 4 次,才会只执行 4 次

Windows 下的 ping 默认执行 4 次

kali linux 集成了 Apache2 和 Nginx

apache 的网站根目录为 /var/www/html/

1
2
service apache2 status	#查看 apache2 服务当前状态
service apache2 start # 开启 apache2 服务

命令执行漏洞拼接符介绍

在 Linux 系统下的 shell 命令中,有以下一些截断拼接符

; : 前面的执行完,执行后面的 --> 分隔符

| :管道符,显示后面的执行结果

&: 无论前面语句真假都会执行

&&: 只有前面语句为真,才会执行后面语句 ---> 逻辑与

||: 当前面的执行错误时,执行后面的 --> 逻辑或

在 Linux 上,上面的 ; 也可以用 ||| 代替。

代码执行漏洞

在 PHP 下允许命令执行的函数有:

1
2
3
4
eval()
assert()
preg_replace()
call_user_func()

如果页面中存在这些函数并且对用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏洞。

其他函数:

1
2
3
4
5
ob_start()、unserialize()、create_function()
usort()、uasort()、uksort()
array—_filter()
array_reduce()
array_map()

命令执行绕 WAF 技巧:

命令执行自动化工具

commix 工具介绍

Commix 是一个使用 Python 开发的漏洞测试工具,这个工具是为了方便的检测一个请求是否存在命令注入漏洞,并且对其进行测试,在其作者发布的最新版本中支持直接导入 Burp 的历史记录进行检测,大大提高了易用性。

commix github

kali linux 自带了 commix, 可以直接使用。

1
2
commix -h	# 查看帮助信息
commix -u {url} # 即可检测,然后会提示你是否模拟 shell,直接模拟出来一个 shell