一、命令执行漏洞介绍
1.命令执行漏洞简介
命令执行漏洞时指服务器没有对执行的命令进行过滤,用户可以随意执行系统命令,命令执行漏洞属于高危漏洞之一,也属于代码执行的范围内。
2.命令执行漏洞的原理
应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用System()、exec()、shell_exec()、passthru()、popen()、proc_popen()等函数可以执行系统命令。当攻击者可以控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击。命令执行主要是对输入的命令没有进行过滤,攻击者可以使用&、&&、|、||等命令拼接自己想要查看的信息的相关命令,这样,连同攻击者的命令就会一块执行,这样就造成了命令执行漏洞。
3.命令执行漏洞产生的原因
(1):代码过滤不严或者无过滤。(没有过滤&、&&、|、||等连接符)
(2):系统漏洞造成的命令执行,bash破壳漏洞,该漏洞可以构造环境变量的值来执行具有攻击力的脚本代码,会影响到bash交互的多种应用,如http、ssh和dhcp等。
(3):调用第三方组件,如php(system()、shell_exec()、exec()、eval()),java(struct2),thinkphp(thinkphp是一个老牌的php)(比如一句话木马<?php @eval($_GET[cmd]); ?>)
4.命令执行常用的管道符
- Windows
(1):"|":无论前面的命令是否执行成功,直接执行后面的命令(并且只执行后面的命令,不显示前面的命令执行结果)。
(2):"||":如果前面的命令执行成功,则不执行后面的命令;如果前面的命令执行失败,则会执行后面的命令。
(3):"&":如果前面的命令执行成功,则会接着去执行后面的语句;如果前面的语句执行失败,还会执行后面的语句。
(4):"&&":如果前面的命令执行成功,后面的命令也会执行;如果前面的命令执行失败,则会直接报错。- Linux
(1):";":执行完前面的命令再执行后面的命令。如果前面的命令执行成功,后面的命令也会执行;如果前面的命令执行失败,则会执行后面的命令。
(2):"|":无论前面的命令是否执行成功,直接执行后面的命令(并且只执行后面的命令,不显示前面的命令执行结果)。
(3):"||":如果前面的命令执行成功,则不执行后面的命令;如果前面的命令执行失败,则会执行后面的命令。
(4):"&":如果前面的命令执行成功,则会接着去执行后面的语句;如果前面的语句执行失败,还会执行后面的语句。
(5):"&&":如果前面的命令执行成功,后面的命令也会执行;如果前面的命令执行失败,则会直接报错。
5.命令执行中常用的命令
- Windows
dir----查看文件目录
ipconfig----查看Windows的IP地址
arp -a----查看ARP缓存表
calc----在命令行打开计算器
regedit----打开注册表
netstat -ano----查看开放的端口信息- Linux
cat /etc/passwd----查看passwd文件
id----查看该用户的ID号
groups----查看用户所属的组
cat /etc/group----查看组信息
whoami----查看当前用户
pwd----查看当前路径
uname -a----查看主机信息
cat /etc/issue----查看主机的配置信息
netstat -pantu----查看开放的端口信息
netstat -nr----查看路由信息
二、命令执行漏洞实例
注意:以下测试是基于DVWA上进行的!
Windows
1."|":无论前面的命令是否执行成功,直接执行后面的命令(并且只执行后面的命令,不显示前面的命令执行结果)
127.0.0.1|dir(前面的命令执行成功,但是只显示后面的命令结果)
pwd|dir(前面的命令执行失败,但却执行了后面的命令)
2."||":如果前面的命令执行成功,则不执行后面的命令;如果前面的命令执行失败,则会执行后面的命令
127.0.0.1|dir(前面的命令执行成功,只显示前面的结果)
dir||ipconfig(前面的命令执行失败,只执行了后面的命令)
3."&":如果前面的命令执行成功,则会接着去执行后面的语句;如果前面的语句执行失败,还会执行后面的语句
127.0.0.1&dir(前面的命令执行成功,两条命令都执行)
ipconfig&dir(前面的命令执行失败,只执行了后面的命令)
4."&&":如果前面的命令执行成功,后面的命令也会执行;如果前面的命令执行失败,则会直接报错
ipconfig&&dir(前面的命令执行失败,直接报错)
127.0.0.1&&dir(前面的命令执行成功,后面的命令也会执行)
Linux
1.";":执行完前面的命令再执行后面的命令。如果前面的命令执行成功,后面的命令也会执行;如果前面的命令执行失败,则会执行后面的命令
127.0.0.1;pwd(前面的命令执行成功,后面的命令也会执行成功)
ls;pwd(前面的命令执行失败,只执行后面的命令)
2."|":无论前面的命令是否执行成功,直接执行后面的命令(并且只执行后面的命令,不显示前面的命令执行结果)。
127.0.0.1|pwd(前面命令执行成功,执行后面命令,只显示后面命令执行的结果)
ls|pwd(前面命令执行失败,执行后面命令,只显示后面命令执行的结果)
3."||":如果前面的命令执行成功,则不执行后面的命令;如果前面的命令执行失败,则会执行后面的命令。
127.0.0.1||pwd(前面的命令执行成功,后面的命令不会执行)
ls||pwd(前面的命令执行失败,然后会执行后面的命令)
4."&":如果前面的命令执行成功,则会接着去执行后面的语句;如果前面的语句执行失败,还会执行后面的语句。
127.0.0.1&pwd(前面的命令执行成功,接着执行了后面的命令)
ls&pwd(前面的命令执行失败,还是会执行后面的命令)
5."&&":如果前面的命令执行成功,后面的命令也会执行;如果前面的命令执行失败,则会直接报错。
127.0.0.1&&pwd(前面的命令执行成功,后面的命令也执行成功)
ls&&pwd(前面的命令执行失败,直接报错)
三、防御命令执行的方法
1.尽量不要使用命令执行函数,尽量不要执行外部命令
2.使用自定义函数或者函数库来代替外部命令的功能
3.客户端提交的变量在进入执行命令函数钱要做好过滤和检测
4.在使用动态函数之前,确保使用的函数是指定的函数之一
5.对PHP语言来说,不能完全控制的危险函数最好不要使用