如何写检测和防御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. Codeforces 807 C. Success Rate

    http://codeforces.com/problemset/problem/807/C C. Success Rate time limit per test 2 seconds memory ...

  2. Python学习笔记(十)匿名函数

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431843456 ...

  3. protoc

    平台安装: 在window 平台使用的工具protoc.zip linux平台的安装方式. 执行在windos平台上执行生成java代码命令: protoc --java_out=./ Keyword ...

  4. (3.1)用ictclas4j进行中文分词,并去除停用词

    酒店评论情感分析系统——用ictclas4j进行中文分词,并去除停用词 ictclas4j是中科院计算所开发的中文分词工具ICTCLAS的Java版本,因其分词准确率较高,而备受青睐. 注:ictcl ...

  5. Windows下搭建网络代理

    场景:有些场景下会出现局域网内的某些网段可能由于安全限制,不能访问外网,此时可以通过安装一些工具来实现借助局域网内某些能够上外网的电脑来实现网络代理的功能.以下工具均是使用于Window环境. 服务端 ...

  6. 你知道吗?.NET Framework 4.5 五个很棒的特性

    简介 自.NET 4.5发布已经过了差不多1年了.但是随着最近微软大多数的发布,与.NET开发者交流的问题显示,开发者仅知道一到两个特性,其他的特性仅仅停留在MSDN并以简单的文档形式存在着. 比如说 ...

  7. java规范之checkstyle

    1. 概述 随着中心的代码规范的建立和实施,项目组对代码规范要求,以及软件工程师们对自身代码的编写规范重要性的认知,“代码规范”已经成为了中心的一个“热词”.然后怎么才能写出有规范的代码,怎么才能养成 ...

  8. maven使用过程中遇到的问题总汇

    1:web.xml is missing and <failOnMissingWebXml> is set to true 造成原因: 使用maven创建项目时有时在pom.xml的war ...

  9. 【文件上传】jquery之ajaxfileupload异步上传插件

    来自:http://www.blogjava.net/sxyx2008/archive/2010/11/02/336826.html 由于项目需求,在处理文件上传时需要使用到文件的异步上传.这里使用J ...

  10. 利用Addon Domain和A记录使两个域名同时指向同一个网站

    今天碰到这样的需求:已有网站A.com, 以及新注册的域名B.net, 现需要将B.net指向与A.com相同的内容. 这里提出的方法是在空间后台添加Addon domain, 以及在域名B.net后 ...