如何写检测和防御csrf的规则?我们可以利用正则表达式进行匹配。对POST包进行正则匹配,这里只是提供了一个思路。

pcre:"
/POST \/(?P<uri>.*?) HTTP((?!\r\n\r\n).)*?
Host: (?P<host>[^\r\n]*?)((?!\r\n\r\n).)*?
Referer: https?:\/\/((?!(?P=host))|[^\/]*?\/(?!(?P=uri)))/ims";

如何理解该正则表达式?(我们尽量用大白话解释,要不扯那么多专业术语谁能看懂,哼,又不是写论文)

首先要说明的是此处检测的类型是 referer字段 由不同源的地址构造的情况。通俗的解释就是referer字段本来应该是指的你的该连接是从哪里指过来的,假如存在csrf,攻击者可以从其他的网站伪造请求,从而使得该网站执行攻击者的请求。

道理十分简单,大白话就是referer字段中要么包含post的字段,要么包含host字段。例如下图所示,referer字段就是host字段的内容。

只利用正则表达式如何进行检测?上述的正则表达式就是干的这个事情,同时也是比较巧妙的。

pcre:"
/POST \/(?P<uri>.*?) HTTP((?!\r\n\r\n).)*?    
Host: (?P<host>[^\r\n]*?)((?!\r\n\r\n).)*?
Referer: https?:\/\/((?!(?P=host))|[^\/]*?\/(?!(?P=uri)))/ims";

我们对上面的正则表达式的各个点进行一下讲解。(本来计划只说一下比较难理解的,如果你会的话,请回答一下下面的问题,总有你不会的,哼,小样,就正则表达式这种非人类的东西,能天天都记住?!)推荐用kiki进行测试一下,如果遇到不懂的话。

1、/POST当中的 / 代表什么意思?

答:开头的 / 表示正则表达式要开始了,就是这么个意思,如果中间过程中还需要用到 / 的话就需要进行转义,使用 \/ 。同时POST呢,就是要匹配post字段,这条csrf检测规则主要是检测post包的么。

2、\/这个理解了吗?(要转义)

3、(?P<uri>.*?)这个玩意是个神马东西??

答:首先(1).*?是啥么意思?  .* 是匹配多个非换行符外的字符串,那多一个?是不是就有点mengbility。这里的?是懒惰模式的意思,就是只要匹配到一次就停止的意思

    (2)(?P<uri>.*?)这个应用叫做后向引用,大致的格式(?P<name>表达式),意思就是给此时表达式匹配到的内容起个名字叫做name。当你以后需要用到同样的内容的时候直接用name就可以了。举个例子就是妈妈生下了你,并给你取了个名字,以后直接用名字就可以代指你了,并不需要还是喊那个孩子。那在我们的这个例子中就是"POST /ajax/login_h.jsp?cmd=loginCorpNew&dogSrc=3"中匹配到ajax/login_h.jsp?cmd=loginCorpNew&dogSrc=3,并把这段命名为uri。以后再需要这段内容的时候,我们可以用uri这个名字进行检测。

4、HTTP((?!\r\n\r\n).)*?这个玩意是神马东西?

答:HTTP((?!\r\n\r\n).)*? 这个应用叫做负向零宽断言,大致的格式是(?!exp),意思就是在这个位置后面不能匹配到什么的意思。在这里就是匹配不是”\r\n\r\n“的任意元字符很多次,直到遇到下一个匹配单元,上面的例子就是Host:,也就说直到遇到Host:就停下来。上述的话(图片中)这段就匹配的是 HTTP /1.1。

5、Host: (?P<host>[^\r\n]*?)是什么,[^\r\n]*?到底干了啥?

答:首先Host:匹配到,同时 (?P<host>[^\r\n]*?)依旧是个后向引用,你不需要记住这个名词,反正知道就是给[^\r\n]*?取了个名字叫做host,那么问题来了,[^\r\n]*?到底匹配了个啥东西??

此处[^\r\n]就是不是换行的意思,那么不是换行的话是不是就把Host: 这一行给匹配上了。在此例子中就是www.faisco.com,一换行后面的东西就不属于[^\r\n]*?匹配到的东西了。

