一、环境
雷池官网docker安装我的版本是
看官网介绍主要防御top10
二、讲解
我这里只描述通用型绕过,对于事件型不多描述,因为通用型的绕过是通杀的,差异化绕过
正常来说我们是因为没有一个很好的过滤所以造成第11关靶场的绕过
但是现在有了长亭的waf加入我们直接被拦截
那我们拿不到数据,怎么处理,我们一步步替换函数,看这个waf杀的是什么函数,这都是我乱写的根本没什么威胁
这根本不是一个正常的函数,但是还是被杀了
经过测试发现它其实杀的是and和我们的一个报错函数还有一个系统函数,现在出现系统函数都会报错
三、绕过前思路整理
我们来看看大佬分析的腾讯WAF绕过挑战赛的思路,正如大佬所说:对于一个 HTTP 请求,Nginx 解析了什么内容?交给后面的 PHP、ASP 又解析了什么内容?
multipart/form-data 。我们知道,HTTP 协议 POST 请求,除了常规的 application/x-wwwform-urlencoded 以外,还有 multipart/form-data 这种形式,主要是为了解决上传文件场景 下文件内容较大且内置字符不可控的问题。multipart/form-data 格式也是可以传递 POST 参 数的。对于 Nginx+PHP 的架构,Nginx 实际上是不负责解析 multipart/form-data 的 body 部 分的,而是交由 PHP 来解析,因此 WAF 所获取的内容就很有可能与后端的 PHP 发生不一 致。
这句话也是我们绕过的核心
举个例子
以php为例,我们写一个简单的绕过脚本
我们将报文转为multipart/form-data一个形式来进行一个上传值
此时,我们将其转为 multipart/form-data 格式:
可以看到,实际上和前一种 urlencoded 是达到了同一种效果,参数并没有进入$_FILES 数组,而是进入了$_POST 数组。那么,何时是上传文件?何时是 POST 参数呢?这个关键 点在于有没有一个完整的 filename=。这 9 个字符是经过反复测试的,缺一个字符不可,替 换一个字符也不可,在其中添加一个字符更不可。 加上了 filename=以后的效果:
可以见得filename这几个字段少一个都不行
Bypass WAF 的核心思想在于,一些 WAF 产品处于降低误报考虑,对用户上传文件的内容不做匹配,直接放行。事实上,这些内容在绝大多数场景也无法引起攻击。但关键问题在于,WAF 能否准确有效识别出哪些内容是传给$_POST 数组的,哪些传给$_FILES 数组?如果不能,那我们是否就可以想办法让 WAF 以为我们是在上传文件,而实际上却是在 POST 一个参数,这个参数可以是命令注入、SQL 注入、SSRF 等任意的一种攻击,这样就实现了通用 WAF Bypass。
那核心思想就出来了让waf认为我们是上传文件,其实我们是POST一个数据
3.1 思路
3.1.1 入门思路 0x00截断filename
入门思路0X00截断(只限于php5.2版本遇见\0自动结束,因为php底层是c语言,c语言遇见\0就会结束)
简单来说市面上的南墙waf,宝塔云waf都是可以绕过的,我们测雷池waf先测一个字段,去11关改代码,passwd全删掉,我们只看username
我改了但是我还是正常查询数据
我们抓包后这个name用我们刚才的multipart/form-data格式提交上去看起来已经成功了,后端确实把它当做一个POST提交了
关键是WAF怎么认为,我们直接恶意代码上,简单的代码修改,没绕过
注意在 filename 之前加入了 0x00,而有些 WAF 在检测前会删除 HTTP 协议中的 0x00, 这样就导致了 WAF 认为是含有 filename 的普通上传,而后端 PHP 则认为是 POST 参数。(有些waf可以)
3.1.2 双写上传描述行(差异绕过)
php获取第一个,waf获取第二个就可成功
爆出来的错误是select这个参数不统一
1,2出现是真的成功了吗
试试user()
只要骗过它一次,它后面就不会拦你
当然还有很多绕过方案,我至少还掌握了三种,接下来下一篇看看雷池对于我们webshell的免杀
四、雷池webshell免杀检查
很常见的webshell回调后门吧
没杀,但是安全狗和河马一定会杀掉
我们再过分一点
今天的技术分析就到这里了