作者: h0we777
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。

0x00 简介

命令执行漏洞是指攻击者可以随意执行系统命令。它属于高危漏洞之一,也属于代码执行的范畴。命令执行漏洞不仅仅存在于B/S架构中,在C/S架构中也常常遇到。

简单的说,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许使用者通过改变$PATH或程序执行环境的其他方面来执行一个恶意构造的代码。

0x01 原理

命令执行漏洞是指应用有时需要调用一些执行系统命令的函数,如:system()、exec()、shell_exec()、eval()、passthru(),代码未对用户可控参数做过滤,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。

0x02 漏洞产生的原因

没有对用户输入进行过滤或过滤不严
例如:没有过滤&、&&、| 、||等连接符号。

系统漏洞造成的命令执行
bash破壳漏洞(CVE-2014-6271),该漏洞可以构造环境变量的值来执行具有攻击力的脚本代码,会影响到bash交互的多种应用,如http、ssh和dhcp等。

调用的第三方组件存在代码执行漏洞
例如:

php (system() 、 shell_exec() 、 exec() 、 eval())
JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令执行

0x03 常见连接符(管道符)

windows系统支持的连接符:

Linux系统支持的连接符

0x04 命令执行漏洞与代理漏洞的区别

4.1 命名执行漏洞:直接调用操作系统命令

命令执行漏洞原理:在操作系统中,"&、| 、||"都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。

4.2 代码执行漏洞:靠执行脚本代码调用操作系统命令

应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、assert、shell_exec、passthru、popen、poc_popen、escapeshellcmd、pcntl_exec等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行漏洞,这就是命令执行漏洞。以上函数主要也在webshell中用的多,实际上在正常应用中差别不太大,用得最多的还是前三个。

0x05 命令执行漏洞的利用条件

应用调用执行系统命令的函数;
将用户输入作为系统命令的参数拼接到了命令行中;
没有对用户输入过滤或过滤不严。

0x06 命令执行漏洞产生的条件

用户可以控制输入的内容
用户输入的内容被当作命令执行

0x07 命令执行漏洞分类

7.1 命令直接注入执行漏洞

应用程序直接使用了危险的可执行系统命令的函数,比如php的system、exec函数等,并且这些函数的运行参数是用户可控的,若过滤不严格,就会增大命令执行漏洞的概率。命令本地包含执行漏洞。(注:(CGI)系统命令注入执行漏洞示例,就比如Bash漏洞,就属于这类漏洞,用户可以直接更改HTTP头user-agent的值,就可引发命令注入。)

7.2 命令包含执行漏洞

命令本地/远程包含漏洞:应用程序直接包含或执行了用户可控的上传脚本文件或远程文件(URL引用文件),就会触发此漏洞。

7.3 命令反序列执行漏洞

有些动态脚本语言,如php支持实例对象的序列化传输,然后服务端将实例对象反序列化出来并执行解析后实例的构造函数、析构函数或_wakeup()函数,若这些函数利用了用户可控的参数,则会触发命令/代码注入执行漏洞,原理和之前直接注入一样。

7.4 命令动态变量执行漏洞

有些动态脚本语言,如php,支持变量或函数的动态定义,即运行时可通过参数名来动态组装变量、变量值或函数。若代码中包含有类似代码,就会存在动态变量/函数的执行漏洞。

0x08 常见危险函数

8.1 PHP下命令执行函数

  • Eval()
    该函数把字符串按照PHP代码来计算。该字符串必须是合法的php代码,且必须以分号结尾。如果没有在代码字符串中调用return语句,则返回NULL。如果代码中存在解析错误,则eval()函数返回false。

语法:eval(phpcode) phpcode必需。规定要计算的php代码。

例子:

<?php $a=$_GET['a'];eval($a);?>
http://127.0.0.1/oscommand/1.php?a=phpinfo();
  • Assert()
    检查一个断言是否为false。

语法:

PHP 5 : bool assert(mixed assertion [, stringdescription])
PHP 7 : bool assert(mixed assertion [, Throwableexception])
assert() 会检查指定的 assertion 并在结果为false时采取适当的行动。

例子:

<?php $a = $_GET['a'];assert($a); ?>
http://127.0.0.1/oscommand/1.php?a=phpinfo(); http://127.0.0.1/oscommand/1.php?a=phpinfo()
  • Preg_replace()
    该函数执行一个正则表达式的搜索和替换。

语法:

mixed preg_replace(mixed pattern,mixed replacement,mixed subject \[,int limit=-1 [,int &$count]])
搜索subject 中匹配pattern的部分,以replacement进行替换。

参数说明:

pattern:要搜索的模式,可以是字符串或一个字符串数组。当pattern处存在一个"/e"修饰符时,$replacement的值会被当成php代码来执行。
$replacement:用于替换的字符串或字符串数组。
$subject:要搜索替换的目标字符串或字符串数组。
$limit:可选,对于每个模式用于每个subject字符串的最大可替换次数。默认是-1(无限制)。
$count:可选,为替换执行的次数。

例子:

<?php $a = $_GET['a']; echo preg_replace("/test/e", $a, "just test!") ?>
http://127.0.0.1/oscommand/1.php?a=phpinfo()

注:在php5.4及以下版本中,preg_replace()可正常执行代码,而在php5.5及后续版本中提醒"/e"修饰符已被弃用,要求用preg_replace_callback()函数来代替。

  • Call_user_func()
    该函数把第一个参数作为回调函数调用。

语法:

mixed call_user_func(callable callback \[,mixed paremeter [,mixed $...]])
第一个参数callback 是被调用的回调函数,其余参数是回调函数的参数。

例子:

<?php call_user_func($_GET['a'],$_GET['b']); ?>
http://127.0.0.1/oscommand/1.php?a=assert&b=phpinfo()
  • call_user_func_array
  • create_function
  • array_map
  • system
    该函数命令执行后的返回值存在输出值的最后一行,函数本身也会打印全部输出值。

语法:

system(string $command [,int $return_var])
函数执行command参数所指定的命令,并输出结果。
string和int是参数的数据类型,分别是字符串和整数。
command:要执行的命令。
return_var:如果提供return_var参数,则外部命令执行后的返回状态会被设置到此变量中。如果成功执行则状态码为0;如果执行失败状态码为1.
  • Exec
    该函数命令执行后的值为输出值的最后一行,函数并不会打印任何内容。

语法:

exec ( string KaTeX parse error: Expected 'EOF', got '&' at position 18: …mmand [, array &̲output [, int &$return_var ]] )
函数执行command参数所指定的命令。
string、array、int是参数的数据类型,分别是字符串、数组和整数/
中括号的意思是如果前一个参数存在,那么中括号中的参数可以不写。例如:如果存在$command参数,则$output参数可有可无;如果不存在ouput参数,则$return_var也不能出现。
command:要执行的命令。
output:如果提供了output参数,那么会用命令执行的输出填充此数组,每行输出填充数组中的一个元素。数组中的数据不包括行位的空白字符,例如\n字符。如果数组中自己包含了部分元素,exec()函数会在数组末尾追加内容。如果不想在数组末尾追加,输入exec()函数前使用unset()函数进行重置。
return_var:如果同时提供output和return_var参数,命令执行后的返回状态会被写入到此变量。如果命令成功执行,则状态码为0;如果命令执行失败,则状态码为1。
  • Shell_exec
    该函数会在命令执行后将所有输出值作为字符串输入返回值,本身并不打印任何信息。

语法:

shell_exec(string $cmd)
cmd是要执行的命令。
string是参数的数据类型,也就是字符串。
shell_exec函数的用法和反引号相同。
  • Passthru
    该函数本身会打印全部输出值,但该函数没有返回值。

语法:


passthru ( string KaTeX parse error: Expected 'EOF', got '&' at position 16: command [, int &̲return_var ] )
string和int是参数的数据类型,分别为字符串和整型。
passthru()函数也是用来执行command的。当所执行的系统命令输出二进制数据,并且需要直接传送到浏览器的时候,需要此函数来代替exec()或system()函数。
command:要执行的命令。
return_var:如果提供return_var参数,Unix命令返回状态会被记录到此参数。
  • pcntl_exec

  • popen

  • proc_open

  • ob_start()

  • unserialize()

  • usort()

  • uasort()

  • ukaort()

  • array_reduce()

  • escapeshellarg
    该函数过滤一个字符串参数,原理是给字符串添加单引号,而shell不会解释单引号中的特殊字符。如果字符串中已经有单引号了,那么该函数会分段处理这个字符串,对字符串中的单引号做转义,并以之分段,也就是这种形式’…’"…’。也可以说,单引号是就近匹配的。这个函数应该用来过滤单个的shell函数的参数。

  • escapeshellcmd
    该函数应该被用来过滤整个命令字符串(而不是单个参数),转义shell元字符。

  • 反引号() php支持一个执行运算符:反引号。php将尝试将反引号中的内容作为外壳命令执行,并将输出信息作为返回值返回(即可以赋给一个变量而不是简单的丢弃到标准输出)。使用反引号运算符到效果与函数shell_exec()相同。反引号运算符在激活了安全模式或者关闭了shell_exec()时是无效的。

