什么是命令注入,命令注入如何避免?-程序员宅基地

技术标签: 工作问题  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/llzhang_fly/article/details/119685242

智能推荐

(狼人杀,骑士飞行棋,歹徒逃亡)_"jue_se[1].name = \"普通人 \"; jue_se[2].name = \"坏人 -程序员宅基地

文章浏览阅读85次。在济宁市任城区的五年级的小学生2022/9/3_"jue_se[1].name = \"普通人 \"; jue_se[2].name = \"坏人 \"; jue_se[3].name = \"医生"

centos7 x86_64 下通过qemu-user-static 运行arm64的docker镜像_centos qemu-user-static-程序员宅基地

文章浏览阅读5.1k次。wget https://download.qemu.org/qemu-5.2.0.tar.xz1、binfmt支持#重置binfmtdocker run --rm --privileged multiarch/qemu-user-static --reset -p yes #设置binfmtdocker run --rm --privileged multiarch/qemu-user-static -p yes 确认是否成功[root@localhost binfmt_misc]#_centos qemu-user-static

Python绘制地图神器folium入门_folium pyecharts-程序员宅基地

文章浏览阅读2.1w次,点赞64次,收藏451次。文章目录一、简介二、安装方法三、主要功能3.1 各级别地图3.1.1 世界地图3.1.2 国家地图3.1.3 市级地图3.2 地图形式3.3 在地图上标记3.3.1 普通标记3.3.2 点击获取经纬度3.3.3 动态放置标记3.4 热力图绘制3.5 密度地图绘制3.6 自定义地图区域3.6.1 只绘制边界,不添加数据3.6.2 绘制边界,添加数据四、竞品对比与优劣势五、参考资料一、简介想通过 ..._folium pyecharts

PostgreSQL_org.postgresql-程序员宅基地

文章浏览阅读1k次。PostgreSQL本文章主要是对 PostgreSQL 有一个基本的了解,如想了解更多,请查看官方文档 : 直链1. PostgreSQL概念说明1.1 PostgreSQL 是什么当你在看这篇文章的时候,应该是对 PostgreSQL 了解过的,那么 什么是 PostgreSQL 呢 ?PostgreSQL 不就是数据库嘛!!!!!PostgreSQL 确实是数据库,但是 PostgreSQL 是什么类型的数据库呢 ??emmmm~~PostgreSQL 是以加州大学伯克利分校_org.postgresql

文本相似度-bm25算法原理及实现_utils.get_sentences()参数-程序员宅基地

文章浏览阅读4.1k次。原理BM25算法,通常用来作搜索相关性平分。一句话概况其主要思想:对Query进行语素解析,生成语素qi;然后,对于每个搜索结果D,计算每个语素qi与D的相关性得分,最后,将qi相对于D的相关性得分进行加权求和,从而得到Query与D的相关性得分。BM25算法的一般性公式如下:其中,Q表示Query,qi表示Q解析之后的一个语素(对中文而言,我们可以把对Query的分词作为语素分析,每个词看成语素..._utils.get_sentences()参数

Java-JDK1.8新增的时间类API_temporaladjusters.nextorsame(dayofweek.sunday)-程序员宅基地

文章浏览阅读237次。一.LocalDate、 LocalTime、 LocalDateTime概述LocalDate、 LocalTime、 LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。注: ISO-8601日历系统是国际标准化组织制定的现代公民的日期..._temporaladjusters.nextorsame(dayofweek.sunday)

随便推点

攻防世界--Web_php_unserialize_unserialize脚本-程序员宅基地

文章浏览阅读849次。攻防世界--Web_php_unserialize考点WP__wakeup的绕过正则表达式绕过PHP脚本和注意事项(重要)参考连接考点__wakeup魔术方法的绕过O:数字正则表达式的绕过php代码编写WP<?php class Demo { private $file = 'index.php'; public function __construct($file) { $this->file = $file; } fun_unserialize脚本

用户需求分析是什么?重难点是什么?_用户需求的主要困难有哪些-程序员宅基地

文章浏览阅读5.1k次。用户分析需要考虑以下几个方面的内容:第一:受众群体分析。用户需求分析的第一个内容是受众群体分析,通常来说,不同类型的产品往往都有明确的用户定位,通过受众群体的数据分析能够发现定位与实际运营之间的差距,从而调整运营策略。受众群体的数据分析越详细越好,因为受众群体往往关系到产品未来的发展速度和影响面。第二:功能利用率分析。功能利用率分析主要是体现产品的核心价值,通过功能利用率的分析可以直观的体现出..._用户需求的主要困难有哪些

tomcat无法访问MySQL_JSP在tomcat服务器下无法连接MySql问题解决方法-程序员宅基地

文章浏览阅读1k次。我连的是MySQL数据库,但是在服务器下运行jsp文件时会出现如下的状况:控制台报错:com.mysql.jdbc.Driver即不能找到驱动程序,通过我的一次次试验,终于得到解决首先我的代码编写是没有问题的,而且我已经在eclipse下的jar库中导入了jdbc驱动文件。直接运行java应用程序运行java应用程序,结果如图所示,成功连接上数据库并打印输出了teacher表中所有数据。jsp中的..._tomcat对于jsp操作mysql数据库在页面不显示的问

Angular cdk 学习之 drag-drop_angular drag-drop-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏10次。&nbsp; &nbsp; &nbsp; &nbsp;Angualr drag-drop里面的功能能让我们非常方便的处理页面上视图的拖拽(自由拖拽、列表排序拖拽、列表之间拖拽)问题。推荐大伙儿直接看官网,因为下面的内容绝大部分内容包括例子都来源于官网 https://material.angular.io/cdk/drag-drop/overview。一直认为官网才是最好的文档。&nbsp; &..._angular drag-drop

Android boot.img 结构_mkbootimg --base 0x00200000-程序员宅基地

文章浏览阅读678次。转自:http://www.linuxidc.com/Linux/2011-03/33303.htmAndroid 的boot.img 包括 boot header,kernel, ramdisk首先来看看Makefile是如何产生我们的boot.img的:boot镜像不是普通意义上的文件系统,而是一种特殊的Android定制格式,由boot header,压缩的内核,ramdisk以_mkbootimg --base 0x00200000

gitlab-runner安装注册_linux gitlab-runner shared specifc-程序员宅基地

文章浏览阅读1.3k次。# gitlab-runner registerRuntime platform arch=amd64 os=linux pid=28542 revision=8fa89735 version=13.6.0Running in system-mode. Enter the..._linux gitlab-runner shared specifc