pikachu靶场实战之XSS漏洞(2)
XSS(跨站)漏洞概述
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写”CSS”冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
- 反射型XSS;
- 存储型XSS;
- DOM型XSS;
XSS漏洞的形成原因是由于程序对输入和输出没有进行合适的处理,使得精心构造的字符在前端被浏览器当做有效代码而执行。
0x01 反射型XSS漏洞(get/post)
反射型XXS是一种非持久性的攻击,它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的目的。这里插入的恶意代码并没有保存在目标网站,需要引诱用户点击一个链接到目标网站的恶意链接来实施攻击。
第一题 <script>alert(1)</script>
代码输入不进去,查看源代码可知是前端对字符数做了限制,<input class="xssr_in" type="text" maxlength="20" name="message">
直接将maxlength改成100即可。
成功弹出。
第二题是登录后,输入<script>alert(1)</script>
也是能弹出,查看源代码。
代码中就是将前端传入的参数原封不动的执行了,就存在xss漏洞。
0x02 存储型xss
存储型xss 顾名思义就是恶意脚本会同正常信息一起被存到数据库或者文件中,等到用户在访问这个页面时就会成为受害者,这种漏洞常见于论坛、博客以及留言板。
直接上payload。
重新加载下页面,依旧会弹出。也是说每个访问该页面的用户都会受到攻击。
0x03 DOM型xss
DOM 型 XSS 其实是一种特殊类型的反射型 XSS,它是基于 DOM 文档对象模型的一种漏洞。
DOM 就是一个树状的模型,你可以编写 js 代码对树进行操作,比如获取节点的名称,增加一个元素等。DOM树长这样:
再回到题目本身,可以发现输入框输入的字符为未经过处理而是直接拼接的,代码是"<a href='"+str+"'>what do you see?</a>"
,那么直接闭合前面的a标签,然后插入恶意代码即可。代码如下:
1 |
|
onmouseover事件:指鼠标移动都某个指点的HTML标签上,会出现什么效果。
onmouseout事件:指鼠标移出某个指点的HTML标签后,会出现什么效果。
好,成功弹出。
0x04 xss之盲打
xss盲打在我的理解就是遇见输入框就先输入个弹窗脚本试试,或许就有什么惊喜。
果不其然,在后台就有了新发现,弹窗成功。
0x05 xss之过滤
废话不多说,直接上payload<script>alert(1)</script>
,结果不出所料,直接被吞了。
推测是做了过滤,那就变一种方式再来。
看源码实际是利用正则将“<script”替换为空。直接全部换成大写在弹出,
1 |
|
0x06 xss之htmlspecialchars
查询资料可知,php的htmlspecialchars()函数是将预定义的字符转换成HTML实体,HTML实体是浏览器用来代替特殊的字符的一种代码。有时候需要在文档内容中这些字符,但是不想让它们作为HTML被处理,为此应该使用这些实体(比如将 <
小于号转换成<;
)。比如:
预定义的字符是:
- & (和号)成为 &
- “ (双引号)成为 “
- ‘ (单引号)成为 ‘
- < (小于)成为 <
- > (大于)成为 >
另外,函数常用的参数有:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
可以看到,我们的nihao<>h"#'hha
被转换成了nihao<>h\"#\'hha
,其中单引号并没有被转义,那么我们可以用单引号闭合href结合其他语句进行注入。
1 |
|
0x07 xss之href输出
这个直接看源码:
源码中使用了htmlspecialchars的ENT_QUOTES,双引号及单引号以及左右尖括号均会被转义,可以使用javascript伪协议来执行js,payload如下:
1 |
|
伪协议不同于因特网上所真实存在的协议,如http://,https://,ftp://,
而是为关联应用程序而使用的.如:tencent://(关联QQ),data:(用base64编码来在浏览器端输出二进制文件),还有就是javascript:
我们可以在浏览地址栏里输入”javascript:alert(‘JS!’);”,点转到后会发现,实际上是把javascript:后面的代码当JavaScript来执行,并将结果值返回给当前页面。
0x08 xss之js输出
这道题的特点在于我们的输入被带入到js中,对我们输入的数据进行判断再动态生成内容。那么我们注入的话,可以使用单引号以及script标签闭合掉前面的script,再插入自己的注入代码。如:
1 |
|
成功弹出!!!
0x09 总结
形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理: 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入; 输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
XSS常见Payload
1
2
3
4
5
6
<script>alert("xss")</script>
<script>alert(document.cookie)</script>
<a href=javascript:alert(111)>
<body onload=alert('XSS')>
<img src=x onerror=alert(1)>
<div onclick="alert('xss')">