JavaSec 之 SQL 注入简单了解
文章目录
- JDBC 注入
- 语句拼接(Statement)
- 修复方案
- 语句拼接(PrepareStatement)
- 修复方案 预编译
- JdbcTemplate
- 修复方案
- MyBatis
- Like 注入
- Order By 注入
- In 注入
寒假学了一个月 pwn,真心感觉这玩意太底层学的我生理不适应了,接下来学一段时间 java 安全缓一缓吧。
靶场来源:j3ers3/Hello-Java-Sec: ☕️ Java Security,安全编码和代码审计 (github.com)
bewhale/JavaSec: Java安全 学习记录 (github.com)
JDBC 注入
语句拼接(Statement)
// 采用Statement方法拼接SQL语句,导致注入产生public String vul1(String id) {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn = DriverManager.getConnection(db_url, db_user, db_pass);Statement stmt = conn.createStatement();// 拼接语句产生SQL注入String sql = "select * from users where id = '" + id + "'";ResultSet rs = stmt.executeQuery(sql);...
}
这就是原始人漏洞了,这边我们报错注入。
payload
1' and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)-- +
修复方案
// 采用黑名单过滤危险字符,同时也容易误伤(次方案)public static boolean checkSql(String content) {String[] black_list = {"'", ";", "--", "+", ",", "%", "=", ">", "*", "(", ")", "and", "or", "exec", "insert", "select", "delete", "update", "count", "drop", "chr", "mid", "master", "truncate", "char", "declare"};for (String s : black_list) {if (content.toLowerCase().contains(s)) {return true;}}return false;
}
语句拼接(PrepareStatement)
// PrepareStatement会对SQL语句进行预编译,但如果直接采取拼接的方式构造SQL,此时进行预编译也无用。public String vul2(String id) {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn = DriverManager.getConnection(db_url, db_user, db_pass);String sql = "select * from users where id = " + id;PreparedStatement st = conn.prepareStatement(sql);ResultSet rs = st.executeQuery();
}
虽然是预编译吧,但是没用占位符 ?,和字符拼接没什么区别
payload
id=2 or 1=1
修复方案 预编译
// 正确的使用PrepareStatement可以有效避免SQL注入,使用?作为占位符,进行参数化查询public String safe1(String id) {String sql = "select * from users where id = ?";PreparedStatement st = conn.prepareStatement(sql);st.setString(1, id);ResultSet rs = st.executeQuery();
}
JdbcTemplate
// JDBCTemplate是Spring对JDBC的封装,如果使用拼接语句便会产生注入public Map<String, Object> vul3(String id) {DriverManagerDataSource dataSource = new DriverManagerDataSource();...JdbcTemplate jdbctemplate = new JdbcTemplate(dataSource);String sql_vul = "select * from users where id = " + id;// 安全语句// String sql_safe = "select * from users where id = ?";return jdbctemplate.queryForMap(sql_vul);
}
化石拼接语句的锅
修复方案
// ESAPI 是一个免费、开源的、网页应用程序安全控件库,它使程序员能够更容易写出更低风险的程序
// 官网:https://owasp.org/www-project-enterprise-security-api/public String safe3(String id) {Codec<Character> oracleCodec = new OracleCodec();Statement stmt = conn.createStatement();String sql = "select * from users where id = '" + ESAPI.encoder().encodeForSQL(oracleCodec, id) + "'";ResultSet rs = stmt.executeQuery(sql);
}
MyBatis
Mybatis的SQL语句可以基于注解的方式写在类方法上面,更多的是以xml的方式写到xml文件。
Mybatis中SQL语句需要我们自己手动编写或者用generator自动生成。编写xml文件时,Mybatis支持两种参数符号,一种是#,另一种是$。比如:
<select id="queryAll" resultMap="resultMap"> SELECT * FROM NEWS WHERE ID = #{id}</select>
使用预编译,$使用拼接 SQL。Mybatis框架下易产生SQL注入漏洞的情况主要分为以下三种:
Like 注入
Mybatis模糊查询:
Select * from users where username like '%#{username}%'
在这种情况下使用 # 程序会报错,把 # 号改成 $ 可以解决
但是如果java代码层面没有对用户输入的内容做处理,那么将会产生SQL注入漏洞。
正确写法:
Select * from users where username like concat('%',#{username}, '%')
Order By 注入
由于使用 #{} 会将对象转成字符串(因为预编译机制,系统将我们输入的字符当作了一个字符串)根据字符串排序是不生效的
因此很多研发会采用${}来解决,从而造成SQL注入
POC:
id and (updatexml(1,concat(0x7e,(select user())),0))-- -
因此,此种情况下,安全的做法应当在 Java 代码层面来进行解决。可以设置一个字段值的白名单,仅允许用户传入白名单内的字段。
String sort = request.getParameter("sort");
String[] sortWhiteList = {"id", "username", "password"};
if(!Arrays.asList(sortWhiteList).contains(sort)){sort = "id";
}
In 注入
在 IN 关键字之后使用 #{} 查询多个参数:
<select id="getUser" parameterType="java.lang.String" resultType="user.NewUserDO">select * from user_table where username in (#{usernames})
</select>
in之后多个username查询时使用 # 同样会报错(因为预编译机制,系统将我们输入的字符当作了一个字符串,因此查询结果为空,不能满足业务功能需求),因此很多研发会采用${}来解决,从而造成SQL注入
select * from user_table where username in (${usernames})
POC:
1,2,3) and (updatexml(1,concat(0x7e,(select user())),0))-- -
此种情况下,安全的做法应当使用 foreach 标签:
<select id="getUserFromList" resultType="user.NewUserDO">select * from user_table where username in<foreach collection="list" item="username" open="(" separator="," close=")">#{username}</foreach>
</select>
总结一下,碰到 jdbc 的 预编译 + 占位符 或者 mabatis 的预编译 #{} 就不用深挖了。如果碰到 jdbc 不带 预编译占位符 或者 mybatis 拼接字符 ${} 的话,值得 sql 注入一试。
相关文章:
JavaSec 之 SQL 注入简单了解
文章目录 JDBC 注入语句拼接(Statement)修复方案 语句拼接(PrepareStatement)修复方案 预编译 JdbcTemplate修复方案 MyBatisLike 注入Order By 注入In 注入 寒假学了一个月 pwn,真心感觉这玩意太底层学的我生理不适应了,接下来学一段时间 java 安全缓一…...
第十一章——期约与异步函数
ECMAScript 6及之后的几个版本逐步加大了对异步编程机制的支持,提供了令人眼前一亮的新特性。ECMAScript 6新增了正式的Promise(期约)引用类型,支持优雅地定义和组织异步逻辑。接下来几个版本增加了使用async和await关键字定义异步…...
工具方法合集-utils.js
通用 import get from lodash.get import cloneDeep from lodash.clonedeep // 深度clone export function deepClone(obj) {return obj ? cloneDeep(obj) : obj } export function lodashGet(obj, key, defaultValue = ) {//这个 defaultValue 不能给默认 值 会报错;retur…...
安卓11-设置HDMI分辨率流程
安卓11中从设置-显示设置hdmi分辨率流程:framework层通过jni控制底层驱动实现,标准驱动模型 packages\apps\Settings\src\com\android\settings\display\HdmiSettings.javaprivate void updateResolution(final ITEM_CONTROL control, final int index) {showWaitin…...
Vue3+vite搭建基础架构(11)--- 菜单栏功能和Tab页功能实现
Vue3vite搭建基础架构(11)--- 菜单栏功能和Tab页功能实现 说明删除项目中不需要的文件userStore全局属性代码菜单栏代码Tab页代码解决浏览器输入地址时不会打开tab页问题和切换tab页时参数丢失问题 说明 这里记录下自己在Vue3vite的项目实现菜单栏功能和…...
餐饮神秘顾客公司:关于餐饮行业神秘顾客调查注意事项
在餐饮业,顾客体验往往决定品牌的成败。为深入了解顾客需求和感受,许多餐饮企业引入“神秘顾客”调查。然而,此调查并非简单走过场,其中细节和注意事项颇多。餐饮行业神秘顾客调查需注意以下几点: 1. 专业培训&#x…...
概率密度函数(PDF)与神经网络中的激活函数
原创:项道德(daode3056,daode1212) 在量子力学中,许多现象都是统计的结果,基本上用的是正态分布,然而,从本质上思考,应该还存在低阶的分布,标准的正态分布是它的极限,这样一来,或许在…...
.netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
1、SqlSugarCore 相关 1.1 主项目添加数据,否则会报数据库连接错误: <InvariantGlobalization>false</InvariantGlobalization> <PropertyGroup><TargetFramework>net8.0</TargetFramework><Nullable>enable</…...
算法打卡day2|数组篇|Leetcode 977.有序数组的平方、 209.长度最小的子数组、59.螺旋矩阵II
算法题 Leetcode 977.有序数组的平方 题目链接: 977.有序数组的平方 大佬视频讲解:977.有序数组的平方 个人思路 第一时间就只想到暴力解法,双重循环一个循环比较一个循环赋值;但这样可能会超时,所以还能用双指针࿰…...
Hive【内部表、外部表、临时表、分区表、分桶表】【总结】
目录 Hive的物种表结构特性 一、内部表 建表 使用场景 二、外部表 建表:关键词【EXTERNAL】 场景: 外部表与内部表可互相转换 三、临时表 建表 临时表横向对比编辑 四、分区表 建表:关键字【PARTITIONED BY】 场景: 五、分桶表 …...
随手写的小程序2 一个nc能控制的程序
小程序源代码 下载: https://download.csdn.net/download/nn_84/88846445?spm1001.2014.3001.5501 请下载 Qt 5.12.12 server.pro : QT gui networkCONFIG c11 console CONFIG - app_bundle# You can make your code fail to compile if it uses deprecated APIs. # In o…...
Android中通过属性动画实现文字轮播效果
前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 一、创建一个自定义ProvinceView类,具体代码如下 /*** Author: ly* Date: 2024/2/22* D…...
最长的回文串
开始想的简单了,确实没想到奇数字母删去一个后也能用 解法: 桶排序 #include<iostream> #include<vector> #include<algorithm> using namespace std; #define endl \n #define int long long signed main() {int t;cin >> t…...
2023 H1 中国边缘公有云服务市场 Top2,百度智能云加速推动分布式云智能化升级
近期,IDC 发布了《中国边缘云市场跟踪研究 2023 H1》。报告显示,2023 上半年,中国边缘公有云服务市场规模 24.3 亿元,同比增速达到 41.8%。 其中,百度智能云以 15.7% 的市场份额位列中国边缘公有云服务市场第二&#…...
Emlog博客网站快速搭建并结合内网穿透实现远程访问本地站点
文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总结 前言 博客作为使…...
力扣经典题目解析--旋转图像(字节二面)
题目 原题地址: . - 力扣(LeetCode) 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1࿱…...
【ARMv8M Cortex-M33 系列 8.1 -- RT-Thread 堆内存 检查命令 free 实现及介绍】
文章目录 RT-Thread 堆内存 检查命令 free 实现及介绍rt_memory_info 函数验证 RT-Thread 堆内存 检查命令 free 实现及介绍 在RT-Thread系统中,通常可以通过rt_memory_info函数获取当前的堆内存使用信息,然后你可以包装这个函数来显示剩余的堆空间。rt…...
milvus Delete API流程源码分析
Delete API执行流程源码解析 milvus版本:v2.3.2 整体架构: Delete 的数据流向: 1.客户端sdk发出Delete API请求。 from pymilvus import (connections,Collection, )print("start connecting to Milvus") connections.connect("default", host"192…...
CentOS使用Docker搭建Halo网站并实现无公网ip远程访问
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…...
【JVM】垃圾回收算法
📝个人主页:五敷有你 🔥系列专栏:JVM ⛺️稳中求进,晒太阳 垃圾回收算法 Java是如何实现垃圾回收的呢?简单来说,垃圾回收就做两件事 找到内存中存活的对象释放不在存活对象的内存&…...
2026年电钢琴避坑指南|高性价比品牌型号推荐,新手必看!
电钢琴选购核心要点(快速避坑) 在推荐具体机型前,先明确4个选购关键指标,确保不踩坑: 1.键盘:必须88键逐级配重重锤键盘,避免毁手型。 2.复音数:至少128复音(避免弹奏复杂曲目时丢…...
实战剖析:利用Fluxion构建WiFi钓鱼热点与密码捕获
1. 环境准备与工具安装 在开始使用Fluxion进行WiFi安全测试之前,我们需要确保具备合适的硬件和软件环境。首先,你需要一台支持监听模式的无线网卡,这是进行任何无线安全测试的基础硬件。我推荐使用RTL8812AU芯片的网卡,实测下来兼…...
KLayout 0.30.0:如何用这款专业版图工具提升你的集成电路设计效率
KLayout 0.30.0:如何用这款专业版图工具提升你的集成电路设计效率 【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout 如果你正在寻找一款既强大又灵活的开源集成电路版图查看与编辑工具,KLayo…...
别再只会插卡开机了!手把手带你用APDU命令探索手机SIM卡里的文件迷宫
解码SIM卡文件系统:用APDU命令探索移动通信的微观世界 当你把SIM卡插入手机时,它就像一把打开移动网络大门的钥匙。但鲜为人知的是,这张小小的芯片内部运行着一个完整的文件系统,其复杂程度堪比微型操作系统。本文将带你用APDU命令…...
0502光刻机破局 第五卷:EUV光源系统(S级 长期死磕突破)第2小节:国内外技术参数差距
第五卷:EUV光源系统(S级 长期死磕突破) 第2小节:国内外技术参数差距(全量化对标,ASML vs 国产,死磕数据) 前置硬核声明 本节100%量化、100%对标、100%无修饰,直接把 ASML…...
WordPress Playground部署实战:从开发到生产的完整流程指南
WordPress Playground部署实战:从开发到生产的完整流程指南 【免费下载链接】wordpress-playground Run WordPress in the browser via WebAssembly PHP 项目地址: https://gitcode.com/gh_mirrors/wo/wordpress-playground WordPress Playground 是一个革命…...
智能车底盘DIY避坑指南:直流电机、减速器、编码器怎么选?TB6612FNG够用吗?
智能车底盘DIY避坑指南:直流电机、减速器、编码器怎么选?TB6612FNG够用吗? 当你第一次尝试组装智能车底盘时,站在琳琅满目的电机、减速器和驱动器面前,很容易陷入选择困难。本文将带你避开新手常踩的坑,从实…...
别再全局搜组件了!React Developer Tools 这 3 招定位文件(含 VSCode 自动跳转配置)
高效定位React组件的3种专业工作流 在接手一个大型React项目时,最令人头疼的莫过于在数百个文件中寻找特定组件的定义和使用位置。传统的全局搜索方法不仅效率低下,还容易因命名冲突导致误判。本文将分享三种经过实战验证的高效定位方法,特别…...
Keil µVision多目标配置与条件编译实战指南
1. 项目概述 在嵌入式开发中,我们经常会遇到一个实际需求:如何基于同一套源代码生成多个不同的程序版本?这个问题看似简单,但在Keil Vision这样的集成开发环境中,却涉及到项目管理、编译配置和条件编译等多个技术要点。…...
Linux环境下KingbaseES(人大金仓)数据库的自动化部署与配置实践
1. 为什么需要自动化部署KingbaseES? 第一次手动部署KingbaseES数据库的经历让我记忆犹新。那天我在机房折腾了整整6个小时,光是反复输入各种命令就让人抓狂,更别提中间因为权限问题重装了三次。相信很多DBA同行都有过类似的痛苦体验——手动…...
