概念
在Web应用中,有时候会将用户输入作为命令执行函数(如PHP中system、exec、shell_exec等)的参数或参数的一部分,如果对用户输入未加过滤或过滤不充分,就可能导致攻击者提交恶意构造的参数破坏命令结构,从而达到执行恶意命令的目的。
一个简单的例子
前端Web页面:
用户在输入框中输入114.114.114.114
,点击Submit
按钮,等待几秒,网页就会显示ping目标地址的结果。
后端PHP(Windows10环境):
$target
是用户输入的IP地址。如果用户输入114.114.114.114 && hostname
,就会执行命令ping 114.114.114.114 && hostname
,返回服务器的主机名。
常用命令注入的方法
可以用口诀321
来记忆:
3
:
有三种符号
在Windows和Linux下功能是相同的:
114.114.114.114 && hostname 执行ping成功后,才执行hostname,否则不执行hostname
x || hostname 执行ping不成功,才执行hostname,否则不执行hostname
114.114.114.114 | hostname 通过将ping的标准输出作为hostname的标准输入,执行hostname,这里hostname不需要输入,因此看不到效果
2
:
实现同一功能,Windows和Linux分别使用不同的符号(共两种符号
):
114.114.114.114 & hostname 先执行ping,然后执行hostname
114.114.114.114; hostname 先执行ping,然后执行hostname
1
:
有一种功能
是Linux独有的:
114.114.114.114 & hostname 后台运行ping,同时执行hostname
命令盲注
命令盲注指的是注入的命令并不会返回执行结果,因此我们无法知道命令是否执行成功,以及命令的输出是什么。
这里介绍一种通过命令执行的时间猜测主机名的方法。
sleep $(hostname | wc -c)
这里的$()
是Bash命令置换的语法,执行时会首先执行括号内的命令hostname | wc -c
,然后将执行结果作为sleep
的参数,执行sleep
。
根据sleep的时间,可以猜出主机名的长度。
sleep $(hostname | cut -c 1 | tr a 5)
如果sleep了5s,说明主机名的第一个字符就是a,以此类推,就可以猜出完整的主机名。