sql注入java代码_Java代码审计连载之—SQL注入

前言

近日闲来无事,快两年都没怎么写代码了,打算写几行代码,做代码审计一年了,每天看代码都好几万行,突然发现自己都不会写代码了,真是很DT。想当初入门代码审计的时候真是非常难,网上几乎找不到什么java审计的资料,摸索了很长时间,搜到的也仅仅讲了点原理,为了给想学java代码审计的朋友门一点入门资料,就开始写《若代码有什么其他问题请忽略,因为那不是重点,此片只讲述SQL注入。本次写了两个简单的页面,一个登陆页面,一个查询id界面,如下:

d2363723e96fc61168401e9df9e38f8b.png

c7b374a2ce5ef437b45a9cc98894471b.png

废话不多说,开始!

SQL注入原理

先看下百度百科对SQL注入的介绍:

所谓SQL注入,就是通过把SQL命令插入到Web提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。

SQL注入的表现形式

原理说的很正式,但是对初学者来说很笼统,对代码审计的来说也是不怎么明白。你那么总结起来,SQL注入在代码中体现的有以下3点:

1、传递的参数为用户可控;

什么叫参数为用户可控?其实前端传入的一切参数均为用户可控,包括:

7757675a78bde62c570eb1558c06f84e.png

这里的一切数据,参数传入后台后,接收的形式是什么样的呢?代码如下

036be0a826ba5ae0b76674b9e706e6b5.png

request.getParameter("searchWord")是从前端获取参数的一种方式(当然还有其他方式,此处不赘述),而从前端获取的参数名为“searchWord”,也就是此处jsp页面中input标签中的id为“”的值,如下:

15c48de9c9fce9b7319adbae29300e1a.png

因此“searchWord”就是前端我们输入的“id”值。

2.系统未对传入后台的参数做任何特殊字符过滤,或者字符过滤不全。

什么是特殊字符,对SQL注入而言,特殊字符包括(注意大小写):

--,#,//(注释符)

and

or

select

update

delete

drop

declare

insert

xp_shell

(,)括号

||,+, (空格) 连接符

' 单引号

|(竖线符号)

& (& 符号)

;(分号)

$(美元符号)

%(百分比符号)

@(at 符号)

'(单引号)

"(引号)

\'(反斜杠转义单引号)

\"(反斜杠转义引号)

<>(尖括号)

CR(回车符,ASCII 0x0d)

LF(换行,ASCII 0x0a)

,(逗号)

\(反斜杠)

3、SQL语句是以拼接的形式执行,代码如下所示:

055e7d9ee021728e27c6d5d723c38dbb.png

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

最后在数据库中执行的时候就是

3e18fbfabb99929a889f6e16216ece1f.png

想必大牛们都明白这一点,就不赘述了。

以上3点就是造成SQL注入产生的根本原因。

SQL页面展示

下面贴上SQL注入漏洞页面:

搜索框输入:1

4f7910fdf5bff65d221506cd71fa0888.png

查看执行结果:

2eeeea08f8680aff271453ba17dbf8e8.png

搜索框输入:1’

查看执行结果:

cd22fcef592eb75e582c61b5762e5391.png

搜索框输入:1’and‘a’=’a

查看执行结果:

8a6b92461def83e5820b226a2c57ef4a.png

尝试爆出数据库长度(过程忽略):

0b97e078617172d11801b1fc1167094f.png

e4ca5e66128d576e6f6c79a968eb1152.png

表示数据库长度为:8

顺便贴上SqlMap截图:

a06a2998deb8e5b14b78c67c57f77f89.png

79855d95b46a66eef1a2d2c7a1f5d35b.png

剩下的不深入,你们比我懂。

SQL注入的修复

SQL注入在java代码中的修复其实也是非常简单,主要有两个方式:

1、添加全局过滤器,过滤特殊字符;方式如下:

Web.xml:

f6ac665be6225e66dcda0d22b8c94f9d.png

SQLFilter.java中:

a32fb31e45b80daa80c9af8b98ea39a9.png

2.SQL语句使用参数化查询方式,代码如下:

使用参数化查询才是SQL注入最根本的修复方式。

修复后SqlMap截图:

98f1904abbff7e57d42717750c213467.png

结论:

希望本文对安全开发人员和学习代码审计人员有一点可取之处,本《java代码审计连载篇》会继续编写,希望大家多多支持,若有错误和不足之处,请指出来,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值