环境
本次使用的测试靶场为:DVWA。 下载链接:https://github.com/digininja/DVWA
操作系统:windows10
什么是命令注入漏洞
命令注入漏洞:是一种安全漏洞,攻击者通过将恶意命令注入到应用程序的输入参数中,从而执行非法操作或获取未授权的访问权限。该漏洞通常出现在Web应用程序中,因为Web应用程序通常需要将用户输入的数据作为命令或查询语句的一部分来执行操作。
攻击者可以利用命令注入漏洞执行各种恶意操作,包括但不限于以下情况:
- 执行系统命令:攻击者可以在受感染的应用程序上执行系统命令,例如在服务器上创建、修改或删除文件,以及执行其他系统管理任务。
- 访问敏感数据:攻击者可以通过注入恶意命令来访问数据库或其他应用程序中的敏感数据,例如用户名、密码或其他机密信息。
- 控制应用程序:攻击者可以通过执行恶意命令来完全控制受感染的应用程序,并进行任意操作,例如更改应用程序的设置、添加或删除用户,或者修改应用程序的行为。
为了防止命令注入漏洞,开发人员应该对应用程序中接受用户输入的地方进行必要的验证和过滤,使用参数化查询或预编译语句来避免将用户输入作为命令的一部分执行。另外,应该限制应用程序的权限,以减少攻击者利用漏洞所能执行的恶意操作。
示例
import os
def execute_command(command):
os.system(command)
user_input = input("请输入要执行的命令:")
execute_command(user_input)
在上面的示例中,用户可以输入任意命令作为user_input
,然后被直接传递给os.system()
函数,造成了命令注入漏洞。攻击者可以输入危险的命令来执行不受限制的操作。
实践出真知
(注 在dvwa中分为:low、medium、high、impossible,分别对应:低、中、高、安全四个级别)
low#
程序源码:
发现只做了操作系统确认 并执行ping命令,没有做符号或者系统命令限制,直接执行 ping..命令
由图可知,发现执行ping命令后,再次执行了dir命令
因windows编码与dvwa并不兼容,所以出现乱码情况,建议使用Linux系统搭建。
medium#
源码分析,一波,发现黑名单(set blacklist)处做了符号限制,限制了 && 和 ; 这两个符号
测试一波,发现无法执行。
尝试把限制的两个符号替换成其他分割号,比如 ;、&、|、||,;;、(、)等等。 使用 | 分隔符来试试看,发现可以成功执行
high#
老样子,源码分析,发现能用做分隔的符号,都被禁用。
但细心的网友就会发现 在 | 后面多了一个空格 如图,证明这个地方过滤掉的是|+空格。 “| ”而不是“|”。
话不多说,测试一波。
两图对比发现,有|号后面有空格的无法执行,而没有空格的,可以执行成功。
impossible#
源码:
发现使用stripslashes函数去掉了反斜杠的处理,做了token防护还有使用is_numeric函数做了是否为数字,还做了严格的语句格式限制,列如:127.0.0.1才会被执行,由此不存在命令注入漏洞。
总结
总的来说,命令注入漏洞是一种常见的安全漏洞,需要开发者在编写代码时注意对用户输入的数据进行过滤和验证,以防止用户恶意执行任意命令。