---
# System prepended metadata

title: XSS lab portswigger

---

# XSS lab portswigger
---
# Lab: Reflected XSS into HTML context with nothing encoded
![image](https://hackmd.io/_uploads/BJWkKARfxx.png)

- Đề bài yêu cầu thực thi alert(1)
- --
## **Attack**
![image](https://hackmd.io/_uploads/rkoftCCGxl.png)
- payload: `<script> alert(1) </script>`
- Kết quả:

![image](https://hackmd.io/_uploads/H1_rKRCzgg.png)

---
# Lab: Stored XSS into HTML context with nothing encoded
- Đề bài: Lab: Stored XSS into HTML context with nothing encoded
![image](https://hackmd.io/_uploads/ryYRKCRzge.png)

---
## Attack
- Ở dưới mỗi ảnh sẽ có chức năng view post để xem kỹ hơn về thông tin bài về và có thể comment được bài bài viết

![image](https://hackmd.io/_uploads/BkKE5AAfxl.png)
![image](https://hackmd.io/_uploads/HkBB5RCMxe.png)
- Ta sẽ thử chức năng cmt xem liệu có thể thực thi xss không?
![image](https://hackmd.io/_uploads/Sk5K5RAfgx.png)
- Kết quả:

![image](https://hackmd.io/_uploads/ry1p5RRfll.png)

---

# Lab: DOM XSS in `document.write` sink using source `location.search`
- Đề bài: 
![image](https://hackmd.io/_uploads/SyoMoZeQlg.png)
---
### Attack
- Bài lab này có chức năng search cho phép phép chúng ta tìm kiếm theo từ khóa

![image](https://hackmd.io/_uploads/HkRgnblQex.png)

- Ta sẽ inspect lên để nhìn rõ hơn trang web đã làm gì khi search
![image](https://hackmd.io/_uploads/B1pZC-e7lx.png)

```
<script>
    function trackSearch(query) {
    document.write('<img src="/resources/images/tracker.gif?searchTerms='+query+'">');
    }    
    var query = (newURLSearchParams(window.location.search)).get('search');
    if(query) {
        trackSearch(query);
    }
</script>
 
```
```
- document.write: ghi nội dung ra
- location.search: Trả về phần query string trong URL 
                    tức là mọi thứ sau dấu ?, bao gồm cả dấu ?. 
```

--- 
- giờ ta sẽ sử dụng kỹ thuật HTML injention để thực thi lệnh như ý muốn.
- Payload: `"><svg onload=alert(1)>`
- --
- Ban đầu: 
`document.write('<img src="/resources/images/tracker.gif?searchTerms='+query+'">');`
- --
- Sau injection thì sẽ trở thành như sau: 
`document.write('<img src="/resources/images/tracker.gif?searchTerms="><svg onload=alert(1)>">');`
- Đóng thẻ img lại vào gắn thêm thẻ svg và thực hiện sau khi load lại trang. 
![image](https://hackmd.io/_uploads/B1EUIGlQgx.png)



---

# Lab: DOM XSS in innerHTML sink using source location.search
- **Đề bài**
![image](https://hackmd.io/_uploads/SJAuemxQll.png)

---
## Attack

![image](https://hackmd.io/_uploads/Sy577Xgmel.png)

- Khi xem gói mã nguồn, ta có thể nhận nhận rằng trang web sử dụng innerHTML.
- từ dòng 85 -> 87: lấy ra ID bằng với searchMessage bằng innerHTML
- Dòng 88: lấy ra giá trị search trong URL
- Dòng 89-> 91: kiểm tra giá trị có trống hay không, nếu có thì gọi hàm và hiển thị.


---
- Ta sẽ chèn trực tiếp vào ô search
- Payload: `<img src=1 onerror=alert(1)>`
![image](https://hackmd.io/_uploads/rkw7NXgXxx.png)
- Khi search, trang web sẽ lấy ra `src=1`, nếu không không có thì `onerror` sẽ chạy.
---

- Trang web sử dụng hàm innerHTML nên khi ta chèn payload vào thì nó sẽ trông như sau: 

`<div id="searchMessage">[giá trị CỦA search]</div>`

---
![image](https://hackmd.io/_uploads/S1P9DQg7el.png)

---
# Lab: DOM XSS in document.write sink using source location.search

![image](https://hackmd.io/_uploads/HyUioV_Vlx.png)
- Đề bài cho chúng ta biết rằng trang web sử dụng dụng hàm document.write để đưua data ra page. Hàm document.write sẽ gọi tới hàm data tới từ hàm location.search và bạn có thể sử dụng URL của website để kiểm soát hàm này

---
## Attack
- Khi mở website thì ta thấy web có chức năng search như hình:
 ![image](https://hackmd.io/_uploads/rJsp24uVee.png)
- Ta sẽ thử tìm kiếm bất kỳ 
- Khi ta tìm kiếm, hàm search sẽ trở về kết quả theo text mà ta nhập vào, điều này được thể hiện ở trên URL

![image](https://hackmd.io/_uploads/BJPmaEuNxg.png)
- giờ ta sẽ lợi dụng URL để điều khiển hàm document.write và in ra alert(1)

![image](https://hackmd.io/_uploads/ry9F0Nd4ee.png)
---

# Lab: DOM XSS in jQuery anchor href attribute sink using location.search source

![image](https://hackmd.io/_uploads/Hy6NYTCElg.png)
- bài này chứa lỗ hổng khi back về trang trước khi sử dụng chức năng submit feeback
## attack
- Đoạn mã gây ra lỗi

```
   <div class="is-linkback">
        <a id="backLink">Back</a>
    </div>
    <script>
        $(function() { $('#backLink').attr("href", 
        (new URLSearchParams(window.location.search)).get('returnPath'));
        });
    </script>
```
- `$(function() { ... });` : đây là cách viết rút gọn của ` $(document).ready(...)`


# Lab DOM XSS in jQuery selector sink using a hashchange event
### Đề bài:
![image](https://hackmd.io/_uploads/SkgHsCfHel.png)
- Trang web sử dụng hàm loction.hash làm đầu vào cho hàm $() cảu jquery, khiến nó bị DOM BASE XSS nếu không lọc dữ liệu đầu vào.
## Phân tích code
 ```
<script>
    $(window).on('hashchange', function(){
    
    var post = $('section.blog-list h2:contains(' +
        decodeURIComponent(window.location.hash.slice(1)) + ')');
        
    if (post) post.get(0).scrollIntoView();
    });
</script>
```

---
- **` $(window).on('hashchange', function()`** : Đăng kí sự kiện hashchage, tức là khi phần #hash thay đổi thì sự kiện này sẽ được kích hoạt.
- Ví dụ:
 ```
 
- URL: http://example.com/index.html#section1
- Location.hash: #section1
```

---
- **`window.location.hash.slice(1)`** : lấy ra phần hash và loại bỏ `kí tự đầu tiên #`.
- Ví dụ:
```
- URL: http://example.com/index.html#section1
- Location.hash: #section1
- window.location.hash.slice(1): #section1
```

---
- **`decodeURIComponent()`** : giải mã các kí tự được mã hóa trong URL.
- Ví dụ:

`%02 = khoảng trắng `

---
- **`$('section.blog-list h2:contains()')`** : sử dụng jquery để liệt kê ra tất cả các thể h2 có section class = blog-list mà chứa chuỗi chỉ định từ người dùng.

- Ví dụ: 
```
<section class="blog-list">
  <h2>Welcome to my blog</h2>
  <h2>Another post</h2>
</section>
```

=>

`$('section.blog-list h2:contains(Welcome)')`

---


- **`if (post) post.get(0).scrollIntoView();`** : nếu tìm thấy thẻ s2 phù hợp thì cuộn trang tới phần tử đó.
---

## Attack

---
**Payload:**
- Vì đoạn code phụ thuộc và `location.hash`, bạn chỉ cần đựa paylload URL vào như sau:
 `#<img src=x onerror=print()>`
- Nhưng đoạn code có sử dụng `h2:contains()` nên HTML sẽ không được tạo ra nếu không có thẻ` h2` phù hợp khớp với nội dung. Tuy nhiên, vẫn có thể inject nếu nội dung `chứa dấu nháy kết thúc selector sớm`.
- Payload đầy đủ:

`<iframe src="https://YOUR-LAB-ID.web-security-academy.net/#')<img src=xyz onerror=print()>"></iframe>`

**- Cách hoạt động:**

1. Window.loctation.hash.slice(2) sẽ trả về:


`')<img src=xyz onerror = print()>`

2. Sau khi decodeURLComponent và gắn vào selector:

$(`'section.blog-list h2:contains('` + `" ') "` + `'<img ...>'` + `')'`  );

---
 ## **Cách 1: chèn trực tiếp payload vào URL trang web**

- Payload: `#'<img src=x onerror=print()>'`
- lúc này URL sẽ trông như sau:

`https://URL/#' <img src=x onerror=print()>'`
- Sau khi enter thì ta nhận thấy payload đã hoạt động:

![image](https://hackmd.io/_uploads/rJYOjZBHgl.png)

---

## Cách 2: sử dụng exploit server của burp
- khi sử dụng exploit server của burp, ở phần body, ta sẽ chèn vào body 1 payload như sau để gửi đi tới trang web.
- `<iframe src="URL_Lab/#" onload="this.src+='<img src=x onerror=print()>'"></iframe>`
- Body sẽ trông như sau:

![image](https://hackmd.io/_uploads/BJ0kp-HSlg.png)

- Và sau khi gửi:

![image](https://hackmd.io/_uploads/B1wXTZHSge.png)

---

# Lab: Reflected XSS into attribute with angle brackets HTML-encoded

## Đề bài:
![image](https://hackmd.io/_uploads/HyEP5ISSgg.png)

- ở bài lab này, đoạn code sẽ encode những ký tự nguy hiểm như <>, nghĩa là bạn sẽ không thể trực tiếp chèn các thẻ script. Nhưng vẫn có thể sử dụng các thuộc tính(attribute) nguy hiểm có sẵn trong thẻ HTML.
---
## Attack

### **Test chức năng**: 
- đầu tiên, ta sẽ test thử chức năng tìm kiếm

![image](https://hackmd.io/_uploads/HkN0iISBle.png)

- sau khi search, ta sẽ mở src code của trang này lên và xem nó hoạt động như thế nào

---

### **Phân tích code**

- sau khi mở src code thì ta thấy có dòng này:

`<input type=text placeholder='Search the blog...' name=search value="duong">`

- dòng HTML sử dụng tham số search được truyền vào từ URL để đưa vào thuộc tính value của thẻ input.
`value="duong`
- `nếu không mã hóa định dạng đầu vào`, attacker có thể `chèn thẳng vào thuộc tính value các input độc hại`, tạo điều kiện cho tấn công `reflected xss`.

---
### Cách tấn công

- giả sử attacker gửi cho trình duyệt URL sau:

`https://target.site/?search=" onmouseover="alert(1)`

- thì trình duyệt sẽ render:

`<input type=text placeholder='Search the blog...' name=search value="" onmouseover="alert(1)">`

- lúc này, trình duyệt sẽ thực thi alert(1) mỗi khi bạn di chuột vào 1 phần tử nào đó.

### Kết quả thực hành
![image](https://hackmd.io/_uploads/Bk1EyPrrex.png)

- một số thuộc tính khác:


- onmouseover: thực thi khi người dùng di chuyển chuột vào phẩn tử trên trang web.
- onfocus: thực thi khi người dùng bấm vào ô tìm kiếm.
- onclick: Khi người dùng click chuột
- ...v..v...

----

# Lab: Reflected XSS into a JavaScript string with angle brackets HTML encoded

## Đề bài
![image](https://hackmd.io/_uploads/r1mgveDBge.png)
- bài lab này yêu cầu bạn khai thác lỗ hổng `REFLECTED XSS` khi dữ liệu người dùng được phản hồi vào trong chuỗi javascript và các dấu <> `đã được mã hóa HTML`, khiến bạn không thể chèn trực tiếp các thẻ `<script> hay HTML `

## Attack

### Phân tích lỗ hổng

---

1. Khi bạn tìm kiếm test thì nó sẽ được phản hồi trong js nhưu sau:

```
<script>
    - var searchTerms = 'test';
    - document.write('<imgsrc="/resources/images/tracker.gif?searchTerms=
    '+encodeURIComponent(searchTerms)+'">');
</script>
```
2. Dữ liệu của bạn nằm trong chuỗi '...' nên nếu bạn muốn injention bạn phải:

- Thoát khỏi dấu nháy ''
- Chèn javascript tùy ý
- Vô hiệu hóa phần còn lại để không gây lỗi

3. Trong bài này, bạn không thể dùng `<script>` hoặc các thẻ HTML vì `ký tự <>` đã được mã hóa.
---
### Payload khai thác

- Payload: '-alert(1)-'
- Vì sao lại chèn payload này. Nếu server tạo mã sau khai bạn tìm '-alert-' thì trình duyệt sẽ hiểu như sau:
    - '          => kết thúc chuỗi
    - -alert(1)- => thực thị javascript
    - '          => bắt đầu chỗi mới

### kết quả 
- ta sẽ nhập payload vào ô search

![image](https://hackmd.io/_uploads/BJtHhlvBgg.png)
    
- và kết quả sẽ là thực thi alert(1)

![image](https://hackmd.io/_uploads/r1tDhgwBlg.png)

# Lab: DOM XSS in document.write sink using source location.search inside a select element

## Đề Bài
 ![image](https://hackmd.io/_uploads/S1A76MyDll.png)

- Thực hiện DOM-BASE XSS bằng cách khai thác location.search tron document.write bên trong thẻ `<select>`

---

## Phân tích code
![image](https://hackmd.io/_uploads/SJoGg41vgx.png)
- dữ liệu sẽ được lấy thông qua `storedId`
- Dữ liệu của storedId:

![image](https://hackmd.io/_uploads/SyqYxPyvge.png)


---
- Khi ta tìm kiếm với URL là:`/product?productId=1`
- thì locationsearch sẽ trả về là ![image](https://hackmd.io/_uploads/ryFfmNyvlx.png)
- Vậy sẽ ra sao chèn thêm dữ liệu vào biến storeID để gửi dữ liệu độc hại đến store
- Để có thể gắn được dữ liệu độc hại thì ta cần phải thoát khỏi thẻ `<option> và <select>` 
---
### Playload Attack
    product?productId=1&storeId=</select></option><img src=1 onerror=alert(1)>
- Ta sẽ thoát khỏi các thẻ và gắn thêm code sẽ thực thị alert(1) khi k tìm thấy src img = 1
---
![image](https://hackmd.io/_uploads/SJMZUDyDee.png)
khi ta dán payload và tìm kiếm thì hàm location.search sẽ thực thi thẻ img kia


---

# Lab: DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded

## Đề Bài
![image](https://hackmd.io/_uploads/Hk4ZLdyvgl.png)
- khai thác angular thực thi xss dù có encoded html trước
- Trang web sử dụng angular
- Biểu thức angular được render từ nguồn không đáng tin cậy
- Các ký tự nguy hiểm như < (&lt;), " (&quot;) đã được HTML-encoded, nhưng AngularJS vẫn sẽ xử lý nội dung sau khi decode.
- Bài thực hành này bao gồm một lỗ hổng mã hóa chéo trang dựa trên DOM trong một 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, quét nội dung của các nút HTML chứa thuộc tính ng-app (còn được gọi là chỉ thị AngularJS). Khi một chỉ thị được thêm vào mã HTML, bạn có thể thực thi các biểu thức JavaScript trong cặp dấu ngoặc nhọn. Kỹ thuật này hữu ích khi mã hóa dấu ngoặc nhọn.

Để giải quyết bài thực hành này, hãy thực hiện một cuộc tấn công mã hóa chéo trang bằng cách thực thi một biểu thức AngularJS và gọi hàm cảnh báo.

---
## Phân tích Payload
- Angular cho phép thực hiện js qua biểu thức, đây là cách để chạy js mà không cần thẻ `<script>`
- Khai thác thông qua biểu thức {{...}} được chèn vào DOM thông qua `ng-app` hoặc vùng có biểu thức angular để thực thi mã javascript.

---
### Bản chất lỗi
1. Ứng dụng lấy giá trị bạn nhập vào tìm kiểm và chèn nó vào DOM
2. Dữ liệu nằm trong vùng angular xử lý. Vd: bên trong thẻ `ng-app`
3. HTML tự độn encode các ký tự đặc biệt nhưng angular vẫn xử lý các biểu thức bên trong {{...}} sau đó DOM render

---
### Tại sao payload này hoạt động
`{{ $on.constructor('alert(1)') () }}`
1. {{..}} : cặp dấu ngoặc dùng để thực thi biểu thưc bên trong nó, AngularJS expression binding
2. $on : là một phương thức có mặt trong scope 
3. $on.constructor : $on là 1 hàm trong js vì vậy sẽ trả về kết quả là function
4. Cuối cùng sẽ trả về là function('alert(1)')(), dấu () ở cuối nhằm chỉ việc gọi đến hàm và thực thi 

```
$on.constructor('alert(1)')()
→ Function('alert(1)')()
→ alert(1)
```
---
# Lab: Reflected DOM XSS
## Đề Bài 
![image](https://hackmd.io/_uploads/HkuFm2gDgl.png)
- Lỗ hổng DOM XSS phản chiếu xảy ra khi ứng dụng phía máy chủ xử lý dữ liệu từ một yêu cầu (request) và phản hồi lại dữ liệu đó trong phản hồi (response). Một đoạn mã JavaScript trên trang sau đó xử lý dữ liệu được phản chiếu này theo cách không an toàn, và cuối cùng ghi nó vào một vị trí nguy hiểm trong DOM.

---
## Phân tích code

Hàm eval
- Trong response trả về khi tìm kiếm, ta nhận thấy trong file js này sử dụng hàm eval()
![image](https://hackmd.io/_uploads/BktuEngDle.png)
- JSON response được xử lý bởi eval(), eval() sẽ thực thi 1 chuỗi như thế nó là mã javascript thực thụ
- Giả sử trang web tải API và trả về JSON
```
![Uploading file..._cs73h430h]()
```
![image](https://hackmd.io/_uploads/SJhgL3gvel.png)

- Thay vì dùng JSON.PARSE(), trang lại sài như sau:

`var data = eval("(" + responseText + ")");`

-> Dữ liệu `JSON` sẽ được nối thẳng vào `javascript` và được `eval()` chạy

- Vấn đề tiếp theo kà ta có thể kiểm soát được responseText. Để kiểm soát responseText thì ta phải kiểm soát được searchTerm, như sau:
`{"searchTerm":"XSS","results":[]}
 <JSON>`
- Nếu như ta gửi payload như sau:
`\"-alert(1)}//`
- Khi server phản hồi:
`{"searchTerm":"\\"-alert(1)}//","results":[]}`
- Sau khi nối vào eval, ta có:
    `eval('({"searchTerm":"\\"-alert(1)}//","results":[]})');`
---
Tại sao phải chèn`\"`

- Vì chuỗi phản hồi từ server không chạy trực tiếp trong eval(), mà được gói trong JSON trước → sau đó JSON được nối vào chuỗi JS và eval() chạy → nên attacker phải vượt qua cú pháp JSON trước, rồi mới có cơ hội thực thi mã JS trong eval.


- payload của bạn nằm trong một chuỗi JSON, và bạn phải vượt qua cả cú pháp JSON + JS, mới thực thi được mã độc.

- Khi server tạo ra JSON, nó tự động escape các giá trị đặc biệt

```
Ký tự gốc	Trong JSON
"	             \"
\	             \\
```
---
### Attack
