一.前言
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
二.原因
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
三.xss攻击
1.反射型xss(get)
(1)打开页面之后,我们看见Which NBA player do you like?
(2)我们查看一下提示输入kobe,我们打开开发者工具可以看见——<img src="">,知道是xss攻击
(2所以我们使用最基础的xss攻击,在上一篇说过什么是最基础的xss攻击,我们输入到一半发现无法输入,我们修改maxlength="200",我们可以看到弹窗
2.反射性xss(post)
我们先讲一下什么是post利用方式:POST型的漏洞一般是使用表单方式进行提交,无法直接使用
URL进行攻击。
xss反射型(post)利用方式
- 攻击者伪造表单自动提交页面
- 用户request伪造页面,触发表单
- 页面js自动post表单数据,触发xss。访问存在post型xss漏洞的网站
- 执行js窃取cookie
- 攻击者利用cookie伪造用户登录,造成危害
(1)我们打开页面发现是一个登录页面,我们输入用户名和密码——admin/123456
(2)登录进去之后, 我们输入kobe,发现和前面一模一样,所以我们输入<script>alert(/xss/)</script>
3.存储型xss
存储型xss一般发生在留言板或者标签里面,而且一直存储在服务器里面,只要刷新就会弹窗
(1)打开之后是一个留言板,
(2)我们直接输入<script>alert(/2/)</script>,为了和之前用区分,因为我之前测试过xss,害怕混合
(3)我们也可以使用<img src=1 οnerrοr=alert(/6/)>,进行攻击 <img src>是图片发送攻击
4.DOM型xss
我们先了解什么是DOMxss,DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。
DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
可能触发DOM型XSS的属性:
document.referer属性
window.name属性
location属性
innerHTML属性
documen.write属性
(1)我们直接输入<script>alert(/xss/)</script>,可以看到没有发生弹窗
(2)我们查看代码,可以知道要使用闭合标签,'>来闭合前面的<a href=>,我们使用'><img src=1 οnerrοr=alert(/xss/)>使<img src=1 οnerrοr=alert(/xss/)>成为一个独立的字符
(3)我们使用'><img src="https://www.baidu.com/img/bd_logo1.png">,弹出百度的页面
5.DOM型xss_x
这个和前面的DOM型差不多,只是这个要点击一个链接才可以弹窗
(1)我们输入'><img src=1 οnerrοr=alert(/xss/)>,然后就会出现链接
(2)我们点击链接,就会弹窗
6.xss盲打
(1)盲打,也就是说只有后台才能看到输入的内容,从前端是无法判断是否存在XSS的。一般会联合beef等平台,利用xss盲打对获取管理员的cookie信息等,之后对带着一连串的攻击套路…
(2)我们输入<script>alert(/xss/)</script>,看到页面没有反应
(3)页面虽然没有回显,但是肯定会提交到后台,如果后台没有做严格的过滤的话,管理员登录后台管理页面的时候,如果后台把我们的内容输出,那么后台管理员就有可能会遭受到我们的的XSS攻击,点一下提示把文件路径加入到url后面进入登录后台,使用默认账号登录,发现js语句确实生效了。
(4)我们也可以插入<img src="">
7.xss之过滤
1)前端绕过,直接抓包重放,或者修改html前端代码(前端的过滤只能作为辅助手段,是特别容易被绕过的)
2)大小写(一个大写字母一个小写字母)
3)拼凑<scri<script>pt>alert(111)</scri></script>pt>
(1)我们先输入最基础的xss,可以看到被过滤了
(2)我们使用大小写绕过<SCRipt>alert(/xss/)</SCript>
8.xss之htmlspecialchars
htmlspecialchars() 函数把预定义的字符转换为HTML实体,预定义的字符是:
- &(和) 转为 &
- "(双引号) 转为 "
- '(单引号) 转为 '
- <(小于号) 转为 <
- >(大于号) 转为 >
(1)我们输入<script>alert(/xss/)</script>,看到有'>,我们要使用闭合标签
(2)我们使用闭合'><script>alert(/xss/)</script>,可以看到<>被过滤了
(3)所以我们使用' οnclick=alert(1111) '
9.xss之href输出
(1)我们输入最基础的xss,看见有闭合标签
(2)发现是 htmlspecialchars() 过滤, 但是这次过滤了单引号:
服务端进行了两次关键的处理:
- 输入的时候只允许 http 或 https 开头的协议,才允许输出
- 其次再进行htmlspecialchars处理
这里也可以用JavaScript伪协议来绕过:javascript:alert(xss) // JavaScript伪协议
(3)点击链接即可
10. xss之js输出
它会把我们的输出放到js中,然后对这个变量进行判断,然后再输出,我们可以构造一个闭合,首先一个单引号闭合本身$ms的语句。然后使用一个《/script》闭合页面的<script>然后插入文明自己的js ('</script><script>alert('xss')</script>)
</script><script>alert(/xss/)</script>
pikachu-master的xss攻击到这里也就结束了。