Java代码审计连载之—SQL注入
前言
近日闲来无事,快两年都没怎么写代码了,打算写几行代码,做代码审计一年了,每天看代码都好几万行,突然发现自己都不会写代码了,真是很DT。想当初入门代码审计的时候真是非常难,网上几乎找不到什么java审计的资料,摸索了很长时间,搜到的也仅仅讲了点原理,为了给想学java代码审计的朋友门一点入门资料,就开始写《java代码审计连载》系列文章,本文章适合初学者,大牛留下脚印后请绕过,若代码有什么其他问题请忽略,因为那不是重点,此片只讲述SQL注入。本次写了两个简单的页面,一个登陆页面,一个查询id界面,如下:
废话不多说,开始!
SQL注入原理
先看下百度百科对SQL注入的介绍:
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。
SQL注入的表现形式
原理说的很正式,但是对初学者来说很笼统,对代码审计的来说也是不怎么明白。你那么总结起来,SQL注入在代码中体现的有以下3点:
1、传递的参数为用户可控;
什么叫参数为用户可控?其实前端传入的一切参数均为用户可控,包括:
这里的一切数据,参数传入后台后,接收的形式是什么样的呢?代码如下

request.getParameter("searchWord")是从前端获取参数的一种方式(当然还有其他方式,此处不赘述),而从前端获取的参数名为“searchWord”,也就是此处jsp页面中input标签中的id为“searchWord”的值,如下:
因此“searchWord”就是前端我们输入的“id”值。
2.系统未对传入后台的参数做任何特殊字符过滤,或者字符过滤不全。
什么是特殊字符,对SQL注入而言,特殊字符包括(注意大小写):
--,#,//(注释符)
and
or
select
update
delete
drop
declare
insert
xp_shell
(,)括号
||,+, (空格) 连接符
' 单引号
|(竖线符号)
& (& 符号)
;(分号)
$(美元符号)
%(百分比符号)
@(at 符号)
'(单引号)
"(引号)
\'(反斜杠转义单引号)
\"(反斜杠转义引号)
<>(尖括号)
CR(回车符,ASCII 0x0d)
LF(换行,ASCII 0x0a)
,(逗号)
\(反斜杠)
3、SQL语句是以拼接的形式执行,代码如下所示:
SQL语句一旦以拼接的方式执行,就表示拼接的参数“word”是表示一个SQL语句,而不仅仅是作为一个参数执行,什么意思呢?详细如下:
如果word的值为1,那么SQL语句变成:
Select * from test where id = 1
如果word的值为1’ and ‘a’=’a,那么SQL语句变成:
Select * from test where id = 1’ and ‘a’=’a
最后在数据库中执行的时候就是
想必大牛们都明白这一点,就不赘述了。
以上3点就是造成SQL注入产生的根本原因。
SQL页面展示
下面贴上SQL注入漏洞页面:
搜索框输入:1
查看执行结果:
搜索框输入:1’
查看执行结果:
搜索框输入:1’ and ‘a’=’a
查看执行结果:
尝试爆出数据库长度(过程忽略):

表示数据库长度为:8
顺便贴上SqlMap截图:


剩下的不深入,你们比我懂。
SQL注入的修复
SQL注入在java代码中的修复其实也是非常简单,主要有两个方式:
1、添加全局过滤器,过滤特殊字符;方式如下:
Web.xml:
SQLFilter.java中:
2.SQL语句使用参数化查询方式,代码如下:
使用参数化查询才是SQL注入最根本的修复方式。
修复后SqlMap截图:

