Level One
Chúng ta có một form yêu cầu nhập tên. Sau khi nhập thì tên được hiển thị ở bên dưới.
Nếu xem page source thì ta thấy tên đã nhập sẽ được reflected vào code:
Ta có thể nhập vào payload sau và gửi request.
`<script>alert('THM');</script>`
Khi nhận được request, server sẽ phản hồi lại và payload sẽ được thực thi.
Level Two
Tương tự với level 1, nhưng lần này input nhập vào lại bọc bởi một thẻ <input>
.
Xem page source thì có thể thấy được input nhập vào là giá trị của attribute value
của thẻ <input>
.
Để thực hiện XSS, ta cần đóng attribute value
và đóng thẻ <input>
. Sử dụng payload như sau:
"><script>alert('THM');</script>
Level Three
Tương tự với level 2 nhưng lần này input lại được bọc ở trong một thẻ <textarea>
.
Ta cần đóng thẻ <textarea>
thì mới có thể thực thi được mã độc. Dùng payload sau:
</textarea><script>alert('THM');</script>
Payload trên sẽ chuyển page source từ:
Thành:
Level Four
Input nhập vào được reflect vào trang web dưới dạng code JavaScript.
Ta escape câu lệnh JavaScript bằng cách dùng payload:
';alert('THM');//
Hai ký tự ';
giúp đóng lại câu lệnh JavaScript và ký tự //
giúp biến những đoạn code ở sau thành comment và khiến chúng không thể được thực thi.
Page source sau khi chèn payload sẽ có dạng như sau:
Level Five
Với level này, chữ script
ở trong payload sẽ bị lược bỏ, cho biết rằng server có sử dụng filter để lọc ra những ký tự nguy hiểm.
Khi một chuỗi bị xóa khỏi payload, ta có thể sử dụng trick sau:
Payload ban đầu:
<sscriptcript>alert('THM');</sscriptcript>
Payload cần dùng:
<sscriptcript>alert('THM');</sscriptcript>
Payload sau khi filter:
<script>alert('THM');</script>
Level Six
Tương tự với level 2, ta cần escape khỏi một giá trị thuộc tính của một thẻ nào đó. Ta có thể thử với payload:
"><script>alert('THM');</script>
Tuy nhiên payload này không thành công do ký tự >
và <
đã bị loại bỏ nên ta không thể escape khỏi thuộc tính src
của thẻ <img>
:
Đối với trường hợp này, ta có thể sử dụng một thuộc tính khác của thẻ <img>
mà cụ thể là thuộc tính onload
. Thuộc tính này cho phép thực thi code khi hình ảnh được tải vào trang web.
Dùng payload sau:
/images/cat.jpg" onload="alert('THM');
Page source sẽ trở thành:
Polyglots
Một XSS polyglot là một chuỗi văn bản mà có thể escape các thuộc tính, thẻ và vượt qua mọi filter. Chúng ta có thể polyglot bên dưới cho tất cả 6 level ở trên.
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */onerror=alert('THM') )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert('THM')//>\x3e
Flag
Success
THM{XSS_MASTER}