什么是命令注入,命令注入如何避免?

1、什么是命令注入

        Command Injection,即命令注入攻击,是指由于嵌入式应用程序或者 web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。

        在命令注入的漏洞中,最为常见的是PHP的命令注入。PHP命令注入攻击存在的主要原因是Web应用程序员在应用PHP语言中一些具有命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而造成的。例如,当黑客提交的数据内容为向网站目录写入PHP文件时,就可以通过该命令注入攻击漏洞写入一个PHP后门文件,进而实施进一步的渗透攻击。

原理:web应用在调用这些函数执行系统命令的时候,在没有做好过滤用户输入的情况下,如果用户将自己的输入作为系统命令的参数拼接到命令行中,就会造成命令注(命令执行)的漏洞。

2、命令注入攻击是如何形成的?

        嵌入式应用程序或者 web应用程序有时需要调用一些系统命令的函数,如linux C中的system(),exec(),shell-exec() 等等,当用户能够控制这些函数中的参数时,就可以将恶意参系统命令拼接到正常命令中,从而造成命令注入攻击设备系统:

命令注入的形成需要如下三个条件:

        1)使用了内部调用shell的函数:system(),exec()等
        2)将外界传入的参数没有足够的过滤,直接传递给内部调用shell的函数
        3)参数中shell的元字符没有被转义

危害:继承嵌入式应用程序或者 web应用程序的权限去执行系统命令读写执行文件,导致系统有可能会被恶意攻击或者泄露系统用户信息。

3、命令注入相关的特殊字符

符号说明
;前后命令依次执行注意前后顺序,若更变目录,则必须在“一句”指令内
||前命令执行失败后才执行后命令-
&&前命令执行成功后才执行后命令-
&前台执行后任务,后台执行前任务如 a&b&c 则显示c的执行信息,a b在后台执行
|管道,只输出后者的命令当第一条命令失败时,它仍然会执行第二条命令
``(反引号,仅linux)即命令替换,echo `date`,输出系统时间使用反引号运算符的效果与函数shell_exec()相同,但在激活了安全模式或者关闭了shell_exec()时是无效的
$(command)这是命令替换的不同符号。与反引号效果一样。echo $(date),输出系统时间.按理说更推荐用这种方法,而不是反引号。

4、命令注入解法策略:

        1)校验外部数据命令:在执行system、eval等命令执行功能的函数前,确定参数内容。

                a. 对数据的合法性进行校验(不是校验是否包含命令注入的特殊字符):比如IP地址,直接校验IP地址的格式(inet_aton() ); 如果是url域名,则从url域名中获取IP地址(gethostname(),inet_ntop() )后,在进行IP格式校验,若获取失败或者校验失败,则认为数据非法。

               b. 使用正则表达式对外部数据命令进行校验:白名单过滤?

        2)使用白名单安全过滤:比较适用于固定不变的命令或者数据(校验包含哪些目标字符,而不是定义不能包含什么字符)或者直接将命令定义为宏,然后使用system() 系统调用。

        3)使用黑名单过滤命令:黑名单机制还还是有可能会绕过系统校验,进行命令注入;所以不建议使用

        4)使用 exec系列族 函数代替 system() 系统调用函数,选择不调用系统命令的实现方法、避免使用内部调用shell的函数、不将外界传入的字符串传递给命令行参数

        5)使用安全的函数对传递给系统命令的参数进行转义
        6)将应用程序的权限降到最低
       7)给web服务器系统及使用的中间件及时打上安全补丁

        8)使用escapeshellarg函数处理相关参数。Escapeshellarg函数会将任何引起参数或命令结束的字符进行转义,如单引号“’”会被转义为“\’”,双引号“””会被转义为“\””,分号“;”会被转义为“\;”,这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中所包含的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的。

命令注入示例:

这里写图片描述

 

https://blog.csdn.net/extremebingo/article/details/81276087

https://www.cnblogs.com/duk-blog/p/14292999.html

  • 12
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值