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自动化检测的更多相关文章

  1. XSS 自动化检测 Fiddler Watcher & x5s & ccXSScan 初识

    一.标题:XSS 自动化检测 Fiddler Watcher & x5s  & ccXSScan 初识     automated XSS testing assistant 二.引言 ...

  2. 基于Python实现的死链接自动化检测工具

    基于Python实现的死链接自动化检测工具   by:授客 QQ:1033553122 测试环境: win7 python 3.3.2 chardet 2.3.0 脚本作用: 检测系统中访问异常(请求 ...

  3. XSS自动化检测 Fiddler Watcher & x5s & ccXSScan 初识

    一.标题:XSS 自动化检测 Fiddler Watcher & x5s  & ccXSScan 初识     automated XSS testing assistant 二.引言 ...

  4. 移动APP漏洞自动化检测平台建设

    移动APP漏洞自动化检测平台建设   前言:本文是<移动APP客户端安全笔记>系列原创文章中的第一篇,主要讲的是企业移动APP自动化漏洞检测平台建设,移动APP漏洞检测发展史与前沿技术,A ...

  5. LCD显示器缺陷自动化检测方案

    很牛的测试 参考: 1.https://www.radiantvisionsystems.com/ 2.https://www.radiantvisionsystems.com/node/275 LC ...

  6. 《阿里巴巴 Java 开发规约》自动化检测插件安装及体验

    2017 开春之际,有助于提高行业编码规范化水平的<阿里巴巴 Java 开发手册>首次面世.汇聚阿里集团近万名技术精英的经验知识,这套高含金量的手册一经公开,便引起业界普遍关注和学习. 历 ...

  7. DataPipeline王睿:业务异常实时自动化检测 — 基于人工智能的系统实战

    大家好,先自我介绍一下,我是王睿.之前在Facebook/Instagram担任AI技术负责人,现在DataPipeline任Head of AI,负责研发企业级业务异常检测产品,旨在帮助企业一站式解 ...

  8. Python自动化运维 - Django(三)CSRF - Cookie&Session

    CSRF跨站请求伪造 CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求 ...

  9. [ 中危 ] 发布处存在CSRF及CSRF设想

    漏洞存在于菜品发布处,使用A账号在添加/发布菜品的时候拦截数据包,使用burpsuite构造 CSRF的POC,再用B账号打开该HTML POC ,生成菜品. 该CSRF400RMB,主要因为是核心业 ...

随机推荐

  1. jdbctemplate 调用oracle 有返回(会话型临时表数据的)结果的存储过程

    注:本文为博主 原创. jdbctemplate 调用oracle存储过程 事务 临时表  有返回结果 1:java 代码 本逻辑代码本是想把 java 代码里的list<Strign>类 ...

  2. 2。创建第一个angular应用,已经开发前的一些配置

    现在我们开始新建一个angular5的脚手架  . 到想要建项目的目录下.比如我的 在  D:\JsProjects 进入cmd或者powershell cd 进入该文件夹下 然后开始新建,ng ne ...

  3. Nginx的核心功能及应用实战

    反向代理功能及配置: 反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给interne ...

  4. HTML&javaSkcript&CSS&jQuery&ajax(四)

    一.HTML创建响应设计 Responsive Web Design 可以改变尺寸传递网页,对于平板和移动设备是必须的 1.<!DOCTYPE html><html lang=&qu ...

  5. java----String解析

    String在内存中的分析: public class Demo { public static void main(String[] args){ String a = new String(&qu ...

  6. cf919D 线性dp+拓扑排序

    /* 给定一张有向图,图上每个结点都有一个字符,现在要求出一条路径,要使路径上某字符出现的次数最多 如果有环,输出-1即可 拓扑排序+dp dp[i][26]表示排序到结点i时26个字符出现的次数 在 ...

  7. C++ Primer 笔记——标准库类型string

    1.如果使用等号初始化一个变量,实际上执行的是拷贝初始化,编译器吧等号右侧的初始值拷贝到新创建的对象中去:如果不使用等号则执行的是直接初始化. std::string str = "Test ...

  8. C# Enum 类型遍历

    void Main() { new EnumForeach().Foreach(); } public class EnumForeach { public void Foreach() { fore ...

  9. 现在k8s新版里,如何在每个node上运行一个带privileged的daemonset

    以前,我们会在kubelet上加--allow-prividged启动参数来实现. 而现在,更推荐的是用pod secureity policy来实现.前面的那种方式以后会被废弃. https://k ...

  10. linux系统(CentOS7)虚拟机上安装oracle 11g,解决oracle图形界面卡住无法点击next问题

    https://www.cnblogs.com/nichoc/p/6416475.html