一、基本概念及原理
什么是XSS漏洞
XSS(跨站脚本攻击,全称Cross-Site Scripting)是一种常见网络安全漏洞,允许攻击者在用户浏览器中执行恶意脚本。攻击者通过在受信任网站中注入恶意代码,诱骗用户点击或加载恶意内容,从而窃取数据、篡改页面或劫持用户。
XSS漏洞原理
攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响
的 HTML 代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。通过在用户端注入恶意的可执行脚本,若服务器对用户的输入不进行处理或处理不严,则浏览器就会直接执行用户注入的脚本。
XSS常见的类型
存储型XSS
原理:
1、攻击者将恶意脚本代码存储在服务器上(如数据库)。
2、受害者访问受感染的页面时,服务器将恶意脚本发送给浏览器。
3、浏览器执行脚本,导致攻击成功。
反射型XSS
原理:
1、攻击者将恶意脚本通过URL参数或表单提交传递给服务器。
2、服务器在响应中直接反射这些数据,未经充分过滤。
3、受害者点击特制链接或提交表单后,浏览器执行恶意脚本。
DOM型XSS
原理:
1、恶意脚本不通过服务器,而是直接操作客户端的DOM(文档对象模型)。
2、攻击者通过操纵页面上的JavaScript,注入和执行恶意代码。
3、浏览器执行恶意脚本时,修改页面内容或执行其他恶意行为。
XSS漏洞危害
1、窃取敏感信息:
攻击者可以获取用户的会话Cookie、登录凭证和其他敏感信息。
2、会话劫持:
攻击者可以冒充受害者,进行未授权的操作,访问受害者的账户。
3、欺骗和钓鱼攻击:
注入的恶意脚本可以伪造网站内容,引导用户提供敏感信息或下载恶意软件。
4、重定向和跨站请求伪造(CSRF):
恶意脚本可以将用户重定向到恶意网站,或利用用户的身份在其他网站上执行恶意操作。
5、网站篡改:
攻击者可以修改网站内容,显示虚假信息或宣传内容。
6、传播恶意软件:
注入的脚本可以引导用户下载和安装恶意软件,进一步感染系统。
二、常见的攻击流程
1、反射型XSS攻击流程
2、存储型XSS攻击流程
3、DOM型XSS攻击流程
构造恶意代码-->诱骗用户点击链接-->客户端处理输入-->修改DOM-->执行恶意脚本
三、防御措施
1、验证和转义输入:对用户输入进行严格的验证和HTML转义。
2、内容安全策略(CSP):限制页面中可以执行的脚本来源,防止执行未授权的脚本。
3、避免直接操作DOM:使用安全的DOM操作方法,如textContent或innerText。
四、靶场演示
Pikachu演示
1、反射型xss(get)
条件限制:查看前端页码,发现文本框有长度限制
构造payload
<script>alert("hacking")</script>
在网页输入框输入URL(注意:这里也可以修改html代码中maxlength的值也能实现)
http://localhost/pikachu/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert(%22hacking%22)%3C/script%3E&submit=submit
2、反射型xss(post)
登录框 账户admin 密码 123456 登陆进去会发现与上一关一样的页面
输入我们的上一关payload 也能实现上一关的效果
这一关我们试着获取一下admin的cookie值
构造我们需要的payload
<script>alert(document.cookie)</script>
成功获取admin的cookie值
3、存储型xss
在留言板中输入上一关我们构造的payload 发现页面多了个删除选项
接着用另一个浏览器打开皮卡出选中这一关会发现直接弹出了xss框
4、DOM型xss
进入这一关,在文本框随便输入一些内容,查看HTML代码的变化
这里我们可以利用href的特性构造一个特殊的payload
#' onclick="alert(document.cookie)">
接着点击what do you see?实现了弹出cookie值
5、DOM型xss-x
这一关和上一关的区别是我们输入的内容会在URL里面呈现,查看HTML代码发现,和上一关差不多
构造payload
#' onclick="alert(document.cookie)">
同样也能弹出PHPSESSID值
6、xss之盲打
分析页面,发现二个输入框 输入payload
构造payload
<script>alert(document.cookie)</script>
登陆后台查看 账户admin 密码 123456
http://localhost/pikachu/vul/xss/xssblind/admin_login.php
会发现成功弹出了xss框,并且弹了二次, 说明二个输入框都存在xss注入
7、xss之过滤
在文本框中输入我们上一关的payload 发现页面没有回显,怀疑可能存在过滤
尝试一些简单的方法看能否绕过 比如大小写;
构造payload
<SCRIPT>alert(111)</SCRIPT>
成功弹框
8、xss之htmlspecialchars
在文本框中输入上一关的payload发现页面没有任何变化,查看一些HTML代码
发现<a>标签和href属性都被编码了
构造如下payload
javascript:alert(111)
成功弹窗
9、xss之href输出
输入上一关的payload
javascript:alert(111)
成功弹窗
10、xss之js输出
输入一个简单的payload试试水,发现页面没有变化,查看HTML代码
接下来我们需要生成一个js语句
x'</script><script>alert('xss')</script>