Hêlo mọi người, lại là mình đây. Như câu nói "học thì phải đi đôi với hành", thì sau khi tìm hiểu lý thuyết về XSS xong thì mình nên sang thực hành luôn cho nóng nhé :v
Thì hôm nay mình sẽ bay sang trang lab của Portswigger để thực hành về tấn công XSS, có thể phân tích bằng tay và áp dụng cả BurpSuite vào cho quen tay luôn nha.
Trước hết, nếu mọi người chưa biết đến XSS là gì thì có thể đọc lại bài viết trước của mình để biết thêm thông tin và cách sử dụng BurpSuite để áp dụng vào bài này nha.
OK Let's Go...
1. Lab: Reflected XSS into HTML context with nothing encoded
link: https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded
Đúng như tên gọi của bài Lab (html không được encode).
Cái này thì chắc chắn ai cũng biết rồi, đối với những form không validate và get thẳng giá trị thì chỉ cần chèn 1 đoạn script đơn giản như này vào là sẽ có alert ngay thôi.
2. Lab: Stored XSS into HTML context with nothing encoded
link: https://portswigger.net/web-security/cross-site-scripting/stored/lab-html-context-nothing-encoded
Vẫn không encode nhưng lần này là XSS Stored
Vẫn lấy lại đoạn script trên, mình sẽ inject vào input của comment vào 1 bài post bất kì
Ok ngon, vừa post comment đã lên ngay alert.
Nếu check element chúng ta sẽ thấy đoạn script đã được inject thành công vào comment và tự động thực thi khi load
3. Lab: Reflected XSS with some SVG markup allowed
link: https://portswigger.net/web-security/cross-site-scripting/contexts/lab-some-svg-markup-allowed
Trở lại với khung search tìm kiếm, lần này đã lợi hại hơn xưa, không còn cho phép tag script thực thi nữa :v
Cuộc vui nào cũng có lúc dừng, và đối với cái khung search này cũng thế. Lab này hơi khó nhằn nên tôi mở BurpSuite lên đây ?
Bằng cách bắt lại request lúc search và ném sang Intruder, chúng ta sẽ bắt đầu Brute-Force xem còn tồn tại những tag nào chưa được lọc sẽ lợi dụng mà inject vào.
Mình sẽ đánh dấu đô-la để lọc ra các tag vẫn chưa bị lọc trước
Sang trang CheatSheet XSS của PortSwigger và copy all tag để brute ra tag chưa được lọc và paste vào phần payloads trên BurpSuite
Sau 1 hồi chờ đợi thì ta lọc được các tag chưa được filter với status code trả về là 200, chúng ta sẽ test thử bằng animatetransform thử xem sao.
Syntax của animatetransform
Như vậy nếu có animatetranform thì phải có thẻ svg ở trước, hình như trong phần attack cũng có lọc được thẻ svg, vậy thì triển thôi. Copy phần event lấy từ Cheat Sheet lúc nãy đưa vào phần payloads
Mình sẽ đặt 2 dấu đô-la sau animateTransform để brute các event được copy từ cheat sheet (%22 là space sau khi encode nhé, nếu bấm space trực tiếp trong phần request của Burp sẽ không nhận phần url phía sau đâu nha)
Yeah, có statuscode 200 đây rồi, chúng ta sẽ test trên browser luôn
À mình quên, tag animatetransform không có thẻ đóng nhé (mình gõ nhầm), lúc nãy brute không có thẻ đóng, nhưng bằng cách thần kì nào mà nó vẫn status code 200 ?
Đoạn code sẽ như này link + ?search=<svg><animatetransform onbegin=alert(1)>
Ok ngon
4. Lab: Reflected XSS into attribute with angle brackets HTML-encoded
Nếu ở đây chúng ta áp dụng kĩ thuật lúc nãy thì sẽ không thành công. Có lẽ chuỗi dữ liệu đã bị lọc hoặc bằng cách nào đó đã được truyền sang param khác.
Chúng ta sẽ check source. Nếu để ý kĩ trong source thì ta sẽ thấy chuỗi tìm kiếm đã được chuyển vào value và mã hóa đi các dấu đóng mở.
Ok chúng ta sẽ có cách xử lý khác. Đây là syntax 1 hàm bất kì trong thẻ input mà mình search ở w3school hoặc mọi người cũng có thể xem cheatsheet XSS nhé. ( mã hóa mấy dấu < > chứ có mã hóa mấy dấu ngoặc ' đâu :v )
Nếu dữ liệu được chuyển xuống value có code như sau value=”cái gì đó”
Vậy nếu mình đặt vào chuỗi tìm kiếm 1 cặp dấu ngoặc nữa như này ”onmousemove=”son dep trai
thì giá trị value sẽ vô nghĩa và dấu ngoặc còn lại sẽ được ghép với dấu ngoặc thứ 2 mà mình nhập vào
Value=””onmousemove=”son dep trai”
=> Logic ?
Khi mình rê chuột đi sẽ xuất hiện alert, ngoài ra cũng có thể sử dụng các cheat sheet khác như trong bài viết trước mình đã chia sẻ như onmouseover, blabla...
5. Lab: Stored XSS into anchor href attribute with double quotes HTML-encoded
Lại là trang blog từ lab02, chúng ta sẽ vào bất kì 1 post nào và lại test lại chức năng comment.
Bây giờ đoạn script "son dep trai" được thực hiện trên input comment đã không còn tác dụng.
Nếu các bạn để ý sẽ thấy thẻ a href có đường dẫn đến website đã nhập ở input website. À hóa ra là dùng href chuyển đến website -> Thử truy cập vào sẽ thấy url có path của website và body là not found.
Vậy chúng ta sẽ inject script vào href của thẻ a (input của website) này
Syntax javascript bên trong href
Vậy input chúng ta sẽ nhập ở input website theo cấu trúc như trên
OK Ngon, nhưng mà Portswigger vẫn chưa hiện lên là Solved :v (tại chưa dùng BurpSuite nha)
Chúng sẽ mở BurpSuite lên và bắt lại request khi comment và đổi lại param của phần website và forward thôi ?
6. Lab: Reflected XSS into a JavaScript string with single quote and backslash escaped
Vẫn là trang blog cũ, nhưng lần này những kí tự đã được escape và tag mở script của mình cũng đã bay màu rồi
Ok check source nào
Bị dư 1 tag đóng script => thêm 1 tag đóng script ở đầu nhằm đánh lừa đoạn code là đã kết thúc script ở chỗ đóng script mình inject vào + Escape thì ta thay bằng số thôi :v
</script><script>alert(123);</script>
7. Lab: Reflected XSS into a JavaScript string with angle brackets HTML encoded
Lần này vẫn trang blog cũ, vẫn script cũ nhưng lại bị mã hóa dấu ngoặc lớn bé, nhưng còn dấu ngoặc đơn lại không mã hóa ?
Theo như yêu cài của bài lab thì phải làm sao cho tấn công cho break out khỏi chuỗi javascript và gọi hàm alert lên
Mình đã chèn thử như này 'onerror='alert("XSS")'' nhưng không hiệu quả :v
Vậy chúng ta sẽ tận dụng dấu ngoặc không mã hóa để đóng chuỗi lại, thử đơn giản ';alert(1);'
xem sao.
Bằng cách thần kì nào đó mà đoạn script trên đã có tác dụng .
8. Lab: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded and single quotes and backslash escaped
Lại trở lại với script ở comment, để xem chúng ta có gì nào
Input này có kiểm tra url nên mình sẽ nhập theo đúng url là https://foo/?'-alert(‘son dep trai’)-'
như lúc trước thì sau khi check source sẽ có 1 hàng như sau
<a id="author" href="http://foo?'-alert(\'son dep trai\')-'" onclick="var tracker={track(){}};tracker.track('http://foo?'-alert(\'son dep trai\')-'');">Test</a>
1 sai lầm khi encode thành ' thay vì " ( là dấu ‘ sau khi bị encode nha )
Có vẻ như lúc này đoạn script đã bị encode + escape gần như hết ngoặc luôn rồi
Nếu nhập https://foo/?’alert(1)’
thì sẽ bị escape thành
Như lab ở trên, escape thì thay số vào thôi. Còn nếu đã encode html entities thì mình sẽ thay bằng entites encode luôn, để cho các dấu ngoặc ko bị encode như trên
Hoặc có thể dùng đoạn mã như sau: http://foo?');alert(1)//
Chúng ta sẽ lợi dụng ' và )
được mã hóa thành dấu ' )
để đóng function tracker.track lại sau đó alert
rồi thêm //
để comment đoạn code phía sau đi
Sau khi bấm vào tên tác giả của comment sẽ xuất hiện alert
9. Lab: Reflected XSS into a template literal with angle brackets, single, double quotes, backslash and backticks Unicode-escaped
Lại quay lại với blog search :v Search 1 cái gì đó rồi check source nào
Chúng sẽ sẽ thấy biến message được cho giá trị để gán vào innerText của searchMessage mà không có sự kiểm tra nào, thế nên ta sẽ áp dụng nối chuỗi.
Đây là 1 loại nối chuỗi trong javascript
Áp dụng câu alert cũ vào lab chúng ta đang làm thì hình như các dấu ngoặc lại bị encode rồi
${ alert('son dep trai') }
Thay lại bằng số thôi nha
10. Lab: DOM XSS using web messages
Lần này có web mới rồi :v
Đây là dạng DOM-based XSS, Portswigger cũng cung cấp cho ta 1 server exploit để send request :v
Sau khi mò xem source thì mình thấy có đoạn script như thế này
Người ta đã dùng innerHTML để đưa dữ liệu vào DOM mà không có 1 đoạn code kiểm tra nào cho nên có thể dễ dàng inject XSS vào.
Thì như tiêu đề của bài lab là DOM XSS using web message cho nên chúng ta sẽ đi tới server exploit để thực hiện send request.
Body sẽ như thế này, chúng ta sẽ nhúng iframe vào, khi load iframe này lên sẽ thực thi đoạn postMessage nhé (còn postMessage là gì thì các bạn tự google nha), sau đó alert cookie sẽ hiện lên.
Sau khi Store rồi Deliver Exploit xong ta sẽ xem kết quả exploit
Đoạn alert sẽ xuất hiện vì src của thẻ img inject vào bị lỗi
Ví dụ từ W3school:
Tổng Kết
Vậy là mình đã thực hành và giải thích xong 10 Labs về XSS giúp các bạn hiểu hơn về các kỹ thuật khai thác XSS đối với từng loại phổ biến hiện nay.
Bài viết đến đây là hết, nếu có thắc mắc hay sơ sót trong lúc viết bài mong mọi người góp ý để bài viết sau được tốt hơn ạ!!
Tham Khảo
- XSS: https://portswigger.net/web-security/cross-site-scripting
- CheatSheet 2021 By PortSwigger: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet