rce-命令执行

1

漏洞

一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。 现在很多的企业都开始实施自动化运维,大量的系统操作会通过”自动化运维平台”进行操作。在这种平台上往往会出现远程系统命令执行的漏洞。 远程代码执行 同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。

系统命令执行函数

1.system() 将字符串作为OS命令执行,自带输出功能。
2.passthru() 将字符串作为OS命令执行,不需要输出执行结果,且输出全部的内容。
3.exec() 将字符串作为OS命令执行,需要输出执行结果,且它只会输出最后一行的内容。
4.shell_exec() 将字符串作为OS命令执行,需要输出执行结果,且输出全部的内容。
5.popen()/proc_open() 该函数也可以将字符串当作OS命令来执行,但是该函数返回的是文件指针而非命令执行结果。该函数有两个参数。

1
2
3
4
5
6
<?php
$cmd = $_POST['cmd'].">> 1.txt";
//此时的$cmd=ipconfig >> 1.txt
popen("$cmd",'r'); //实际上就是 popen("ipconfig >> 1.txt", "r"),把执行结果放入1.txt文件,通过访问1.txt文件查看执行结果。

?>

6.pcntl_exec() 用的很少不多赘述

此外php还自带一些能进行命令执行的代码,其中最常见的就是eval()函数

此函数能将输入的内容当作代码执行

下面列出一些常用的命令执行手段

Windows下连接两条命令

  • | 直接执行后面的语句,如ping <www.baidu.com|whoami>
  • || 如果前面的语句执行出错,则执行后面的。如ping 2||whoami
  • & 前面的语句可真可假。如ping 2&whoami
  • && 前面的语句为真时,才执行后面的语句。如ping <www.baidu.com> && whoami

Linux下连接两条命令

  • | 管道符,直接执行后面的语句,如ping -c 4 127.0.0.1 | whoami
  • || 如果前面的语句执行出错,则执行后面的。如ping -c 4 2 || whoami
  • ; 执行完前面的,直接执行后面的;如ping -c 4 127.0.0.1; whoami
  • && 前面的语句为真时,才执行后面的语句。如ping -c 4 127.0.0.1 && whoami

常见绕过

有时题目会对输入内容进行一些限制,即黑名单过滤,我们就要尝试绕过过滤并能实现正常的作用

空格绕过

常用${IFS}或者%09替代

或者可以这样输入:

  • {cat,flag}
  • cat<flag
  • cat<>flag

关键词绕过

  • 通配符(如:/f*或/fl??)
  • 变量拼接
  • 反引号
  • 反斜杠
  • 引号
  • 编码绕过(例如url编码:需要get请求传参或base64,Hex编码)

无参函数RCE

可以写python脚本输出需要的结果

1
2
3
4
5
6
7
8
#输出text取反并url编码
def test1(text):
result = ''
for i in text:
temp = hex(int(ord(i))^0xff)
temp = str(temp).replace('0x','%')
result += temp
print(result)

XSS-labs

详细内容见我的这篇博客,过程和思路都在这里:

https://yantm666.github.io/2023/10/19/%E9%9D%B6%E5%9C%BA-2023-10-19-XSS-labs/

upload-labs

详细内容见我的这篇博客,过程和思路都在这里:

https://yantm666.github.io/2023/10/19/%E9%9D%B6%E5%9C%BA-2023-10-19-upload-labs/