---
# System prepended metadata

title: 'BlueHens CTF 2023 Write Up - Web Category - Why lie: Blind SQL'

---

 Ngay từ tên gọi, ta đã nhận biết Challenge này thuộc dạng SQLi, cụ thể hơn là Blind SQLi. Về cơ bản để giải được challenge này, ta sẽ cần thực hiện các bước như sau:
 +) Tìm được tên các bảng trên Database
 +) Từ các bảng đã tìm được, ta tiếp tục tìm các cột thuộc về bảng đó.
 
 Nhìn chung phía trên là trình tự cơ bản của đa số các bài Blind (theo trải nghiệm của mình), cái khó của các bài thuộc dạng này là đòi hỏi cần phải thạo các syntax của SQL, và trước khi nhắc tới syntax thì ta phải biết DBMS (Database Management System) của challenge là. Mà ta biết rằng có rất nhiều DBMS, chẳng hạn như: MySQL, PostgreSQL, SQLite,...
 
 May mắn thay, ở bài này ta biết được ngay rằng challenge này sử dụng SQLite để xây dựng cơ sở dữ liệu:
 ` $dbhandle = new PDO("sqlite:blind.db") or die("Failed to open DB");`
 ` if (!$dbhandle) die ($error);`
 
 Trước khi tiếp tục, ta cần nhận biết rằng khi câu lệnh truy vấn sql được thực thi với kết quả trả về khác NULL, server sẽ trả về "Good guess !", nếu không thì sẽ trả về "Nope".
 
 Okay, let's get our hands dirty =))
 
#  1) Tìm được tên các bảng trên Database
 
 ![](https://hackmd.io/_uploads/HkNreA3z6.png)
 
 Lúc này bên server sẽ thực hiện câu lệnh:
 
 `select * from numbers where value=3 or length((select group_concat(name) from sqlite_master where type='table'))=14`
 
 Phía trên chỉ là ví dụ của mình, còn length ở đây chưa chắc đã bằng 14, để biết chính xác length bằng bao nhiêu, ta (hiển nhiên) cần phải bruteforce =)). Mình thực hiện Bruteforce bằng Burp Intruder.
 
 Giải thích ngắn gọn thì group_concat(name) được mình dùng để gom tên của tất cả các bảng vào một row duy nhất.
 
 Sau khi đã dò ra được độ dài của chuỗi kết quả được trả về từ lệnh select group_concat, ta tiến hành dò tìm lần lượt từng ký tự.
 
 ![](https://hackmd.io/_uploads/H1TwM03zp.png)
 
 Lúc này bên server sẽ thực hiện câu lệnh:
 
 `select * from numbers where value=3 or substr((select group_concat(name) from sqlite_master where type='table'),6,1)='t'`
 
 Để dò tìm, mình sử dụng Burp Intruder (set chế độ chuyển sang: Cluster Bomb)
 
 Sau hai bước này, ta tìm được bảng 'secret'
 
#  2) Tìm cột thuộc bảng 'secret'
 
 Tương tự như lúc tìm bảng, câu lệnh lúc này cần thực hiện sẽ là: 
 
 `select * from numbers where value=3 or length((select sql from sqlite_master where type='table' and name='secret'))=14`
 
 Lúc này, mình tìm được độ dài của kết quả trả về từ lệnh select sql là 31. Tới đây, ta lại tiếp tục thực hiện tương tự như ở bước tìm bảng, tuy nhiên mình sẽ thực hiện bruteforce bằng python thay vì Burp Intruder, lí do là vì việc bruteforce để duyệt cả 31 kí tự tốn rất nhiều thời gian, nên mình sẽ cần tự custom lại tool của mình, mục đích là để tự động chuyển sang đoán ký tự ở vị trí tiếp theo khi đã tìm được đúng kí tự ở vị trí hiện tại thay vì vét cạn toàn bộ như khi dùng Burp Intruder.
 
 ![](https://hackmd.io/_uploads/SkveORhza.png)
 
 Lưu ý ở bước này, ta cần chú ý các ký tự thuộc mảng characters, ở đây mình chỉ dùng tới các kí tự thuộc bảng chữ cái và các chữ số từ 0-9, tuy nhiên bạn sẽ cần thêm các dấu : hay ; để có các ký tự ngăn cách.
 
 Nếu thực hiện đúng các bước trên, ta sẽ tìm được cột tên flag thuộc bảng secret. Còn lại việc thực hiện tìm flag sẽ tương tự như lúc ta tìm bảng, câu lệnh lúc này cũng đơn giản hơn nhiều nên mình sẽ để phần việc còn lại cho bạn đọc và dừng writeup lại ở đây =)).
 
 Writeup viết vội nên có lẽ vẫn còn thiếu xót hoặc có đôi chỗ hơi khó hiểu, ae có thắc mắc gì có thể ib mình trao đổi nhé =)) 
 
 Peace =)) !!!