8.2 系统命令执行漏洞

  • system()
  • exec()
  • shell_exec()
  • passthru()
  • pcntl_exec()
  • popen()
  • proc_open()
  • 反引号(``)
  • ob_start()

0x09 命令执行漏洞常见可控位置

常见可控位置情况有以下几种:

示例:

sys=ctypes.cdll.LoadLibrary('/lib64/libc.so.6')
sys.system(cmd)

9.1 第一种情况

如果能直接控制$arg,那么就能执行任意命令了。

9.2 第二种情况

能够控制的点是程序的整个参数,可以直接用&& 、|| 或 |等等,利用与、或、管道命令来执行其他命令(可以涉及到很多linux命令行技巧)。还有一个偏门,当$arg被escapeshellcmd处理之后,不能越出这个外部程序的范围,可以看看这个程序自身是否有"执行外部命令"的参数或功能,比如linux下的sendmail命令自带读写文件功能,可以用来写webshell。

9.3 第三种情况

控制的点是一个参数,也同样可以利用与、或、管道来执行其他命令,情景与二无异。

9.4 第四种情况

这种情况压力大一点,有双引号包囊。如果引号没有被转义,可以先闭合引号,称为第三种情况后按照第三种情况来利用,如果引号被转义(addslashes),也不必着急。linux shell环境下双引号中间点变量也是可以被解析点,可以在双引号内利用反引号执行任意命令id

9.5 第五种情况

这是最难受的一种情况了,因为单引号内只是一个字符串,要先闭合单引号才可以执行命令。如:system("/bin/prog -p=‘aaa’ | id")。危害自然不言而喻,执行命令可以读写文件、反弹shell、获得系统权限、内网渗透等。

在漏洞检测中,除了有回显的命令注入(比如执行dir命令或者cat读取系统文件);还可以使用盲打的方式,比如curl远程机器的某个目录(看access.log),或者通过dns解析的方式获取到漏洞机器发出的请求。

0x10 命令执行漏洞的危害

  • 继承web服务器程序的权限,去执行系统命令或读写系统文件
  • 反弹内外shell
  • 控制整个web服务器
  • 辅助内网渗透
  • 恶意木马被种植
  • 挂马、钓鱼
  • 敏感信息泄漏

