Đăng trong CTF, Hacking

XSS – Cross Site Scripting – [part 2 – Bypass Filters]

Ở phần 1, tôi đã giới thiệu một số kiến thức cơ bản về XSS. Trên thực tế, các dev thường sẽ áp dụng các bộ lọc (filter) hoặc chuẩn hóa input (sanitize) để ngăn chặn XSS attack. Tôi sẽ giới thiệu các filter hay gặp và cách bypass.

 


1. Filter thẻ

Ví dụ server như sau:

Screenshot from 2019-07-30 14-50-47.png

Server đã loại bỏ tất cả input có chứa <script. Bypass đợn giản bằng cách thay <script thành <SCRIPT hoặc <ScRiPt, …

Screenshot from 2019-07-30 14-54-09.png

 


2. Filter thẻ (case insensitive)

Screenshot from 2019-07-30 14-56-04.png

Payload ở trên không thực hiện được. Bypass bằng cách:

Screenshot from 2019-07-30 16-04-12

Hoặc không cần dùng thẻ . Có rất nhiều thẻ HTML khác có thể thực thi script. Một số ví dụ:

Screenshot from 2019-07-30 15-53-17.png

Thậm chí ta có thể chèn thẻ có tên tùy ý:

Screenshot from 2019-07-30 15-54-18.png

Các browser khác nhau có cách xử lý các thẻ HTML khác nhau đôi chút. Do đó một số payload trên chỉ hoạt động trên một loại browser cụ thể hoặc ở 1 số version của browser.

Screenshot from 2019-07-30 15-41-18.png

 


3. Filter kí tự space

Screenshot from 2019-07-30 16-32-06.png

Bypass:

Screenshot from 2019-07-30 16-32-42.png

 


4. Filter kí tự ‘, “, `

Screenshot from 2019-07-30 16-48-58.png

Payload:

Screenshot from 2019-07-30 16-44-23.png

 


5. Filter Script code

Screenshot from 2019-07-30 17-15-11.png

Bypass: Dùng Unicode character

Screenshot from 2019-07-30 17-15-39.png

Hoặc tạo chuỗi động (các payload dưới đây để bypass filter cụm ‘alert’):

Screenshot from 2019-07-30 17-06-05.png


6. Sanitize kí tự quote, doublequote trong string

Screenshot from 2019-07-30 17-34-58.png

Server phát hiện kí tự double quote và sanitize bằng cách thêm dấu \ phía trước.

Bypass bằng \”, kí tự \ đầu tiên sẽ triệt tiêu hiệu quả của dấu \ được chèn vào, nên vẫn có hiệu lực để unquote string.

Screenshot from 2019-07-30 17-45-47.png

 


7. Limit input length

Screenshot from 2019-07-30 18-08-45.png

Bypass: Chuyển Reflected XSS thành DOM based XSS

Screenshot from 2019-07-30 18-28-03.png

Hoặc khi server có nhiều trường bị lỗi XSS, ta sẽ dùng kĩ thuật multi injection:
Screenshot from 2019-07-30 18-17-57.png

Trong đó /* */ là cách để comment trong javascript. Kĩ thuật multi injection cũng được dùng để bypass các bộ lọc khác bằng cách chia nhỏ payload ra thành nhiều phần.

 


Lời kết

XSS filter thì muôn hình vạn trạng. Developper có thể nghĩ ra đủ kiểu filter. Và cách bypass thì cũng đa dạng vô cùng. Ở đây tôi chỉ nêu 1 vài payload bypass điển hình. Bạn đọc có thể tham khảo thêm ở link sau:

https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

https://github.com/masatokinugawa/filterbypass/wiki/Browser’s-XSS-Filter-Bypass-Cheat-Sheet

Còn đây là hướng dẫn cho dev để có thể phát triển một ứng dụng an toàn chống XSS

https://www.owasp.org/images/0/07/Xenotix_XSS_Protection_CheatSheet_For_Developers.pdf

https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md

https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/DOM_based_XSS_Prevention_Cheat_Sheet.md

https://code.google.com/archive/p/browsersec/wikis/Main.wiki

Phần sau, tôi sẽ nói về bộ lọc XSS của browser, cụ thể là XSS Auditor của Google Chrome.

 

 

Bình luận về bài viết này