下面我们开始分析DVWA中的Command Execution命令执行漏洞。
首先仍是将DVWA Security设置为Low,选择Command Execution,这里在文本框中输入一个IP,点击Submmit提交便可以执行ping命令。
点击“View Source”查看网页源码。
可以看到,这里的数据是以post方式提交过来的,然后被赋值给了变量$target。
接下来有一个if语句,判断条件是“stristr(php_uname(‘s‘), ‘Windows NT‘)”,这是用来判断当前的系统是否是Windows,因为Windows和Linux下的ping命令执行参数是不同的。
再下面是将函数“shell_exec( ‘ping ‘ . $target )”的值赋值给变量$cmd,并输出$cmd的值,其实也就是在执行“shell_exec( ‘ping ‘ . $target )”函数,因而shell_exec()函数就是这里的核心了。
shell_exec()函数的作用就是可以在PHP中去执行操作系统命令,因而如果不对用户输入的命令进行过滤,那么理论上就可以执行任意系统命令,也就相当于直接获得了系统级的Shell,因而命令包含漏洞的威力相比SQL注入要大多了。
比如我们在文本框中输入“127.0.0.1 | net user”,实际上就是通过管道符“|”去执行了“net user”命令。明白了原理之后,那么我们完全可以继续执行“127.0.0.1 | net user test 123 /add”、“127.0.0.1 | net localgroup administrators test /add”命令,从而拿下整个服务器。
在DOS下允许同时执行多条命令的符号主要有以下几个:
- “|”:前面命令输出结果作为后面命令的输入内容;
- “||”:前面命令执行失败的时候才执行后面的命令;
- “&”:前面命令执行后接着执行后面的命令;
- “&&”:前面命令执行成功了才执行后面的命令。
如果是Linux系统,还可以使用分号(;),也可以同时执行多条命令。
另外还可以使用重定向(>)在服务器中生成文件,或是使用(<)从事先准备好的文件读入命令等。
最后,大家可以分别用上面这些符号,自己来构造语句去执行相应的命令。