反射型 XSS 攻击演示(附链接)

一、介绍:

反射型 XSS(Cross-Site Scripting)是一种 Web 应用程序中常见的安全漏洞,它允许攻击者将恶意脚本注入到网页中,以便在用户浏览页面时执行这些恶意脚本。下面是对反射型 XSS 的解释和分析:

  1. 定义

    • 反射型 XSS 是一种攻击方式,其中恶意脚本通过用户输入传递到应用程序,然后由应用程序在返回的网页内容中执行。攻击者通常通过构造包含恶意脚本的链接,诱使用户点击,从而触发 XSS 漏洞。
  2. 攻击过程

    • 攻击者构建包含恶意脚本的 URL,并将其发送给目标用户。
    • 用户点击链接,触发了应用程序对 URL 参数的处理。
    • 应用程序未正确过滤或转义用户输入,导致恶意脚本被插入到返回的网页中。
    • 用户的浏览器执行了这些恶意脚本,从而使攻击者能够执行恶意操作,如窃取用户信息、劫持会话等。
  3. 危害

    • 攻击者可以利用反射型 XSS 窃取用户的敏感信息,如登录凭据、会话标识等。
    • 用户可能会在不知情的情况下执行恶意操作,如改变账户设置、提交恶意表单等。
  4. 防御措施

    • 输入验证:应用程序应该对用户输入进行验证,确保只允许合法和预期的输入。
    • 输出转义:在将用户输入嵌入到 HTML 页面之前,应该对其进行适当的输出编码,以防止执行恶意脚本。
    • 使用安全框架:使用 Web 应用程序防火墙(WAF)等安全框架来检测和阻止 XSS 攻击。

总体而言,理解和防范反射型 XSS 是确保 Web 应用程序安全性的重要步骤。通过有效的输入验证和输出转义,可以减少 XSS 漏洞的风险。

二、实操演示

环境准备:

如何搭建 Pikachu 靶场保姆级教程(附链接)icon-default.png?t=N7T8https://blog.csdn.net/2302_82189125/article/details/135718722?spm=1001.2014.3001.5501

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,可以监听输入框的事件,如onchangeonfocusonblur等,以便在用户与输入框交互时执行相应的操作。
  • 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

到这里就已经演示完毕啦,如果读者觉得对您有帮助麻烦动动小手点点赞或关注,谢谢支持!!