一、介绍:
反射型 XSS(Cross-Site Scripting)是一种 Web 应用程序中常见的安全漏洞,它允许攻击者将恶意脚本注入到网页中,以便在用户浏览页面时执行这些恶意脚本。下面是对反射型 XSS 的解释和分析:
- 定义:
- 反射型 XSS 是一种攻击方式,其中恶意脚本通过用户输入传递到应用程序,然后由应用程序在返回的网页内容中执行。攻击者通常通过构造包含恶意脚本的链接,诱使用户点击,从而触发 XSS 漏洞。
攻击过程:
- 攻击者构建包含恶意脚本的 URL,并将其发送给目标用户。
- 用户点击链接,触发了应用程序对 URL 参数的处理。
- 应用程序未正确过滤或转义用户输入,导致恶意脚本被插入到返回的网页中。
- 用户的浏览器执行了这些恶意脚本,从而使攻击者能够执行恶意操作,如窃取用户信息、劫持会话等。
- 危害:
- 攻击者可以利用反射型 XSS 窃取用户的敏感信息,如登录凭据、会话标识等。
- 用户可能会在不知情的情况下执行恶意操作,如改变账户设置、提交恶意表单等。
防御措施:
- 输入验证:应用程序应该对用户输入进行验证,确保只允许合法和预期的输入。
- 输出转义:在将用户输入嵌入到 HTML 页面之前,应该对其进行适当的输出编码,以防止执行恶意脚本。
- 使用安全框架:使用 Web 应用程序防火墙(WAF)等安全框架来检测和阻止 XSS 攻击。
总体而言,理解和防范反射型 XSS 是确保 Web 应用程序安全性的重要步骤。通过有效的输入验证和输出转义,可以减少 XSS 漏洞的风险。
二、实操演示
环境准备:
Get 型:
测试:
打开咱们已经安装好了的 Pikachu 靶场,找到反射型 xss(get) 这一页面
可以看到有个输入框,我们先尝试输入一些值,如 Moant,点击 submit 提交
在搜索框看到我们提交的参数并没有做任何处理
咱们直接打开 F12 查看元素
这里跟大家讲解下 HTML 标签
<input> 标签详解:
HTML表示:
在HTML中,可以使用<input>元素创建输入框。<input>元素的type属性指定输入框的类型,其中常见的类型包括:
- text: 用于单行文本输入。
- password: 用于密码输入,字符会被隐藏。
- number: 用于数值输入。
- email: 用于电子邮件地址输入。
- 等等。
<!-- 例子:单行文本输入框 --> <input type="text" name="username" id="usernameInput" placeholder="Enter your username">
属性和特性:
- name: 用于标识输入框的名称,通常在提交表单时用于识别输入的数据。
- id: 为输入框定义唯一的标识符,通常用于JavaScript和CSS中的操作和样式。
- value: 设置或获取输入框的默认值。
- placeholder: 在输入框为空时显示的灰色提示文本,提供用户输入的建议。
- disabled: 禁用输入框,使其不可编辑。
- readonly: 设置输入框为只读,用户不能修改其中的内容。
表单关联:
- 输入框通常嵌套在HTML表单中,用户可以在表单中输入数据后提交给服务器进行处理。
- 表单中的action属性指定了数据提交的目标地址,而method属性定义了提交数据的HTTP方法(通常是GET或POST)。
<form action="/submit" method="post"> <input type="text" name="username"> <input type="submit" value="Submit"> </form>
事件与JavaScript交互:
- 通过JavaScript,可以监听输入框的事件,如onchange、onfocus、onblur等,以便在用户与输入框交互时执行相应的操作。
- JavaScript也可用于动态修改输入框的属性、值或样式。
<input type="text" id="myInput" onchange="handleInputChange()"> <script> function handleInputChange() { // 处理输入框变化的逻辑 var inputValue = document.getElementById("myInput").value; console.log("Input value changed: " + inputValue); } </script>
安全性考虑:
- 输入框是Web应用程序中的用户交互点,因此需要谨慎处理用户输入,防范安全漏洞,如XSS(跨站脚本攻击)和CSRF(跨站请求伪造)。
- 对用户输入进行验证和转义是确保输入框安全的关键步骤。
测试完后我们就开始准备攻击了,因为这里主要讲解 XSS 攻击所以就直接带大家看源码了,如果读者想要追求真实性可以用工具扫描后台根据 URL 路径 来找到这个文件
源码分析:
根据路径查找到源码
咱们主要来看这段代码
$html = " 定义一个空字符串变量 $html,用于存储生成的HTML响应
if(isset($_GET['submit'])){} 检查是否存在名为 'submit' 的 GET 参数。如果存在,进入条件语句块,否则跳过整个处理过程
if(empty($_GET['message'])){} 在 'submit' 存在的情况下,检查是否存在名为 'message' 的 GET 参数并且是否为空。如果为空,说明用户没有输入消息,生成一个提示信息
$html.="<p class='notice'>输入'kobe'试试-_-</p >";
如果 'message' 不为空,则进入下一层嵌套的条件语句
if($_GET['message']=='kobe'){ $html.="<p class='notice'>愿你和{$_GET['message']}一样,永远年轻,永远热血沸腾!</p >< img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />"; }else{ $html.="<p class='notice'>who is {$_GET['message']},i don't care!</p >"; }
如果 'message' 的值等于 'kobe',生成一个包含 'kobe' 的祝福消息和一张 Kobe 的图片的HTML响应
如果 'message' 的值不等于 'kobe',生成一个提示信息,显示用户输入的 'message'
到这里可以看到他的后端并没有对 message 做任何处理,所以咱们直接上手
攻击:
因为 JavaScript 代码是可以直接在浏览器执行,所以咱们用 JavaScript 来实施攻击,首页咱们得先了解 PHP。在 PHP 中,语句的参数可以使用双引号或单引号来闭合
先用一个 " 闭合掉前面的语句
"
再接上咱们想执行的 JavaScript 代码
"<script>alert(/XSS 攻击成功/)</script>
最后再闭合掉后面的语句
"<script>alert(/XSS 攻击成功/)</script> "
尝试输入到搜索框中
可以看到这里并没有输入完整,因为他前端做了长度限制,咱们直接在前端更改即可
将这个 20 更改为任何数字,只要能完整输入你的代码即可
最后在输入框中输入代码,按 submit 提交就会看到这个页面
这就说明我们的代码可以成功执行,XSS 攻击成功!!
接下来就是 Post 型了
Post 型:
测试:
打开咱们已经安装好了的 Pikachu 靶场,找到反射型 xss(post) 这一页面
页面中是一个登录表单,如果不知道该怎么办咱们可以点击右边提示
提示让咱们先登录
读者可能有疑惑为什么不直接攻击而是先登录,因为靶场作者原意是想让咱们去盗取 Cookie,你都不登录你哪来的 Cookie 可盗
源码分析:
可以看到代码是差不多的,所以咱们直接上手
攻击:
还是先闭合前面语句
"
接上获取 Cookie 的语句
"<script>alert(document.cookie)</script>
最后闭合后面的语句
"<script>alert(document.cookie)</script>"
发现没有做任何限制
直接在输入框中输入代码
代码执行成功,弹出了 Cookie
到这里就已经演示完毕啦,如果读者觉得对您有帮助麻烦动动小手评论点点赞收藏或关注,谢谢支持!!