pikachu-csrf源码分析及修复

csrf源码分析

pikachu-csrf:
pikachu-csrf源码分析及修复_第1张图片

CSRF(get)

allen的住址是nba76,lucy的住址为usa,allen想要把lucy的住址改为nba77.
allen先登陆自己的账号,去到修改信息的页面,并修改自己的住址为nba77,发现地址add直接以get请求显示在url中,其他的信息也是,于是伪造了lucy修改地址的url为:localhost/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=12345678922&add=nba77&email=lucy%40pikachu.com&submit=submit诱导lucy点击这个链接
pikachu-csrf源码分析及修复_第2张图片
lucy的原信息:
pikachu-csrf源码分析及修复_第3张图片
lucy在登陆的情况下(cookie未失效),不小心点击了allen伪造的这个链接,于是lucy的地址被改成了nba77
pikachu-csrf源码分析及修复_第4张图片
代码分析:
提交修改的请求为GET请求,有固定的变量可以控制,且请求中没有token验证参数,也没有验证refer
pikachu-csrf源码分析及修复_第5张图片

CSRF(post)

情景和上面说的是一样的,只不过这里是以post提交的数据,allen同样可以伪造lucy修改地址的请求,http://localhost/pikachu/vul/csrf/csrf_poc.php,诱导lucy点击
pikachu-csrf源码分析及修复_第6张图片
lucy的原信息:
pikachu-csrf源码分析及修复_第7张图片

lucy在登陆的情况下(cookie未失效),不小心点击了allen伪造的链接,并且点击了这个submit按钮,那么lucy的地址就悄悄被改了。(这里还是只是演示的原理,实际中的伪装性很高,不可能给你一个submit按钮让你按,url也会伪装的)

pikachu-csrf源码分析及修复_第8张图片
lucy发现地址已经被改了

pikachu-csrf源码分析及修复_第9张图片
csrf_poc.php

<html>
    <body> 
        <form  name="px"  method="post"  action="http://localhost/pikachu/vul/csrf/csrfpost/csrf_post_edit.php">
            <input type="hidden" name="sex"  value="girl">
            <input type="hidden" name="phonenum" value="12345678922">
            <input type="hidden" name="add" value="nab77">
            <input type="hidden" name="email" value="[email protected]">
             <input type="submit" name="submit" value="submit"> 
        form>
       
     body>
 html>

小插曲:表单自动提交
本来csrf_poc.php写的是一个自动提交的表单,代码如下:
pikachu-csrf源码分析及修复_第10张图片
也不用还点击什么submit按钮才行了,直接点击url,自动提交,地址被改。但是发现行不通。我又返回去看了下allen改地址时候的请求包,发现post的数据还有submit=submit一项,而我们自动提交的表单请求包里面没有submit这个元素,所以改不了,然后我试着在form里添加submit这个元素,添加之后发现无法自动提交了,百度了一下是如果表单里有name为submit的元素,那submit()方法就不能执行,原因是submit被覆盖了。想深究的还是再去百度一下。

代码分析:
和GET型一样的原理,只不过这个是post类型的请求,同样没有验证refer,没有token验证,没有防止csrf的措施。
pikachu-csrf源码分析及修复_第11张图片

csrf(token)

这个属于防御了,在修复的时候细讲。

csrf修复

1.关键操作只接受POST请求

2.验证码

csrf攻击往往是在用户不知情的情况下构造网络请求,在关键地方设置验证码,增加与用户的互动,可以在一定程度上防止csrf

3.验证referer

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。通过验证referer的值,设置referer必须来自同域的网址等,可以判断请求是合法还是不合法的。但是,由于浏览器和服务器的一些问题,这个方法也不是万无一失的,referer值用户可以设置成空,由于一些漏洞,referer值可以被篡改。Refere Check 一般用于监控CSRF攻击的发生,而不用来抵御攻击

4.token

CSRF攻击要成功的条件在黑客能够预测所有的参数从而构造出合法的请求。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token。token要足够随机,不可预测,每次请求成功要更新token,并且最好不要出现在URL中。
我i们可以来看看pikachu csrf(token)一栏:
修改个人信息,抓包,发现url有token参数,并且每次请求会变化
pikachu-csrf源码分析及修复_第12张图片

pikachu-csrf源码分析及修复_第13张图片
构造之前的请求无法修改,猜测后端有验证这个token。只有token正确才可以修改。
代码分析:
修改信息时需验证$_GET[‘token’]==$_SESSION[‘token’]
pikachu-csrf源码分析及修复_第14张图片
set_token函数
pikachu-csrf源码分析及修复_第15张图片
pikachu-csrf源码分析及修复_第16张图片

csrf挖掘

一般就是看有没有token参数,测试一下有没有验证referer头等,常结合xss一起利用

你可能感兴趣的:(web学习)