接下来的((?!\r\n\r\n).)*?就是像上面的解释一下,知道碰到Referer: 就停下了。仔细想想,不详细解释了。

6、Referer: https?:\/\/ 这个里面怎么跑出https了??

答:这里的https? ,后面这个?有学问,意思就是前面的这个s可以有,也可以没有。所以此时可以匹配http和https两种。

  此处挖一个坑,假如是https??,有两个问号呢??又会是什么情况?

  其实第一个问号和上述的方式是一样的,对‘s’进行0次或者多次匹配。第二个?是开启懒惰模式,那么在懒惰模式下,就只能匹配到http了。(懒惰模式,既然s可以有0次或者其他次,反正我懒,我就不匹配0次,所以此处只能有http)

  那么\/\/ 呢?请看第二问,是不是一个转义啊,嗯,是的,很简单!

7、(?!(?P=host))是啥意思??

答:这里就是对负向零宽断言和后向引用的使用。意思就是这里不是上述我们命名为host的那个东西。(?!表达式)是负向零宽断言,表示这里不能是这个玩意。(?P=host)是我们在后向引用用到的,就是表示刚才我们刚才定义的host的那一串东西。

(?!(?P=uri))意思和上述是一样的。就不详细解释了。

8、((?!(?P=host))|[^\/]*?\/(?!(?P=uri))) 这里的 | 表示啥意思? [^\/]*?\/又是啥意思??

答:这里 (a|b)的形式意思就是不匹配a,那么就是b.用在检测csrf实际案例当中就是referfer要么是http://www.faisco.com,要么就是http://www.faisco.com/ajax/login_h.jsp?cmd=loginCorpNew&dogSrc=3(这里仅仅是举一个栗子,不要当真,这个栗子吃了会造成不消化)。

(?!(?P=host))的意思就是你这里不是www.faisco.com的话,你就是一个坏人,有可能是csrf攻击的流量。

[^\/]*?\/(?!(?P=uri))呢?

[^\/]*?\/意思是不是/的字符都给匹配上,在这里呢,就是把http://和第一个/之间的www.faisco.com匹配上,同时再加上\/,就是http://www.faisco.com/匹配上了。剩下一个(?!(?P=uri)),意思就是检测上述提到叫做uri的这一串东西是不是等于ajax/login_h.jsp?cmd=loginCorpNew&dogSrc=3,如果不等于,那么你就被抓住了,就被认为是csrf的恶意流量。

9、/ims

/i  忽略大小写

/m 将串视为多行

/s 将串视为单行

一堆修饰符,可以自行查找。

总结:

1、正则表达式很非人类,需要进行测试来进行理解。推荐kiki(我的机器是ubuntu,不知道windows下是什么工具)

2、csrf防御依旧可以用正则表达进行检测,并不是不能做检测的。但是仅仅能检测referfer字段的问题,是不是想一想id/ps可以写出针对token的规则。

3、耐心,耐性。很重要!

