浅析PHP代码审计中的CSRF漏洞

浅析PHP代码审计中的CSRF漏洞

1.概述

CSRF是怎么一个攻击流程呢?举一个最简单的例子,比如直接请求http://x.com/del.php?id=1 可以删除ID为1的账号,但是只有管理员有这个删除权限,而如果别人在其他某个网站页面加入<img src=”http://x.com/del.php?id=1”>再把这个页面发送给管理员,只要管理员打开这个页面,同时浏览器也会利用当前登录的这个管理员权限发出http://x.com/del.php?id=1这个请求,从而劫持了这个账号做一些攻击者没有权限做的事情


2.挖掘方法

黑盒的挖掘方法:

CSRF主要是用于越权操作,所有漏洞自然在有权限控制的地方,像管理后台、会员中心、论坛帖子以及交易管理等,这几个场景里面,管理后台又是最高危的地方,而CSRF又很少被关注到,因此至今还有很多程序都存在这个问题。我们在挖掘CSRF的时候可以先搭建好环境,打开几个有非静态操作的页面,抓包看看有没有token,如果没有token的话,再直接请求这个页面,不带referer。如果返回的数据还是一样的话,那说明很有可能有CSRF漏洞了

白盒的审计方法:

从白盒角度来说的话,只要读代码的时候看看几个核心文件里面有没有验证tokenreferer相关的代码,这里的核心文件指的是被大量文件引用的基础文件,或者直接搜"token"这个关键字也能找,如果在核心文件没有,再去看看你比较关心的功能点的代码有没有验证


3.漏洞防范

Token验证

Token翻译中文为“标志”,在计算机认证领域叫令牌。利用验证Token的方式是目前使用的最多的一种,也是效果最好的一种,可以简单理解成在页面或者cookie里面加一个不可预测的字符串,服务器在接收操作请求的时候只要验证下这个字符串是不是上次访问留下的即可判断是不是可信请求,因为如果没有访问上一个页面,是无法得到这个Token的,除非结合XSS漏洞或者有其他手段能获得通信数据。

Token实现测试代码如下:

?php
session_start();
function set_token() {
    
    
$_SESSION['token'] = md5(time()+rand(1,1000));
}
function check_token() {
    
    
    if(isset($_POST['token'])&&$_POST['token'] === $_SESSION['token']) {
    
    
        return true;
    }
    else {
    
    
        return false;
    }
}
if(isset($_SESSION['token'])&&check_token()) {
    
    
    echo "success";
}
else {
    
    
  echo "failed";
}
set_token();
?>
<form method="post">
    <input type="hidden" name="token" value="<?=$_SESSION['token']?>">
    <input type="submit"/>
</form>

运行结果,如果请求里面的Token值跟服务器端的一致,则输出“success”,否则输出“failed”

验证码验证

验证码验证没有Token那么实用,考虑到用户体验,不可能让用户每个页面都去输入一次验证码

猜你喜欢

转载自blog.csdn.net/Gherbirthday0916/article/details/130184696