命令执行入门篇
建议的学习方法
学习并灵活掌握常见的编程语言,如 PHP、JAVA 等。
熟悉并可灵活运用常见的程序框架,如 Strut 2、ThinkPHP 等。
手工和工具结合运用,可对程序源代码进行针对性审计。
很多人喜欢把代码执行称为命令执行漏洞,因为命令执行和代码执行都可以执行系统命令。
区别:
命令执行漏洞直接执行操作系统的命令;
代码执行漏洞是靠脚本代码调用系统命令,然后执行。
常见攻击流程
前期准备
下载程序源码,并部署测试环境
代码审计
- 结合手工和工具对程序源代码进行白盒审计
- 利用常见黑盒技术手段对当前环境进行检测
攻击利用
针对第二阶段发现的问题进行分析和利用
定义及原理
定义
命令执行漏洞,就是指用户通过浏览器或其他辅助程序提交执行命令,由于服务器端有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。
通俗地讲:当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如 php 中的 system、exec、shell_exec 等,当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常的命令中,造成命令执行攻击。
原理
命令执行漏洞之所以会产生,原因就是由于开发人员编写源码,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端执行。命令注入攻击中 WEB 服务器没有过滤类似 system(),eval(),exec() 等函数是该漏洞攻击成功的最主要原因。
危害
- 继承 Web 服务程序的权限去执行系统命令或读写文件
- 反弹 Shell
- 控制整个网站甚至控制服务器
- 进一步内网渗透
- 挂马、钓鱼、敏感信息泄露
分类
框架组件层:
很典型的就是 WordPress 中,可以选择使用 ImageMagick 这个常用的图片处理组件,对用户上传的图片进行处理,造成命令执行;JAVA 中的命令执行漏(struts2/Elasticsearch 等);ThinkPHP 命令执行
代码层: 一些商业应用需要执行命令,商业应用的一些核心代码可能封装在二进制文件中,在 web 应用中通过 system 等函数来调用。当用户可以控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
系统层:
(bash 破壳漏洞)如果我们能够控制执行的 bash 的环境变量,就可以通过破壳漏洞来执行任意代码;
利用条件
- 应用调用执行系统命令的函数
- 将用户输入作为系统命令的参数拼接到命令行中
- 没有对用户输入进行过滤或过滤不严
框架组件层
Apache Struts2 s2-032 技术分析及漏洞检测脚本 自己去搭建环境,测试。
代码层
PHP 下命令执行函数
在 PHP 中具有执行系统命令功能的函数如下:
- system
- exec
- shell_exec
- passthry
- popen
- proc_popen
提示:某些情况下,要注意存在以上函数的 PHP 文件,有可能是 Webshell
命令执行漏洞代码分析
以下给出一个存在命令执行漏洞的简单代码
参考链接:php.net -->system
1 | <?php |
Windows 下命令执行漏洞技巧
命令执行代码分析
以下使用 PHP 代码,对指定目标执行 ping 命令
1 | <?php |
命令执行漏洞利用思路
代码中拼接用户的输入并通过 system 函数执行,但是无法直接执行用户的自定义命令。
思路:
截断输入,重新拼接。两条命令都输入并执行
命令执行漏洞拼接符
在 Windows 系统下的 cmd 命令中,有以下一些阶段拼接符
&
:前面的语句为假,则直接执行后面的 -->
&&
:前面的语句为假,则直接出错,后面的也不执行
--> 逻辑与
|
:直接执行后面的语句 -->
管道符,将前面命令的结果传给后面,然后执行后面命令
||
:前面出错执行后面的 --> 逻辑或
使用拼接符,从而利用命令执行漏洞执行 ipconfig 命令
这四个命令拼接符有可能在不同的 Windows 平台下,有些不一样,我们测试的时候,可以四种都试一试,找到可以利用的。
Linux 命令执行漏洞利用技巧
命令执行示例代码分析
以下使用 PHP 代码,对指定目标执行 ping 命令
1 | <?php |
Linux 下的 ping 命令与 Windows 下的 ping 命令的区别:
Linux 的 ping 默认一直执行。需要加上 -c 4 指定执行参数为 4 次,才会只执行 4 次
Windows 下的 ping 默认执行 4 次
kali linux 集成了 Apache2 和 Nginx
apache 的网站根目录为 /var/www/html/
1 | service apache2 status #查看 apache2 服务当前状态 |
命令执行漏洞拼接符介绍
在 Linux 系统下的 shell 命令中,有以下一些截断拼接符
;
: 前面的执行完,执行后面的 --> 分隔符
|
:管道符,显示后面的执行结果
&
: 无论前面语句真假都会执行
&&
: 只有前面语句为真,才会执行后面语句 --->
逻辑与
||
: 当前面的执行错误时,执行后面的 --> 逻辑或
在 Linux 上,上面的 ;
也可以用 |
,||
代替。
代码执行漏洞
在 PHP 下允许命令执行的函数有:
1 | eval() |
如果页面中存在这些函数并且对用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏洞。
其他函数:
1 | ob_start()、unserialize()、create_function() |
命令执行绕 WAF 技巧:
命令执行自动化工具
commix 工具介绍
Commix 是一个使用 Python 开发的漏洞测试工具,这个工具是为了方便的检测一个请求是否存在命令注入漏洞,并且对其进行测试,在其作者发布的最新版本中支持直接导入 Burp 的历史记录进行检测,大大提高了易用性。
commix github
kali linux 自带了 commix, 可以直接使用。
1 | commix -h # 查看帮助信息 |