渗透测试技术----常见web漏洞--命令执行原理及防御

一、命令执行漏洞介绍

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语言来说,不能完全控制的危险函数最好不要使用

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值