浅谈命令执行

浅谈命令执行

  随着IT技术的飞速发展,“计算机”的形态多种多样(大型服务器、PC机、智能终端等等,以及运行其上的形形色色的应用),不同角色的人在计算机系统中所扮演的角色各异(开发者、维护者、高级用户、普通用户、管理者等等)。这些场景中,数据甚至指令通常都无法事先固化,需要在运行的过程中动态输入。如果这两者混杂在一块,没有经过良好的组织,就会被黑客加以利用,成为一种典型的攻击方式——命令注入。

漏洞原理

  部分Web应用程序提供了一些命令执行的操作,例如,想要测试http://www.example.com是否可以正常连接,那么Web应用程序底层就很可能去调用系统操作命令,如果此处没有过滤好用户输入的数据,就很有可能形成系统命令执行漏洞。程序中因为某些功能需要执行系统命令,并通过网页传递参数到后台执行。然而最根本的原因是没有对输入框中的内容进行过滤,导致出现该漏洞,正常情况下输入框只能接收指定类型的数据。

1、代码注入
  eval()函数可以把字符串按照PHP代码来执行,换句话说,就是可以动态地执行PHP代码,使用eval函数需要注意的是:输入的字符串必须是合法的PHP代码,且必须以分号结尾。
例:

<?php
$myvar = "varname";
$x = $_GET['arg'];
eval("\$myvar = $x;");
?>

攻击者可以通过如下Payload实施代码注入:

/index.php?arg=1;phpinfo()

2、命令注入
PHP中可以使用下列5个函数来执行外部的应用程序或函数:
  system()、exec()、passthru()、shell_exec()。

例:

<?php
$command = $_REQUEST["command"];
system($command);
?>

攻击者通过以下的payload实施攻击

vulnerable.php?command=ls

注:使用PHP.EXE传递参数时,如果有空格,一般在windows下使用双引号(""),Linux下使用单引号(’)括起来,否则将无法正常执行。

3、动态函数调用
例:

<?php
$fun = $_GET['fun'];
$par = $_GET['par'];
$fun($par);
?>

这样可以动态调用函数,但也易被黑客利用,如,

http://www.example.com/funtion.php?fun=system&par=net user

最终的执行函数为 system(“net user”),查看系统用户。

4、PHP函数代码执行漏洞
  在PHP中,代码执行漏洞出现较多,像preg_replace(),ob_start(),array_map()等函数都存在代码执行漏洞。

例:

<?php
$arr = $_GET['arr'];
$array = array(1,2,3,4,5);
$new_array = array_map($arr,$array);
?>

攻击者可输入如下URL:

http://www.example.com/function.php?arr=phpinfo

发现phpinfo函数被执行。

漏洞影响

命令注入漏洞可以使攻击在受攻击的服务器上执行任意的系统命令。
例:如果服务器平台是windows可以使用netuser查看用户名;
例:如果服务器平台是Linux可以使用who查看当前用户;
如果网站服务是使用最高系统权限运行,则可以执行任意命令
任意执行系统命令,恶意木马被种植,挂马,钓鱼,敏感信息泄露

漏洞例子

在这里我还是使用DVWA靶场中的例子简单说明一下,,,,,
首先还是low级别,题目要求输入IP,直接输入IP
在这里插入图片描述
从页面的功能来看,这个一个web的ping 工具,在页面的输入框输入ip地址即可进行ping测试
点击页面右下角“View Source”查看源代码
在这里插入图片描述
以上代码中我们可以看出,
$target = $_REQUEST[ ‘ip’ ];直接从网页接收文本框中输入的内容
却没有对变量的数据类型和内容做任何限制
(只是判断了下如果是windows 直接ping ,如果是linux直接ping -c 3 也就是3 此后停止,因为linux 下不加-c 3 会一直ping)
导致该变量可以接收任意类型的数据和内容
在操作系统中使用“&&”和“;”连接符,可以在一行命令中执行多个系统命令
结合这二点,可以构造一条命令,来执行想要的操作
windows 和linux 下可以直接用&&和;来执行多条命令
使用字符;分号进行测试,输入命令:127.0.0.1;pwd
在这里插入图片描述
使用 “&&”字符进行测试,输入命令:127.0.0.1&&netstat –nlpt,改变&&后面的命令也是可以的
在这里插入图片描述
ok,low级别到此为止了
接下来继续medium级别的测试,查看源码:
在这里插入图片描述
在这里看到,很明显对“&”和“;”这两个字符做了过滤,所以ip地址后面跟着的命令也不可以执行
因此这个安全级别的安全性比上一个low安全级别高些
但是这并不代表“很安全”,在命令执行下也有“||”风险
如果||的前面命令执行失败则执行|| 后面的命令
使用语句:127.0.0.0 || netstat -tlp
语句表示如果||的前面命令执行失败则执行||后面的命令
可以看见命令被成功执行
在这里插入图片描述
ok,接下来修改级别为high
使用刚刚的语句,发现提示IP地址错误
在这里插入图片描述
查看一下源码,与之对比
在这里插入图片描述
仔细查看代码,可以看到这次把ip 地址的每一个的“.”进行严格的判断
“.”后的必须是数字才能执行,这个至今未能突破

漏洞防范

尽量不要使用系统执行命令,以免造成不必要的危害
在执行命令函数、方法前,变量一定要做好过滤,对敏感字符进行转义
使用动态函数之前,确保使用的函数是指定的函数,避免使用用户输入的函数
对PHP语言来说,不能完全控制的危险函数最好不要使用

思考总结

  DVWA靶场上该漏洞产生原因是未对输入框中的内容做代码过滤,正常情况下输入框只能接收指定类型的数据。如果没有进行过滤,攻击者可以在受攻击的服务器上执行任意的系统命令。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值