首页 > 编程语言 >漏洞分析-存储型XSS-JAVA篇

漏洞分析-存储型XSS-JAVA篇

时间:2023-02-19 00:12:10浏览次数:50  
标签:XSS JAVA 数据库 request 漏洞 添加 import servlet javax

0x00 原理分析

存储型XSS:用户在浏览器传入的数据未做校验,导致一些恶意的前端代码被插入至数据库中,前端再次读取数据时,数据被当成前端代码,或与前端代码拼接并执行。

0x01 效果演示

通过添加操作添加一个用户名为<h1>11</h1>的用户

 数据库存储其用户名为<h1>11</h1>

 

插入弹框语句,则前端页面也显示弹框语句:

 

 

 

0x02 代码分析

servlet接口代码:
package controller;

import bean.Contact;
import org.apache.commons.beanutils.BeanUtils;
import service.ContactSysService;
import service.ContactSysServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

@WebServlet("/add")
public class AddContactServlet extends HttpServlet {
    private ContactSysService contactSysService = new ContactSysServiceImpl();
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            // 1、获取当前添加界面的全部参数键值对
            Map<String, String[]> params = request.getParameterMap();
            // 2、把参数封装成实体类对象
            Contact contact = new Contact();
            BeanUtils.populate(contact , params);
            // 3、调用业务层对象
            contactSysService.addContact(contact);
            // 4、响应添加成功的结果回去
            request.setAttribute("tip" , "添加成功!");
        } catch (Exception e) {
            request.setAttribute("tip" , "添加失败!");
            e.printStackTrace();
        }
        request.getRequestDispatcher("/add.jsp").forward(request , response);

    }
}

 

jsp页面代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- HTML5文档-->
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>添加用户</title>
    <!-- 1. 导入CSS的全局样式 -->
    <link href="BootStrap/css/bootstrap.min.css" rel="stylesheet">

</head>
<body>
<div class="container" style="max-width: 500px">
    <h3>添加联系人页面</h3>
    <span style="color: red">${tip}</span>
    <form action="/boot/add" method="post">
        <div class="form-group">
            <label for="name">姓名:</label>
            <input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名">
        </div>

        <div class="form-group">
            <label>性别:</label>
            <input type="radio" name="sex" value="男" checked="checked"/>男
            <input type="radio" name="sex" value="女"/>女
        </div>

        <div class="form-group">
            <label for="age">年龄:</label>
            <input type="number" class="form-control" id="age" name="age" placeholder="请输入年龄">
        </div>

        <div class="form-group">
            <label for="address">籍贯:</label>
            <select name="address" class="form-control" id="address">
                <option value="广东">广东</option>
                <option value="广西">广西</option>
                <option value="湖南">湖南</option>
            </select>
        </div>

        <div class="form-group">
            <label for="qq">QQ:</label>
            <input type="number" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码"/>
        </div>

        <div class="form-group">
            <label for="email">Email:</label>
            <input type="email" class="form-control" id="email" name="email" placeholder="请输入邮箱地址"/>
        </div>

        <div class="form-group" style="text-align: center">
            <input class="btn btn-primary" type="submit" value="提交" />
            <input class="btn btn-default" type="reset" value="重置" />
        <a class="btn btn-default" type="button" href="${pageContext.request.contextPath}/list" >返回</a>
        </div>
    </form>
</div>
<!-- 2. jQuery导入,建议使用1.9以上的版本 -->
<script src="BootStrap/js/jquery-2.1.0.min.js"></script>
<!-- 3. 导入bootstrap的js文件 -->
<script src="BootStrap/js/bootstrap.min.js"></script>
</body>
</html>

前端触发漏洞的代码:

<input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名">
  与placeholder="请输入姓名"无关,插入失败很可能是因为waf或者是该数据库设置的长度有限制。

 

长度限制:发现是可以插入数据库恶意语句是,只不多数据库的用户名的长度有限制。重新设置数据库表长度为200:

 

 

 

 改好之后,就能插入恶意的xss payload:

 

然后页面触发弹框:

 

 

 在td内被插入了xss的payload:

 

产生原理就是未对输入的数据未进行校验。request.getParameterMap()方法,直接获取request请求提交的所有的值,然后再把参数封装成实体类。未进行过滤操作:

标签:XSS,JAVA,数据库,request,漏洞,添加,import,servlet,javax
From: https://www.cnblogs.com/cute-puli/p/17134046.html

相关文章

  • java面向对象
    java面向对象以类的方式组织代码,以对象的组织(封装)程序。一个类里面只有方法和属性一个项目至多只有一个main方法创建对象类是抽象的,需要进行实例化publicclass......
  • 算法刷题-字符串排序-JAVA
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......
  • 算法刷题-字符串反转-JAVA
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......
  • 【Kotlin】Kotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问
    文章目录​​一、Kotlin变量可空性​​​​1、Java与Kotlin空值处理区别​​​​2、Java函数返回非空值和控制​​​​3、Kotlin函数调用Java函数​​​​4、平台类......
  • PAT-basic-1025 反转链表 java c++
    一、题目给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为1→2→3→4→5→6,K 为3,则输出应该为3→2→1→6→5→4;如果 K ......
  • PAT-basic-1024 科学计数法 java
    一、题目科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该......
  • 通过Java编写Flume拦截器
    首先要知道Flume中的Event是由Header+Body组成的。Flume支持在运行时对Event进行修改或丢弃,可以通过拦截器来实现。Flume里面的拦截器是实现了org.apache.flume.interc......
  • 算法刷题-字符串分隔-JAVA
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......
  • PAT-basic-1023 组个最小数 java
    一、题目给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,......
  • PAT-basic-1021 个位数统计 java
    一、题目给定一个 k 位整数 N=dk−1​10k−1+⋯+d1​101+d0​ (0≤di​≤9, i=0,⋯,k−1, dk−1​>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=1......