xss跨站脚本攻击
跨站脚本攻击
先来几个payload,我们要发现是否存在xss,首先就要输入payload,看浏览器是否执行了我们写入的js代码。一般都会有过滤,我们就需要做一些绕过姿势。
<scr<script>ipt>alert('XSS')</scr</script>ipt>
<img src="x" onerror="alert('XSS')"/>
漏洞原理
xss是跨站脚本攻击,攻击者在web页面或者服务器中插入恶意的脚本代码,当其他用户访问该页面时,服务器就会将含有恶意代码的页面响应给用户,用户在浏览器中触发恶意的脚本代码,造成攻击。
漏洞利用
1. 盗取用户cookie,攻击者可以利用用户的cookie进行登录。
2. 获取用户浏览器中密码管理器中的密码
3. 执行弹窗广告。
4. xss和csrf组合拳:
当我们直接利用csrf做修改用户信息等操作时,网站会用一个csrf值来防御csrf,我们可以利用xss与csrf的组合拳,进行利用,首先在可以执行xss的位置,执行xss的代码,获取他的csrf值,之后再绕过csrf的防御进行攻击。
5. 执行用户可以执行的任何操作。
6. 读取用户可以访问的任何数据。
XSS分类
反射型:
通常攻击是一次性的,攻击者构造一个恶意链接,发送给用户,用户点击该链接,就被攻击了。如果是get请求的,直接可以将payload构造到url中。post请求的,我们需要将payload放到vps中,这个payload会获取用户的cookie,并返回给攻击者。攻击者将这个恶意链接发送给用户,用户点击之后,让用户访问我们的vps,从而造成攻击,这个和远程xxe差不多。
存储型:
我们构造的payload直接存储到了后台服务器,攻击者只需要等其他用户访问该页面,访问该页面的所有用户都会被攻击,危害范围广。
DOM型:
利用js脚本对文档对象进行编辑,修改页面dom树。
漏洞测试方法
1. 基本标签和属性没有被过滤
<script>alert(3)</script>
2. 大部分标签和属性被过滤
当大部分标签和属性被过滤后,我们就要通过爆破来确定哪些标签和属性没有被过滤,确定没有被过滤的标签和属性后,进行利用。
爆破时用xss备忘单做为爆破字典:https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
爆破过程可以参考我写的另一个笔记:https://www.cnblogs.com/syroot/p/15884986.html
3. 过滤除自定义标签之外的所有HTML标签
此注入会创建一个带有 ID 的自定义标签x
,其中包含一个onfocus
触发该alert
函数的事件处理程序。URL 末尾的哈希会在页面加载后立即解析此元素,从而alert
调用有效负载。
直接在测试点输入:
<xss id=x onfocus=alert(8) tabindex=1>#x'
4. 过滤了常用标签和属性,但是没有过滤SVG标签和属性。
我们可以爆破一下,看是否过滤了svg标签及其属性,如果没有过滤,我们就可以利用。
<svg><animatetransform onbegin=alert(1)>
绕过方法
1. 输出内容在标签内,能够闭合
需要确定我们输入的内容到底在哪里,最简单的方法就是用burp抓包,发送到Repeater模块,重放攻击,查看输入字符存在位置。
我们可以尝试闭合,再构造我们的payload。
"><script>alert(document.domain)</script>
2. 输出内容在标签内,不能闭合
最常见的就是将尖括号<>进行了过滤或者编码,导致不能闭合,如果可以闭合前面的属性值,就尝试引入新的属性,来执行我们的代码。
如果是在input标签内:
可以利用onmouseover属性:"onmouseover="alert(1)
<input type=text placeholder='Search the blog...' name=search value=""onmouseover="alert(1)">
利用伪协议:如果不能闭合原有的属性值,那就尝试利用伪协议。
<a href="javascript:alert(document.domain)">
3. 输出在script标签内,并且转义了单引号,阻止我们闭合
输出在script标签内,可以先闭合原有的script标签,再构造新的script标签,如果不闭合的话,我们构造的script标签执行不了。
</script><script>alert(1)</script>
4.输出在script标签内,并且对尖括号进行了html实体编码
(1). 直接闭合原来的值,输入我们构造的代码,
'alert(1)'
如果同时又对单引号进行了转义,那我们就构造exp时多加入一个反斜杠
\'alert(3)\'
防御方法
1. 输出编码:
在html标签中,需要将特殊字符进行html实体编码
在javascript中,需要将特殊字符进行unicode转义
2. 输入验证:
验证是否是http或者https等安全协议,最好用白名单来验证,
3. 配置httponly ,限制攻击者窃取用户cookie 。
防御DOM型xss
1.避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务端使用动态页面来实现。
2. 分析和强化客户端js代码,尤其是一些收到用户影响的DOM对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码