深入理解正则表达式-----应用于检测csrf的正则表达式的更多相关文章

  1. C#正则表达式编程(四):正则表达式

    正则表达式提供了功能强大.灵活而又高效的方法来处理文本.正则表达式的全面模式匹配表示法使您可以快速分析大量文本以找到特定的字符模式:提取.编辑.替换或删除文本子字符串:或将提取的字符串添加到集合以生成 ...

  2. 关于C#正则表达式MatchCollection类的总结,正则表达式的应用

    认识MatchCollection 类 表示通过以迭代方式将正则表达式模式应用于输入字符串所找到的成功匹配的集合. 命名空间:  System.Text.RegularExpressions 属性:C ...

  3. 正则表达式 第五篇:C# 正则表达式

    原文:正则表达式 第五篇:C# 正则表达式 本文整理C#正则表达式的元字符,正则表达式是由字符构成的表达式,每个字符代表一个规则,表达式中的字符分为两种类型:普通字符和元字符.普通字符是指字面含义不变 ...

  4. 一个通用的php正则表达式匹配或检测或提取特定字符类

      在php开发时,日常不可或缺地会用到正则表达式,可每次都要重新写,有时忘记了某一函数还要翻查手册,所以,抽空写了一个关于日常所用到的正则表达式区配类,便于随便移置调用.(^_^有点偷懒). /*/ ...

  5. 对状态字的理解 尤其是 首次检测位“/FC”的想法

    状态字 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0               BR CC1 CC0 OV OS OR STA RLO /FC 问题1 关于首次检测位& ...

  6. JavaScript常用检测脚本(正则表达式)

    转自:http://www.cnblogs.com/skylaugh/archive/2006/09/25/514492.html 文件名称:check.js 说明:JavaScript脚本,用于检查 ...

  7. CSRF进阶之打造一个检测CSRF漏洞的脚本

    前言: 还记得之前所学的CSRF漏洞吧.因为没有对表单做好对应的漏洞 而造成的CSRF漏洞.学了这个漏洞后逐渐的了解.这个比较鸡助. 代码: import requests,tqdm,time,os, ...

  8. 利用BURPSUITE检测CSRF漏洞

    CSRF漏洞的手动判定:修改referer头或直接删除referer头,看在提交表单时,网站是否还是正常响应. 下面演示用Burpsuite对CSRF进行鉴定. 抓包. 成功修改密码完成漏洞的利用.

  9. 检测 IP的正则表达式

    ... /*ip正则表达式*/ /^((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})| ...

随机推荐

  1. conda 虚拟环境

    一.jupyter notbook (1)需要安装: conda install ipykernel (2)首先激活对应的conda环境 source activate 环境名称 (3)将环境写入no ...

  2. Jeson老师写的nginx切割脚本

    #Jeson #Email:jeson@iaskjob.com #变量定义:access.error日志文件列表 NGINX_LOG=(imoocc_com_access iaskjob_com er ...

  3. 【BZOJ】3991: [SDOI2015]寻宝游戏 虚树+DFS序+set

    [题意]给定n个点的带边权树,对于树上存在的若干特殊点,要求任选一个点开始将所有特殊点走遍后返回.现在初始没有特殊点,m次操作每次增加或减少一个特殊点,求每次操作后的总代价.n,m<=10^5. ...

  4. Vue 子路由 与 单页面多路由 的区别

    本文地址:http://www.cnblogs.com/veinyin/p/7911292.html 最近学完了基础课程,打算整理一波笔记,对基本概念梳理一遍,惊觉对子路由和单页面多路由混淆的一塌糊涂 ...

  5. 2017 ACM暑期多校联合训练 - Team 3 1008 HDU 6063 RXD and math (莫比乌斯函数)

    题目链接 Problem Description RXD is a good mathematician. One day he wants to calculate: ∑i=1nkμ2(i)×⌊nk ...

  6. C - A New Function (整除分块 + 玄学优化)

    题目链接:https://cn.vjudge.net/contest/270608#problem/C 题目大意:给你一个n,让你求从1->n中间每个数的因子之和(每个数在求因子的过程中不包括本 ...

  7. docker ubuntu容器更换阿里源(转)

    问题:使用docker 利用下载的ubuntu镜像启动容器时,使用的源下载更新软件的速度较慢. 解决这个问题的方法是跟新ubuntu容器的源 示例:以ubuntu为基础镜像 启动一个名称为 test0 ...

  8. spark作业提交参数设置(转)

    来源:https://www.cnblogs.com/arachis/p/spark_parameters.html 摘要 1.num-executors 2.executor-memory 3.ex ...

  9. elk系列5之syslog的模块使用【转】

    preface rsyslog是CentOs系统自带的的一个日志工具,那么我们就配置logstash来接受rsyslog的日志. logstash的syslog模块 linux-node2上操作log ...

  10. java基础6 面向对象的详解

    本文知识点(目录): 1.1.万物皆对象    1.2.面向对象的概述    1.3.面向对象(java语言)与面向过程(C语言)对比    1.4.面向过程    1.5.对象    1.6.面向对 ...