目录
本系列为通过《pikachu靶场通关笔记》的CSRF关卡(共3关)渗透集合,通过对CSRF关卡源码的代码审计找到CSRF安全风险的真实原因,讲解CSRF原理并进行渗透实践,本文为CSRF01关卡XSS之GET关卡的渗透部分。

一、CSRF原理
CSRF(Cross - Site Request Forgery)即跨站请求伪造。它是一种常见的网络安全风险,攻击者通过诱导用户点击恶意链接或访问恶意网站,利用用户已登录的身份信息,在用户不知情的情况下,以用户的名义向目标网站发送恶意请求,执行一些非用户本意的操作,如转账、修改密码、发布虚假信息等。由于请求是从用户浏览器发出,且携带了用户的身份认证信息,目标网站难以区分请求的合法性,从而导致用户的权益受到侵害。
二、源码分析
进入pikachu靶场CSRF-GET关卡,登陆后进入个人资料页面,点击修改资料,进入到编辑资料的页面,完整URL如下所示。
http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php
接下来查看csrf_get_edit.php的源码内容,详细注释后如下所示。
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
// 获取当前 PHP 脚本的文件名
// substr 函数用于截取字符串,strrpos 函数用于查找字符串中最后一个 '/' 的位置
// 从该位置加 1 开始截取,得到当前脚本的文件名
$SELF_PAGE = substr($_SERVER['PHP_SELF'], strrpos($_SERVER['PHP_SELF'], '/') + 1);
// 此处存在错误,应该使用比较运算符 '==' 而不是赋值运算符 '='
// 若当前页面是 'csrf_get_edit.php',则设置 $ACTIVE 数组,用于标记页面的激活状态
if ($SELF_PAGE == "csrf_get_edit.php") {
$ACTIVE = array(
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'active open', '', 'active', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''
);
}
// 定义项目根目录的相对路径
$PIKA_ROOT_DIR = "../../../";
// 包含项目的头部文件,一般包含一些公共的 HTML 头部信息和样式引用
include_once $PIKA_ROOT_DIR . 'header.php';
// 包含项目的配置文件,可能包含数据库连接信息、常量定义等
include_once $PIKA_ROOT_DIR . "inc/config.inc.php";
// 包含项目的函数库文件,包含一些常用的自定义函数
include_once $PIKA_ROOT_DIR . "inc/function.php";
// 包含项目的 MySQL 操作文件,包含数据库连接和操作的函数
include_once $PIKA_ROOT_DIR . "inc/mysql.inc.php";
// 调用 connect 函数建立数据库连接,并将连接对象赋值给 $link 变量
$link = connect();
// 检查用户是否已登录,调用 check_csrf_login 函数进行验证
// 如果未登录,重定向到登录页面
if (!check_csrf_login($link)) {
// echo "<script>alert('登录后才能进入会员中心哦')</script>";
header("location:csrf_get_login.php");
}
// 初始化一个空字符串 $html1,用于存储错误提示信息
$html1 = '';
// 检查是否通过 GET 请求提交了 'submit' 参数
if (isset($_GET['submit'])) {
// 检查用户是否填写了性别、电话号码、地址和电子邮件
if ($_GET['sex'] != null && $_GET['phonenum'] != null && $_GET['add'] != null && $_GET['email'] != null) {
// 调用 escape 函数对 $_GET 数组中的所有数据进行转义处理,防止 SQL 注入
$getdata = escape($link, $_GET);
// 构建 SQL 更新语句,用于更新会员表中的用户信息
// 根据当前用户的用户名更新其性别、电话号码、地址和电子邮件
$query = "update member set sex='{$getdata['sex']}',phonenum='{$getdata['phonenum']}',address='{$getdata['add']}',email='{$getdata['email']}' where username='{$_SESSION['csrf']['username']}'";
// 执行 SQL 更新语句
$result = execute($link, $query);
// 检查 SQL 语句执行后受影响的行数
// 如果受影响的行数为 1 或 0,表示更新成功,重定向到 csrf_get.php 页面
if (mysqli_affected_rows($link) == 1 || mysqli_affected_rows($link) == 0) {
header("location:csrf_get.php");
} else {
// 如果更新失败,向 $html1 变量中追加错误提示信息
$html1 .= '修改失败,请重试';
}
}
}
?>
这段 PHP 代码的主要功能是会员信息修改页面,用于处理用户信息的修改操作。具体步骤如下:
- 获取当前页面的文件名,并根据文件名设置页面的激活状态。
- 包含项目的头部文件、配置文件、函数库文件和 MySQL 操作文件。
- 建立数据库连接,并检查用户是否已登录。如果未登录,重定向到登录页面。
- 当用户通过 GET 请求提交表单时,检查用户是否填写了必要的信息。如果填写完整,对用户输入的数据进行转义处理,然后执行 SQL 更新语句更新用户信息。
- 根据 SQL 语句执行结果,要么重定向到指定页面,要么显示错误提示信息。
然而这段代码存在 CSRF安全风险,主要原因如下:
- 缺乏 CSRF 防护机制:代码中没有对请求的来源进行验证,也没有使用 CSRF 令牌(CSRF Token)来验证请求的合法性。攻击者可以诱导已登录的用户访问恶意网站,在恶意网站中构造一个指向该页面的 GET 请求,携带修改用户信息所需的参数。由于用户已经登录,浏览器会自动携带用户的会话信息(如 Cookie),目标网站会将该请求视为合法请求,从而执行用户信息的修改操作。
- 使用 GET 请求处理敏感操作:代码使用 GET 请求来处理用户信息的修改操作,而 GET 请求的参数会暴露在 URL 中,更容易被攻击者利用。攻击者可以通过构造包含恶意参数的 URL,诱导用户点击,从而触发 CSRF 攻击。
三、渗透实战
1、构造恶意URL地址
(1)登录
打开pikachuCSRF(get)关卡页面,进入后是登陆页面,如下所示。
http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_login.php

不过本次使用暴力破解关卡admin和123456登录,点击提示部分,给出了可用的用户名和密码对(这里一共有这么些用户vince/allen/kobe/grady/kevin/lucy/lili,密码全部是123456),实际上使用的是pikachu数据库中的member表的用户名和密码,具体如下所示。

使用lili和123456进行登录,进入到个人资料的页面,效果如下所示。

(2)修改个人信息
进入到个人会员中心后,点击修改个人信息,进入到如下界面。
http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php

将信息修改为0,11111111111,222,[email protected],同时打开bp拦截,再点击submit。

(3)bp截获报文
拦截报文获取到要构造的恶意URL,将URL放入hackbar中,但是先不要点击execute。它用来诱骗已经登陆的其他用户点击,使其点击后个人信息被修改为指定内容(URL目的是将sex改为0,电话改为11111111111,地址改为222,有效改为333@pikachu)。
http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=0&phonenum=11111111111&add=222&email=333%40pikachu.com&submit=submit

修改完毕后页面已经修改为我们配置的信息,接下来点击退出登录,具体如下所示。

2、模拟受害者登录
本次我们模拟受害者,输入另一个用户名及其密码(这里选择mooyuan和123456),点击登录了显示mooyuan用户的个人信息,具体如下所示。

3、诱导受害者点击
执行hackbar中URL,模仿受害者点击URL,具体如下所示。
http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=0&phonenum=11111111111&add=222&email=333%40pikachu.com&submit=submit
模拟受害者mooyuan点击URL后,如下所示mooyuan的个人信息被修改了指定信息,渗透成功。