结论:
本篇文章没有多少技术含量,希望对安全开发人员和学习代码审计人员有一点可取之处。本《java代码审计连载篇》会继续编写,希望大家多多支持,若有错误和不足之处,请指出来,谢谢!
Java代码审计连载之—SQL注入的更多相关文章
- 代码审计中的SQL注入
0x00 背景 SQL注入是一种常见Web漏洞,所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.本文以代码审计的形式研 ...
- php代码审计--sql注入
sql注入是web安全中最常见,也是平常中危害最大的漏洞. 最近在学习代码审计,拿自己审核的一段代码做个笔记. 1.sql语句拼接可能引起sql注入 很多偷懒的程序员对于没有过滤的参数,直接将其拼接到 ...
- Java学习之路- SQL注入
用户名: __________ 密码:——————— 假如没有使用预处理的Statement 对象 拼接字符串查数据库的话,易收到sql注入攻击: 例如说 : mysql 中 #代表的是单行注释 ...
- Java代码审计连载之—添油加醋
在代码审计中,按业务流程审计当然是必须的,人工的流程审计的优点是能够更加全面的发现漏洞,但是缺点是查找漏洞效率低下.如果要定向的查找漏洞,逆向跟踪变量技术就显得更加突出,如查找XSS.SQL注入.命令 ...
- 【挖坑】2019年JAVA安全总结:SQL注入——新项目的开发与老项目的修复
如何在项目中有效的防止SQL注入 写给需要的人,所有的问题源自我们的不重视. 本章略过"什么是SQL注入","如何去利用SQL注入"的讲解,仅讲如何去防御 PS ...
- MySQL_(Java)使用preparestatement解决SQL注入的问题
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL数据库中的数据,数据库名garysql,表名gar ...
- 2020/1/27代码审计学习之SQL注入漏洞
PHP代码审计SQL注入漏洞 0x00 首先明确什么是SQL注入,SQL语句必须掌握. 常见的注入总的来说可以分为两大类:数字型和字符型. 这两类中包含了诸如报错注入,宽字节注入,盲注,二次注入,co ...
- php代码审计3审计sql注入漏洞
SQL注入攻击(sql injection)被广泛用于非法获取网站控制权,在设计程序时,忽略或过度任性用户的输入,从而使数据库受到攻击,可能导致数据被窃取,更改,删除以及导致服务器被嵌入后门程序等 s ...
- 【代码审计】VAuditDemo SQL注入漏洞
这里我们定位 sqlwaf函数 在sys/lib.php中,过滤了很多关键字,但是42 43 44行可以替换为空 比如我们可以 uni||on来绕过过滤
随机推荐
- pt-query-digest详解慢查询日志
一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdu ...
- 2018.12.17 bzoj3667: Rabin-Miller算法(Pollard-rho)
传送门 Pollard−rhoPollard-rhoPollard−rho板题. 题意简述:给出几个数,让你判断是不是质数,如果不是质数就求出其最大质因子,数的大小为1e181e181e18以内. 先 ...
- atcoder题目合集(持续更新中)
Choosing Points 数学 Integers on a Tree 构造 Leftmost Ball 计数dp+组合数学 Painting Graphs with AtCoDeer tarja ...
- Jetty配置
类似TomCat 登陆官网www.eclipse.org Download下载Jetty zip压缩版 解压到文件夹,打开idea的Config->Jetty-server->Local- ...
- hdu-4300(字符串hash)
题目链接:传送门 参考文章:传送门 思路: (1)对字符串进行翻译,求出s1(未翻译),s2(已翻译)字符串,并分别对s1,s2进行hash操作. (2)比较s1的后x位和s2的前x位的hash值,求 ...
- dex2jar 和 jd-gui 的安装与使用(转)
出处:https://blog.csdn.net/katrinawj/article/details/80016315 将APK直接解压(修改后缀名为.zip,然后解压)后,可以看到目录下包含一个cl ...
- Android APP测试流程
一. Monkey测试(冒烟测试) 使用monkey测试工具进行如下操作: 1. APP的安装 2. APP随机操作测试(APP压力测试) 3. APP的卸载 二. 安装卸载测试 1. 使用测试真机进 ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
- 【王者荣耀之IT大神版】比赛制度说明(匹配赛、排位赛、赏金赛)
匹配赛(30分钟): 所得金币=6金币/分钟 经验(挂机:玩手机超过30秒): 名次 经验值 胜利条件 失败条件 1 5 提前10min 超出1min 2 4 提前8min 超出3min 3 4 提前 ...
- #微码分享#AES算法的C++包装类
AES为Advanced Encryption Standard的缩写,中文名:高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,用来替代DES.基于std:: ...