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. [hadoop读书笔记] 第四章 Hadoop I/O操作

    P92 压缩 P102 序列化 序列化:将结构化对象转为字节流便于在网上传输或写到磁盘进行永久性存储的过程 用于进程之间的通信或者数据的永久存储 反序列化:将字节流转为结构化对象的逆过程 Hadoop ...

  2. Linux的内存管理

    Linux的内存管理,实际上跟windows的内存管理有很相像的地方,都是用虚拟内存这个的概念,说到这里不得不骂MS,为什么在很多时候还有很大的物理内存的时候,却还是用到了pagefile. 所以才经 ...

  3. Data truncation: Out of range value for column 'Quality' at row 1

    Q: Data truncation: Out of range value for column 'Quality' at row 1 com.mysql.jdbc.MysqlDataTruncat ...

  4. linux 软硬链接

    1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过索引节点 ...

  5. JUnit套件测试实例

    “套件测试”是指捆绑了几个单元测试用例并运行起来.在JUnit中,@RunWith 和 @Suite 这两个注解是用来运行套件测试. 下面的例子演示这两个单元测试:JunitTest1 和 Junit ...

  6. 事件的监听是由awt完成的

    学swing 之前先学awt ,因为awt 是Java实现图形界面的基础. 它能够完成编写界面的基本功能,最重要的是,事件的监听是由awt完成的. 而swing是在awt基础上提供的新的界面工具包,它 ...

  7. Visual Studio主题与配色方案

    有个性的开发人员总是喜欢使用属于的主题和配色方案,它们可以看出开发者的个性,更改它们可以缓解审美疲劳,总之选择一个适合自己的解决方案可能极大的增加自己的编码舒适度. 配色方案的选择和使用 手动修改Vi ...

  8. windows下Nginx与tomcat组合简单使用

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中瓦片资源越来越多,如果提高瓦片的访问效率是一个需要解决的 ...

  9. Service 保活法之二

    正确应对系统内存不足,OnLowMemory和OnTrimMemory回调 理论上,一个具备良好行为的应用应该考虑Android系统内存紧张的问题,这样有助于维持一个良好的生态.在前人的基础上,本文对 ...

  10. java 散列

    原文:https://www.cnblogs.com/younghao/p/8333795.html 为什么要设计散列这种数据结构呢?在现实世界中,实体之间可能存在着映射关系(key-value),比 ...