文章目录
绕过特征和技术
一. 观察相应码和内容
响应码
- 请求正确或错误的文件和目录
- 观察响应码是否有差异,是否相同
- 根据差异或者相同写出相应绕过代码
内容
- 请求正确或错误的文件和目录
- 观察响应内容是否有差异,是否相同
- 根据差异或者相同写出相应绕过代码
二. 绕过技术
延时绕过
- 很多WAF都有规则,如果在限制的时间内发包过快,就立马封IP
- 如:10秒钟发100个请求,可能就会被认为存在攻击行为
- 可以设置延迟,每请求一次延时1-4秒左右
修改usergent绕过
- 有的WAF,收集有工具特征指纹,可以修改其usergent和refer尝试绕过
设置代理池绕过
- 设置代理池,挂了又继续,但是安全狗现在也有检测。
基于安全狗特征实验
一.观察安全狗的拦截规则
- 可以看到安全狗规则就是每10秒超过一百个请求就认为是攻击者,从而冻结5分钟
- 并且安全狗可以通过识别工具的指纹,比如御剑,就直接屏蔽
- 防护规则-响应内容
二.绕过思路研究
- 那我就不让他10秒超过100个请求呗,就延时呗
- 再通过响应码和响应文本去观察正确请求和错误请求是否存在区别
开始实验
- 经过实验响应码全为200ok
- 请求正确的目录
- 请求错误的目录
- 请求正确的文件
- 请求错误的文件
规律发现
- 所有状态码都为200
- 请求正确的目录时候返回403
- 请求正确的文件啥也不返回,并且html中没有了safedog
- 只要请求错误的目录或文件页面都返回404
代码构思:
该代码不完整,主要是讲解思路
既然状态码都为200,那就来一个if判断
if code==200:
既然正确的目录时候返回403,增加条件判断,在html中找到403就打印url
if code==200:
x=rep.text.find("403</a>错误")
# x!=-1 ,本身就不等于-1,意思就是找到03</a>错误,则打印
if x!=-1:
print("[+]" + urls + "|" + str(code))
正确的文件怎么验证了??
- html中啥也不返回,并且没有safedog,那我们就再来一个条件,除了含有safedog的页面都返回
if code==200:
i=rep.text.find("safedog")
x=rep.text.find("403</a>错误")
# x!=-1 ,本身就不等于-1,意思就是找到03</a>错误,则打印
if x!=-1:
print("[+]" + urls + "|" + str(code))
# i==-1,本身就不等于-1,意思就是不等于 safedog时候打印出文件或目录
if i==-1:
print("[+]" + urls + "|" + str(code))
到此为止,我们就大概的编写出了绕过WAF扫描目录和文件的代码,接下来看小迪老师的完整的代码,↓↓↓↓↓
小迪老师绕过脚本
- 里面添加了延时,从而不触发安全狗
- 并且添加了一个简单的多线程
import sys
import os
import requests
import threading
import queue
import time
q=queue.Queue()
#复制给q发送和接受
def scan():
#接受的数据不为空则执行
while not q.empty():
#接受url+dir的urls
urls=q.get()
urls=urls.replace('\n','')
code = requests.get(urls).status_code
rep = requests.get(urls)
time.sleep(5)
if code==200:
i=rep.text.find("safedog")
x=rep.text.find("403</a>错误")
# x!=-1 ,本身就不等于-1,意思就是找到03</a>错误,则打印
if x!=-1:
print("[+]" + urls + "|" + str(code))
# i==-1,本身就不等于-1,意思就是不等于 safedog时候打印出文件或目录
if i==-1:
print("[+]" + urls + "|" + str(code))
else:
time.sleep(1)
def show():
print('ps:scan.py url.txt dir.txt 10')
print('\n')
print('脚本名 网站文件 字典文件 线程数')
if __name__ == '__main__':
path=os.path.dirname(os.path.realpath(__file__))
if len(sys.argv)<4:
show()
sys.exit()
url = sys.argv[1]
file = sys.argv[2]
num = sys.argv[3]
for url in open(path+'/'+url):
for dir in open(path+'/'+file):
urls=url+dir
#将urls传递出去
q.put(urls)
for i in range(int(num)):
t=threading.Thread(target=scan)
t.start()
对比御剑和小迪老师的效果
御剑
- 啥也扫不到
小迪老师的工具
- 可以看到没被WAF拦截
总结
- 通过搭建waf软件观察有哪些规则
- 通过响应码和响应文本去观察正确请求和错误请求是否存在区别
- 通过差异编写绕过脚本,如果怎么怎么样,就打印出正确的文件和目录。