前言

参考大佬的文章,附上地址 https://www.freebuf.com/articles/web/118352.html

什么是CSRF?

CSRF,中文名字,跨站请求伪造,听起来是不是和XSS差不多?区别就在于,CSRF并没有盗取cookie而是直接利用。通俗的来说,就是攻击者盗用了你的身份,在你不知情的情况下执行一些违法操作,比如密码修改,增加管理员,转账等敏感操作,危害很大。

漏洞利用

这里已DVWA为例,通过实例演示自己的学习过程。对DVWA陌生,并且想了解搭建一下的,可以参考这篇文章 https://www.cnblogs.com/lxfweb/p/12678463.html

打开DVWA,选择CSRF,先从最低级别的low开始,查看源代码

<?php

if( isset( $_GET[ 'Change' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ]; // Do the passwords match?
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new ); // Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); // Feedback for the user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
echo "<pre>Passwords did not match.</pre>";
} ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
} ?>

通过查看发现,代码中,password_new,password_conf,两个参数没有做任何防护,这样是相当危险的,如果攻击者对受害者的这套程序很熟悉,可以很轻易的构造链接,只要攻击者一点击这个链接,就会触发CSRF攻击。这是DVWA修改密码的链接 http://www.test.com/DVWA-master/vulnerabilities/csrf/?password_new=12345678&password_conf=12345678&Change=Change#  受害者只要带登陆情况下点击这个链接(同一浏览器),密码就会被修改为12345678,不过这链接一看就是改密码的,基本不会有人点,所以需要咱们精心构造一下,这里以burpsuite演示。进去修改密码页面,抓包。

点击Generate CSRF PoC burp会构造简单的一个页面,如图

接下来,将构造的网址复制到浏览器,就会有一个按钮,用户点击就会触发CSRF攻击,密码被修改。

不过这个做法也有些粗糙,点击完,会自动跳转到,密码修改的页面,受害者就知道密码被修改,

参考上面提到的文章里面的思路,那就是隐藏img src 标签,再可以精心构造一个错误页面,让受害者认为这是一个无效的URL,但已经进行了CSRF攻击。构造的代码如下

<img src="http://www.test.com/DVWA-master/vulnerabilities/csrf/?password_new=12345678&password_conf=12345678&Change=Change#" border="0" style="display:none;"/>

<h1>404<h1>

<h2>file not found.<h2>

下面看一下中级的DVWA部分源代码截图,看做了什么防御。

可以看到,中级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名)抓包看一下,通俗的讲,不在本域的请求,就会拒绝访问。

那该如何绕过呢,这个,只需要将咱们构造的页面名字改为受害者的主机名即可,如上图,至于要将名字改为 www.test.com.html,就可以绕过啦。

防御措施

1)检查Referer字段

HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。但是这样的方式,也是不安全的,上文中已经讲解了,如何绕过Referer字段的检查。

2)添加校验token(来源百度百科)

由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。

3)源代码中增加输入原密码机制

在这种情况下,攻击者在不知道原密码的情况下是无法进行CSRF攻击的。

最新文章

  1. 配置点云库PCL时遇到的问题
  2. fulltext不支持Mysql中文全文索引
  3. [ACM_贪心] Radar Installation
  4. C语言第4天循环,流程控制。
  5. Asianux3配置yum
  6. linux多线程编程(转)
  7. 原生网络请求:同步请求、异步请求、GET请求、POST请求
  8. TCP/IP他人笔记学习--地址收录
  9. 王立平-Android中对图像进行Base64编码
  10. SVN Access to &#39;/svn/Test/!svn/me&#39; forbidden,不能更新解决办法
  11. MR单元测试以及DeBug调试
  12. Spring mvc后台重定向页面,实际前端不跳转
  13. oracle 11.2.0.4 rac 打补丁
  14. 【Spark调优】Shuffle原理理解与参数调优
  15. Java并发编程(三)Thread类的使用
  16. UVALive-7041(回文树
  17. python学习之老男孩python全栈第九期_数据库day001 -- 作业
  18. BZOJ 1528 [POI2005]sam-Toy Cars(优先队列)
  19. ZOJ3770Ranking System 2017-04-14 12:42 52人阅读 评论(0) 收藏
  20. 神经网络可以拟合任意函数的视觉证明A visual proof that neural nets can compute any function

热门文章

  1. linux下vmware could not open /dev/vmmon/no/such/file/or/directory问题
  2. Convert JS object to JSON string
  3. ICCV 2019|70 篇论文抢先读,含目标检测/自动驾驶/GCN/等(提供PDF下载)
  4. [vijos1460&amp;Metocode P223]拉力赛&lt;LCA&gt;
  5. SpringCloud入门(八): Zuul 过滤器详解
  6. EXPLAIN 查看 SQL 执行计划
  7. G - 土耳其冰淇凌 Gym - 101194D(二分答案 + 贪心检验)
  8. SWUST OJ 1012哈希表(链地址法处理冲突)
  9. Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with &#39;#&#39; will be ignored, and an empty messa
  10. java对于目录下的相关文件的单词操作