CSRF自动化检测
CSRF自动化检测:
这里主要是对POST型form表单的检测
1. 根据URL获取form表单组成的数组
2. 遍历表单数组,对比不设置cookie与设置了cookie两种情况下的表单是否还存在,如果还存在就去除数组中的该表单。
因为不设置cookie没有登录态也能获取的表单、也能进行的操作对于CSRF来说没有意义。
3. 遍历表单数组,在设置cookie的情况下访问两次页面,检测表单是否有所变化,如果有变化,去除数组中的该表单。
因为变化原因通常是由token引起的。token在每一次的页面中都不同。
接下来就是根据各种黑名单来过滤掉大几率不存在CSRF的form表单。
4. 去除没有提交按钮的表单。
关键字:submit、button等
5. 去除placeholder属性中含有跳、搜、查、找等关键字的数组,placeholder为input中预显示的内容
6. 去除cgi中包含search find login reg等关键字的数组。
7. 去除带有验证码的表单
img标签中带有关键字 vcode,yzm,verifyCode,captcha
8. 去除带有token关键字的表单。
余下的表单可初步判定为该url中存在csrf的表单。
这套程序并不完整,可以说是简陋,只是一天就写出来的东西。
还需要检测GET型重要操作的CSRF,再用chrome-headless webkit检测ajax的GET/POST CSRF,才能够覆盖到大部分业务。
抛砖引玉吧,小伙子给我玉呗
代码如下:
#coding:utf-8
import requests
import re
'''
获取URL中的表单
''' class csrfCheck:
'''
输入原生cookie,返回cookie拆分成的字典类型
'''
def tranCookie(self,rawC):
'''将原生的一大串cookie(从Burpsuite中截取出来)转换为字典'''
cookie={}
cookies=rawC.split("; ")
for i in cookies:
name=i.split("=",1)[0]
value=i.split("=",1)[1]
cookie[name]=value
return cookie def getForms(self,url,cookie):
'''输入url与cookie字典,返回页面中的表单html代码 数组''' headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
q=requests.get(url,headers=headers,cookies=cookie)
rep=q.content
#print rep q_nocookie=requests.get(url,headers=headers)
rep_nocookie=q_nocookie.content forms=re.findall("<form[\s\S]*?</form>",rep) # 对比各个表单在没有cookie的情况下是否存在
# 如果不用cookie也能获取表单
# 那么csrf没意义,不是需要检测的form,过滤掉
for i in forms:
link=re.findall("<form[\s\S]*?>",i)[0] if link in rep_nocookie:
forms.remove(i)
print "goout 1" '''
以同样的url和cookie请求,检测在两次请求中表单是否有变化。
如果有变化,则应该是token每次刷新页面都不同的原因引起的。
所以排除掉。
后续如果发现其他引起form变化的非token因素,修改此过滤条件。
'''
q_recheckToken=requests.get(url,headers=headers,cookies=cookie)
rep_recheckToekn=q_recheckToken.content for form in forms:
if form not in rep_recheckToekn:
forms.remove(form)
print "goout 2" return forms def filter(self,forms):
'''根据条件过滤去大概率不存在csrf的表单'''
'''去除没有提交按钮的表单'''
for form in forms:
if "submit" not in form.lower() and "button" not in form.lower():
forms.remove(form)
print "goout 3" '''去除带验证码的表单'''
yzmFile=open("yzm.txt","r")
yzmtext=yzmFile.readlines()
yzmFile.close()
#遍历表单
for form in forms:
#是否有验证码的标记位
ifVcode=0
imgs=re.findall("<img.*?>",form)
#遍历表单中的图片标签
for img in imgs:
if ifVcode==1:
break
#遍历关键字对图片标签进行检测
for key in yzmtext:
#转换为小写字母,不区分大小写
if key.strip() in img.lower():
forms.remove(form)
print "goout 4"
ifVcode=1
break '''去除placeholder(input中的预期信息)符合黑名单的'''
'''在验证cookie有无影响时已经去除了一遍,这里双重验证'''
phFile=open("placeholder.txt","r")
phtext=phFile.readlines()
phFile.close()
for form in forms:
#placeholder是否符合黑名单的标记位
ifPlaceholder=0
phs=re.findall("placeholder=\".*?\"",form)
#遍历表单中的placeholder属性
for ph in phs:
if ifPlaceholder==1:
break
#遍历关键字对placeholder进行检测
for key in phtext:
#转换为小写字母,不区分大小写
if key.strip() in ph.lower():
forms.remove(form)
print "goout 5"
ifPlaceholder=1
break '''去除cgi中存在search login等黑名单的表单'''
'''在验证cookie有无影响时已经去除了一遍,这里双重验证'''
cgiFile=open("cgi.txt","r")
cgitext=cgiFile.readlines()
cgiFile.close()
for form in forms:
#cgi是否符合黑名单的标记位
ifCgi=0
formTitle=re.findall("<form[\s\S]*?>",form)[0]
cgis=re.findall("\".*?\"",formTitle)
for cgi in cgis:
if ifCgi==1:
break
for key in cgitext:
if key.strip() in cgi.lower():
forms.remove(form)
print "goout 6"
ifCgi=1
break '''
检测是否存在token的关键字,后续应该将检测的地方定位到更精确的位置
缩小检测范围,减少漏报
'''
tokenFile=open("token.txt","r")
tokentext=tokenFile.readlines()
tokenFile.close()
#检测token关键字
for form in forms:
for key in tokentext:
if key.strip() in form.lower():
forms.remove(form)
print "goout 7"
break def show(self,forms):
for form in forms:
print form
def main(self,url,rawCookie): cookie=self.tranCookie(rawCookie)
forms=self.getForms(url,cookie)
self.filter(forms)
return forms
if __name__ == '__main__':
url="http://检测的URL"
rawCookie='''你的cookie原生字符串'''
csrf=csrfCheck()
result=csrf.main(url,rawCookie)
if len(result) == 0:
print "NO CSRF"
else:
print "CSRF!!"
print url
print re.findall("<form[\s\S]*?>",result)[0]
#csrf.show(result)
placeholder.txt
跳
搜
查
找
登录
注册
search
find
login
reg
cgi.txt
search
find
login
reg
yzm.txt 验证码黑名单
captcha
vcode
yzm
verifyCode
验证码
token.txt token黑名单
token
g_tk
csrf
CSRF自动化检测的更多相关文章
- XSS 自动化检测 Fiddler Watcher & x5s & ccXSScan 初识
一.标题:XSS 自动化检测 Fiddler Watcher & x5s & ccXSScan 初识 automated XSS testing assistant 二.引言 ...
- 基于Python实现的死链接自动化检测工具
基于Python实现的死链接自动化检测工具 by:授客 QQ:1033553122 测试环境: win7 python 3.3.2 chardet 2.3.0 脚本作用: 检测系统中访问异常(请求 ...
- XSS自动化检测 Fiddler Watcher & x5s & ccXSScan 初识
一.标题:XSS 自动化检测 Fiddler Watcher & x5s & ccXSScan 初识 automated XSS testing assistant 二.引言 ...
- 移动APP漏洞自动化检测平台建设
移动APP漏洞自动化检测平台建设 前言:本文是<移动APP客户端安全笔记>系列原创文章中的第一篇,主要讲的是企业移动APP自动化漏洞检测平台建设,移动APP漏洞检测发展史与前沿技术,A ...
- LCD显示器缺陷自动化检测方案
很牛的测试 参考: 1.https://www.radiantvisionsystems.com/ 2.https://www.radiantvisionsystems.com/node/275 LC ...
- 《阿里巴巴 Java 开发规约》自动化检测插件安装及体验
2017 开春之际,有助于提高行业编码规范化水平的<阿里巴巴 Java 开发手册>首次面世.汇聚阿里集团近万名技术精英的经验知识,这套高含金量的手册一经公开,便引起业界普遍关注和学习. 历 ...
- DataPipeline王睿:业务异常实时自动化检测 — 基于人工智能的系统实战
大家好,先自我介绍一下,我是王睿.之前在Facebook/Instagram担任AI技术负责人,现在DataPipeline任Head of AI,负责研发企业级业务异常检测产品,旨在帮助企业一站式解 ...
- Python自动化运维 - Django(三)CSRF - Cookie&Session
CSRF跨站请求伪造 CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求 ...
- [ 中危 ] 发布处存在CSRF及CSRF设想
漏洞存在于菜品发布处,使用A账号在添加/发布菜品的时候拦截数据包,使用burpsuite构造 CSRF的POC,再用B账号打开该HTML POC ,生成菜品. 该CSRF400RMB,主要因为是核心业 ...
随机推荐
- centos7_ linux : Nginx安装手册
一: nginx安装环境 1: oracle vm虚拟机+Centos7系统的yum环境的安装 配置本地yum库(用root用户操作) 创建挂载目录 mkdir /mnt/cdrom 查看挂载目录 l ...
- day4-list,列表
dist: 增:1.append(obj),在列表最后添加元素: 2.insert(index,object),在索引处添加元素: 3.extend,迭代添加元素,所添加元素必须可迭代. 删:1.po ...
- Vue-CLI 3.x 设置反向代理
最近在项目中使用了Vue CLI 3.0版本,项目中需要设置反向代理解决跨域问题,下面记录一下设置过程. 新建配置文件 (vue-cli3.x 官网的配置文档 https://cli.vuejs.or ...
- Java 11 这 8 个逆天新特性教你写出更牛逼的代码!
美国时间2018年 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本. 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Jav ...
- 论文阅读笔记十五:Pyramid Scene Parsing Network(CVPR2016)
论文源址:https://arxiv.org/pdf/1612.01105.pdf tensorflow代码:https://github.com/hellochick/PSPNet-tensorfl ...
- 手机app数据的爬取之mitmproxy安装教程
mitmproxy是一个支持HTTP和HTTPS的抓包程序,类似Fiddler.Charles的功能,只不过它通过控制台的形式操作. 此外,mitmproxy还有两个关联组件,一个是mitmdump, ...
- HDU 1671 Phone List (qsort字符串排序与strncmp的使用 /字典树)
Phone List Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 字典树HihoCoder - 1014
输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词.接 ...
- C#黎明前的黑暗
学习编程已经很久了,然而技术还停留在远古时代,丝毫没有什么进步的痕迹,平常也就写一些小软件来处理工作上面遇到的一些很繁杂的问题,天生愚笨或许就是说的我. 黎明前的黑暗期,真的太长了,烂烂的文章就像烂烂 ...
- JDK8 新特性流式数据处理
https://blog.csdn.net/canot/article/details/52957262