0x11 命令执行漏洞的防御(修复)

  • 尽量少用执行命令的函数或者直接禁用,在php下禁用高危系统函数,找到php.ini,查找disable_functions,添加禁用的函数名
  • 参数值尽量使用引号包括,并在拼接前调用addslashes函数进行转义
    在使用动态函数之前,确保使用的函数是指定的函数之一
  • 在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
  • 对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤。使用 escapeshellarg函数处理相关参数。该函数会将用户引起参数或命令结束的字符进行转义,如单引号"’’“会被转义为”’",双引号"""“会被转义为”"",分号";“会被转义为”;",这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中包括的单引号或双引号,使其无法对当前执行进行截断,实现防范注入攻击的目的。
  • 不执行外部的应用程序或命令。尽量使用自定义函数或函数库实现外部应用程序或命令的功能。在执行system、eval等命令功能的函数前,要确认参数内容。
  • 使用safe_mode_exec_dir指定可执行的文件路径。将php.ini文件中的safe_mode设置为On,然后将允许执行的文件放入一个目录,并使用safe_mode_exec_dir指定这个可执行的文件路径。这样,在需要执行相应的外部程序时,程序必须在safe_mode_exec_dir指定的目录中才会允许执行否则将失败。

0x12 示例

windows使用phpstudy集成环境,在网站根目录下建立php文件(自定义)。

<?phpecho "please input get args cmd!";echo "<pre>";   //格式化页面if(isset($_GET["cmd"])){system($_GET["cmd"]);}echo "</pre>";  //是页面更加直观,起换行作用。去掉的话,显示信息不会换行。下面做对比。
?>


输入命令:?cmd=ipconfig

现在修改一下代码,看看

的作用是什么。在URL前面加个view-source:也是可以的


对指定目录执行ping命令
<?phpecho "<pre>";   //格式化输出$arg = $_GET['cmd'];    //GET方式执行命令if($arg){system("ping $arg");}echo "</pre>";

打开cmd ,执行以下命令

ping www.baidu.com
ping 111 & ipconfig
ping 127.0.0.1 && ipconfig
ping 127.0.0.1 | ipconfig
ping 111 || ipconfig

0x13 总结

如有不对之处请各位师傅指正!

0x14 了解更多安全知识

欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!

基础知识点|命令执行漏洞相关总结相关推荐

  1. 闲人的命令执行漏洞基础学习1

    命令执行漏洞是指攻击者可以随意执行系统命令. 在window和Linux系统下: && & || |符号可以作为命令连接符使用. 如ping url && ne ...

  2. Tomcat- AJP协议文件读取/命令执行漏洞(CVE-2020-1938 / CNVD-2020-10487)

    CVE-2020-1938 1.概述 1.1 tomcat概述 1.2 gostcat概述 - 漏洞概述 2. 漏洞成因 2.1 前置基础 2.1.1 Tomcat Connector(连接器) 2. ...

  3. WEB漏洞—RCE 代码及命令执行漏洞

    什么是RCE? 指的是远程命令/代码执行(remote command/code execute) 在 Web 应用中有时候程序员为了考虑灵活性.简洁性,会在代码调用代码或命令执行函数去处理.比如当应 ...

  4. 绕过WAF运行命令执行漏洞的方法大全

    文章目录 **前言** **一.windows下** 二.进入linux 三.一个有趣的例子 总结 前言 作者:掌控安全-桐镜 今天发散一下思维,聊聊关于命令执行漏洞绕过过滤的方法,让我们一起由浅入深 ...

  5. RCE漏洞以及命令执行漏洞

    目录 概念 代码执行和命令执行区别 代码执行漏洞特点 命令执行漏洞特点 漏洞形成条件 漏洞产生地方 如何检测漏洞 白盒情况下 黑盒情况下 防御方案 变量过滤或固定 WAF产品防火墙防护 敏感函数禁用 ...

  6. 简谈命令执行漏洞绕过过滤

    原文: https://mp.weixin.qq.com/s?__biz=MzUyODkwNDIyMg==&mid=2247503891&idx=1&sn=791096c5cb ...

  7. 【web安全】——命令执行漏洞(RCE)详解

    作者名:Demo不是emo  主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷 座右铭:不要让时代的悲哀 ...

  8. 代码审计-dubbo admin =2.6.1远程命令执行漏洞

    前置 输入材料 安全目标和需求 架构分析 供应链安全 源代码审查 依赖结构矩阵(Dependency Structure Matrices,DSM) 数据流 信任边界 数据存贮 威胁列表 otter ...

  9. Fastjson远程命令执行漏洞总结

    1.FastJson 简介 fastjson.jar包原始下载地址:https://github.com/alibaba/fastjson fastjson用于将Java Bean序列化为JSON字符 ...

  10. python直接执行代码漏洞_修复Python任意命令执行漏洞

    Author:JoyChou@美丽联合安全 Date:20180605 1. 前言 今天遇到一个不好做白名单的Python命令执行漏洞修复的问题.由于是shell=True导致的任意命令执行,一开始大 ...

最新文章

  1. 合伙人分开的一点思考
  2. 如何确定foreach循环中的第一次和最后一次迭代?
  3. R语言包在linux上的安装等知识
  4. PowerDesigner使用教程 —— 概念数据模型详解
  5. SpringMVC中 -- @RequestMapping的作用及用法
  6. Linux搭建oracle数据库
  7. 微信小程序页面跳转、逻辑层模块化
  8. Python一亿以内的素数个数_Python 计数质数
  9. Python使用超高效算法查找所有类似123-45-67+89=100的组合
  10. 三、RabbitMQ消息发布时的权衡
  11. A1113 | Integer Set Partition (25)
  12. 谷歌浏览器无法登陆问题
  13. oracle查询日志空间大小,ORACLE 管理 日志与空间
  14. 【SpringBoot项目实战+思维导图】瑞吉外卖①(项目介绍、开发环境搭建、后台登陆/退出功能开发)
  15. 最新阿里云服务器和GPU服务器长期优惠活动价格表
  16. 前缀学习完结篇 第三课上
  17. 智学网显示服务器开小差了,怎样才能进入智学网,检视孩子的学习成绩?
  18. 戴尔 DELL R720 LED指示灯错误代称含义
  19. Java-JFR-民间指南---事件详解---jdk-ThreadAllocationStatistics
  20. urlencode的使用

热门文章

  1. c语言中平方根怎么用算法表示,C语言中平方根实现的详细分析
  2. BZOJ 3654: [湖南集训]图样图森破 SA
  3. MATLAB解二元二次方程+画图 = 画隐式方程的图像
  4. 如何利用DTM预览功能来验证新版本的配置是否正确?
  5. 黑马程序员-微信小程序-原生框架——购物平台-分类页面
  6. 中国广电即将放号,感受到压力的中国移动率先推出19元5G套餐
  7. Arcgis报错 ERROR 999999的解决方法汇总
  8. [状压dp][BZOJ3717][PA2014]Pakowanie
  9. 怎么打不开电脑计算机呢,双击我的电脑打不开怎么办
  10. 荆门市建设企业网站多少钱,荆门口碑好的网站建设多少钱