XSS漏洞
一、XSS漏洞原理
XSS,即跨站脚本攻击,是指攻击者利用Web服务器中的应用程序或代码漏洞,在页面中嵌入客户端脚本(通常是一段由JavaScript编写的恶意代码,少数情况下还有ActionScript、VBScript等语言),当信任此Web服务器的用户访问Web站点中含有恶意脚本代码的页面或打开收到的URL链接时,用户浏览器会自动加载并执行该恶意代码,从而达到攻击的目的。
当应用程序没有对用户提交的内容进行验证和重新编码,而是直接呈现给网站的访问者时,就可能会触发XSS攻击。
二、XSS漏洞的危害
(1)窃取管理员帐号或Cookie。入侵者可以冒充管理员的身份登录后台,使得入侵者具有恶意操纵后台数据的能力,包括读取、更改、添加、删除一些信息。
(2)窃取用户的个人信息或者登录帐号,对网站的用户安全产生巨大的威胁。例如冒充用户身份进行各种操作。
(3)网站挂马。先将恶意攻击代码嵌入到Web应用程序之中。当用户浏览该挂马页面时,用户的计算机会被植入木马。
(4)发送广告或者垃圾信息。攻击者可以利用XSS漏洞植入广告,或者发送垃圾信息,严重影响到用户的正常使用。
三、简单的反射型xss实例
设置漏洞环境
首先,我们需要一个包含XSS漏洞的Web应用。我们可以使用一个简单的示例页面来模拟漏洞。以下是一个基本的示例代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>XSS漏洞示例</title>
</head>
<body>
<h1>欢迎来到我们的网站!</h1>
<input type="text" id="userInput" placeholder="在此输入内容">
<button onclick="displayInput()">提交</button>
<p id="output"></p>
<script>
function displayInput() {
var userInput = document.getElementById("userInput").value;
document.getElementById("output").innerHTML = "您输入的内容是:" + userInput;
}
</script>
</body>
</html>
在这个示例中,用户输入的内容将被显示在页面上。然而,由于没有对用户输入进行过滤和转义,攻击者可以注入恶意脚本。
复现XSS漏洞
尝试在输入框中输入以下内容:
<script>alert("恶意脚本被执行!")</script>
点击“提交”按钮,你将会看到一个弹窗显示“恶意脚本被执行!”。这就是一个简单的反射型XSS漏洞。
XSS线上靶场—Warmups
网址
https://xss.pwnfunction.com/
1、Ma Spaghet!
关键代码分析:
spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"
1、URLSearchParams接口定义了一些实用的方法来处理URL的查询字符串。
URLSearchParams()是一个可以操作查询字符串的对象。
常用方法: 1、构造查询字符串 2、获取查询字符串参数
2、innerHTML:它是一个字符串,用来设置或获取位于对象起始和结束标签内的HTML。相当于获取HTML当前标签的起始和结束里面的内容。
使用get方法传递URL,没有其他过滤方式,我们尝试使用绕过一下
没有弹窗,我们再找找原因?
由于是因为
所以换成
<img src=1 onerror=alert(1337)>
再试试,成功了
2、Area 51
<!-- Challenge -->
<div id="pwnme"></div>
<script>
var input = (new URL(location).searchParams.get('debug') || '').replace(/[\!\-\/\#\&\;\%]/g, '_');
var template = document.createElement('template');
template.innerHTML = input;
pwnme.innerHTML = "<!-- <p> DEBUG: " + template.outerHTML + " </p> -->";
</script>
- 正则过滤了输入的debug参数
- 搞了个template把输入包裹进了注释
输入123看看
?debug=123
<!–是多行注释,所以换行的思路基本不可行
这里查了查
因为HTML中没有嵌套注释的概念,所以可以用新的注释打破了旧的注释
而因为浏览器不喜欢在意外发送时呈现php源代码,所以它会变异成<!–php–>
这种变异会产生新的注释,于是打破旧的注释
做个尝试
?debug=<?php>123
这样就简单了
?debug=<?php>