XSS - 跨站脚本之portswigger labs练习
目录[*]1、什么是XSS
[*]2、XSS的类型有哪些
[*]3、XSS攻击的过程和原理
[*]4、XSS的防御
[*]5、可能会用到的XSS Payload资源
[*]6、靶场训练 portswigger labs
[*]6.1 没有任何编码的反射型XSS
[*]6.2 没有任何编码的存储型XSS
[*]6.3 从URL获取参数写入document的DOM型XSS
[*]6.4 从URL获取参数写入innerHTML的DOM型XSS
[*]6.5 利用jQuery的href属性的DOM型XSS
[*]6.6 利用jQuery的hashchange事件的DOM型XSS
[*]6.7 尖括号编码的反射型XSS
[*]6.8 双引号编码的href属性存储型XSS
[*]6.9 JavaScript字符串中带尖括号编码的反射型XSS
[*]6.10 从URL获取参数写到select元素内的DOM型XSS
[*]6.11 AngularJS中尖括号和双引号编码的DOM型XSS
[*]6.12 反射型 DOM XSS
[*]6.13 存储型 DOM XSS
[*]6.14 大部分HTML标签和属性被过滤的反射型XSS
[*]6.15 除了自定义标签外所有HTML标签都被过滤的反射型XSS
[*]6.16 SVG标签的反射型XSS
[*]6.17 规范链接标签中的反射型XSS
[*]6.18 JavaScript字符串中转义了单引号和反斜杠的反射型XSS
[*]6.19 JavaScript字符串中转义了单引号并对尖括号和双引号举行html编码的反射型XSS
[*]6.20 对尖括号和双引号HTML编码及对单引号和反斜杠举行转义的存储型XSS
[*]6.21 对尖括号,单双引号,反斜杠和反引号举行模板文本unicode转义的反射型XSS
[*]6.22 利用XSS来盗取Cookies
[*]6.23 利用XSS来盗取密码
[*]6.24 利用XSS执行CSRF
1、什么是XSS
跨站脚本攻击(Cross Site Scripting)缩写为CSS但与层叠样式表(Cascading Style Sheets,CSS)的缩写肴杂,因此跨站脚本攻击缩写为XSS。
XSS 指攻击者可以在页面中嵌入恶意脚本代码,当正常用户访问该页面时,浏览器会剖析并执行这些恶意代码,从而达到攻击用户的目的。这些恶意代码通常是JavaScript。
XSS 攻击有两大要素:
[*]攻击者注入恶意代码
[*]浏览器剖析执行恶意代码
XSS的重点不在于跨站,而在于脚本的攻击。
2、XSS的类型有哪些
从攻击代码的工作方式可以分为三个类型:
[*]反射型(非持久型):恶意代码来自当前的HTTP哀求,而且这些代码执行是一次性的,不会存储到数据库,直接反射回显在页面上。
[*]存储型(持久型):恶意代码会存储到数据库,每次访问该页面都将触发XSS。
[*]DOM型:也属于反射型的一种,客户端网页脚本对本地DOM的恶意篡改,而使得攻击脚本被执行。
DOM(Document Object Model 文档对象模子)
[*]其他类型XSS先容:跨站的艺术-XSS入门与先容
3、XSS攻击的过程和原理
反射型XSS
反射型XSS是最简单的跨站脚本攻击。当Web步调在HTTP哀求中吸收到的数据,以不安全的方式将该数据包含在即时相应中页面中,也就是把用户输入的数据从服务器反射给用户浏览器。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240313151458837-1357076947.png
要利用这个漏洞就要诱使用户去访问一个包含恶意代码的URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。从而盗取用户的敏感信息等。
攻击过程:
[*]攻击者发送带有XSS恶意脚本的链接给用户
[*]用户点击了恶意链接,访问了目标服务器(正常服务器)
[*]网站将XSS同正常页面返回到用户浏览器
[*]用户浏览器剖析执行了网页中的XSS恶意代码,向恶意服务器发起哀求
[*]攻击者从自己搭建的恶意服务器中获取用户提交的信息
漏洞缘故原由:用户的输入或者一些用户可控参数未经处理地输出到页面上。
存储型XSS
存储型XSS攻击不需要特制的链接来执行。仅仅需要提交XSS利用代码到一个网站上其他用户可能访问的地方(反射型XSS通常只在RUL中)。可能是博客评论,用户评论,留言板等地方。一旦用户访问该页面,将自动执行。
攻击过程:
[*]攻击者在目标服务器(正常服务器)上构造XSS恶意脚本,保存到数据库中
[*]用户在未登录状态下,访问了目标服务器,查察存在XSS的页面
[*]网站将XSS同正常页面返回到用户浏览器
[*]用户浏览器剖析了网页中的XSS恶意代码,向恶意服务器发起哀求
[*]攻击者从自己搭建的恶意服务器中获取用户提交的信息
漏洞成因:
存储型XSS漏洞的成因与反射型的根源类似,不同的是恶意代码会被保存在服务器中,导致其它用户在访问资源时也会执行恶意代码(XSS蠕虫)。
DOM型跨站
通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS。
在下面段代码中,submit按钮的onclick事件调用了xsstest()函数。而在xsstest()中,修改了页面的DOM节点,通过innerHTML把一段用户数据看成HTML写入到页面中,造成了DOM型XSS攻击。
<html>
<head>
<title>DOM Based XSS Demo</title>
</head>
<body>
<input type="text" id="input" size=50 value="" />
<input type="button" value="submit" onclick="xsstest()" />
</body>
</html>漏洞缘故原由:
DOM型XSS是基于DOM文档对象模子的。对于浏览器来说,DOM文档就是一份XML文档,通过JavaScript就可以轻松的访问DOM。当确认客户端代码中有DOM型XSS漏洞时,诱使(钓鱼)一名用户访问自己构造的URL,利用步骤和反射型很类似。唯一的区别就是,构造的URL参数不消发送到服务器端,可以达到绕过WAF、躲避服务端的检测结果。
4、XSS的防御
[*]对用户输入举行验证和过滤:在处理用户输入时对输入的内容举行验证和过滤,确保用户输入的内容不包含恶意脚本。
[*]对输出数据举行编码:在HTTP相应报文中输出用户可控制的数据时,对输出举行编码,防止它被解释为代码内容从而被执行。
[*]使用HTTPOnly cookie:HTTPOnly它可以防止JavaScript代码读取cookie数据。
[*]设置正确的Content Security Policy:设置正确的CSP,可以限制浏览器只加载来自可信泉源的脚本和内容。
5、可能会用到的XSS Payload资源
[*]OWASP:XSS Filter Evasion Cheat Sheet
[*]portswigger:Cross-site scripting (XSS) cheat sheet
[*]AwesomeXSS
[*]PayloadsAllTheThings /XSS Injection/
[*]xss payloads collect
6、靶场训练 portswigger labs
地址:All labs | Web Security Academy (portswigger.net)
工具:火狐浏览器、Burp Suite
6.1 没有任何编码的反射型XSS
Reflected XSS into HTML context with nothing encoded
搜索框输入最简单的
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240312194629762-73214591.png
证明发现XSS漏洞的传统方法是使用该alert()函数创建一个弹出窗口,这表明可以在给定域上执行任意JavaScript代码。
6.2 没有任何编码的存储型XSS
Stored XSS into HTML context with nothing encoded
看到一个留言板,留言板的数据通常会被存储到数据库中,留言板输入
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240312195145993-659040511.png
提交以后,再次回到留言板的页面,XSS被触发了。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240312195418721-561756572.png
6.3 从URL获取参数写入document的DOM型XSS
DOM XSS in document.write sink using source location.search
document.write向html写内容
search属性是一个可读可写的字符串,可设置或返回当前URL的查询部分(问号?之后的部分)。
在搜索框输入搜索内容,输入的内容被放到img标签里面。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240312203142422-704707529.png
尝试将img标签闭合">,XSS被触发了。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240312203341182-1585534910.png
6.4 从URL获取参数写入innerHTML的DOM型XSS
DOM XSS in innerHTML sink using source location.search
innerHTML可以获取指定DOM的HTML元素,也可以更换指定DOM的HTML元素
在搜索框输入没有回显内容,缘故原由是为了安全HTML5规定不执行innerHTML插入的被过滤了。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240313200547051-263147920.png
看一下js源码,loadCommentsWithVulnerableEscapeHtml.js中,replace()将尖括号换成空字符串,但是只对第一个举行更换。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240313201207491-967931672.png
在xss代码前插入一组,即可绕过,留言是在一个标签里面,所以使用img标签触发错误事件https://dis.qidao123.com/1 onerror=alert(/xss/),在xss代码前插入一组即可使xss代码逃逸。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240314104731632-1035839113.png
6.14 大部分HTML标签和属性被过滤的反射型XSS
Reflected XSS into HTML context with most tags and attributes blocked
本题需要绕过WAF,大部分标签和属性被过滤了。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240314110048898-1134440763.png
burp抓包使用intuder模块,爆破哪些标签和属性不会被过滤。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240314111436504-1417041726.png
使用Burp官方提供的 XSS cheat-sheet 分别复制其中的标签和事件到payload。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240314110931065-762459149.png
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240314111214697-1817535876.png
起首罗列标签,发现body和custom tags没有被过滤。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240314111530717-527470007.png
接下来罗列事件属性,在body标签里面添加变量,复制所以events到payload。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240314112207451-249521974.png
发现这些属性没有被过滤。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240314112530201-1170245004.png
解题使用的是onresize,利用iframe和onload属性自动触发onresize事件。
在exploit server,将以下playload保存并发送给受害者。
https://img2024.cnblogs.com/blog/3222269/202403/3222269-20240314113625477-910854482.png
这个payload通过iframe的src属性加载网址,然后在页面加载和大小变革时执行print()。
6.15 除了自定义标签外所有HTML标签都被过滤的反射型XSS
Reflected XSS into HTML context with all tags blocked except custom ones
为自定义标签设置id属性,并像操作其他DOM元素一样,通过JavaScript来访问和操作这些带有id的自定义元素,在url中使用#id可以将页面定位到指定id元素。
直接分析官方给出的Payload:
这段js代码将浏览器的当前位置重定向到指定的URL,serach参数的内容是 。
这个 XSS payload中:
页:
[1]