远程命令/代码执行漏洞
一、远程命令执行原理:
很多应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如很多网络设备的web管理界面上一般会有一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器 。
现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞
二、远程代码执行原理:
同样的道理,因为需求设计,后台有时也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
三、命令执行一般出现那些地方?
只要带参数的地方都可能出现 常见的路由器、防火墙、入侵检测、动化运维平台
四、系统命令拼接方式 :
| 管道符,前面命令标准输出,后面命令的标准输入。例如:help |more
& commandA & commandB 先运行命令A,然后运行命令B
|| commandA || commandB 运行命令A,如果失败则运行命令B
&& commandA && commandB 运行命令A,如果成功则运行命令B
ping命令案例
# 正常情况下,web输入框要求输入ip地址,回车即可开始ping
192.168.1.1
# 给ip后拼上其他命令
192.168.1.1 & whoami
# 整体命令变为
ping 192.168.1.1 & whoami
五、需要注意的函数
#关于执行系统命令漏洞需要注意的函数
assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``
#关于执行系统命令漏洞需要注意的函数
eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13
六、解决方案:
假定所有输入都是可疑的 1. 尝试对所有输入提交可能执行命令的构造语句进行严格的检查或者控制外部输入 系统命令执行函数的参数不允许外部传递。 2. 不仅要验证数据的类型,还要验证其格式、长度、范围和内容。 3. 不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。 4. 对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出 即使在输入做了编码等操作,在各处的输出点时也要进行安全检查。