这些年我们发现越来越多的公司开始注重安全测试了,为什么?因为安全测试可以在某种程度上可以排查掉你项目的一些安全漏洞,这样你的系统上线后才会相对安全,才有可能尽量避免来自外部的攻击。每一年互联网都会发生一些重大的安全事件,而且每一次带来的后果也是很严重的,而这些教训恰恰都说明了安全测试的重要性。

那什么是安全测试呢?百度百科上给出来的解释是:安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程 。按照小编的理解,简单点来讲,其实安全测试可以这么理解:安全测试其实就是测试你的系统是否有安全漏洞,普通测试以发现BUG为目标,安全测试以发现安全隐患为目标。

那么安全测试有哪些东西可以测呢?我们在对一个系统进行安全测试的时候其实是有很多应该考虑进去的,像表单攻击,sql注入,XSS攻击,CSRF攻击,暴力破解等。

小编今天要讲的是安全测试下的SQL注入,通过学习,了解什么是sql注入,同时小编我会结合项目中的几种情况来为大家讲解常见的sql注入场景以及如何去执行sql注入攻击。首先我们来看一下什么是sql注入,解释:sql注入就是通过构建一些特殊的表达式或这一些特殊的sql命令,通过表单提交到后台服务器,最终达到欺骗服务器执行恶意的SQL命令,或者达到一个绕过服务器校验的一个效果。

第一种比较常见的注入场景是系统的登录功能,当然现在很多大公司的项目在这一块是做的很好,也做的非常安全的,很少会留下sql注入这样的漏洞,而一些小的系统,小的项目或者自己写着玩的系统可能会存在这样的安全漏洞。这里我就写了一个简单的登录注册功能,来帮助大家了解什么是sql注入,大概逻辑是这样的:通过在登录页面输入用户名和密码来完成登录,后台会拿到前台表单提交的数据去数据库做校验匹配,如果存在此用户就让登录成功,如果匹配不到就提示“错误的用户名或者密码”。然后我们这里呢会通过构建一些特殊的数据或者表达式来实现sql注入。现在小编就先把这个登录功能的前台页面和后台的几行关键代码贴出来:

以下是前台登录页面:

以下是后台登录关键代码:

其实我们看到这个后台的核心代码其实就是拿到前台用户名和密码去数据库做了检索,看是否存在,存在就放行,不存在就提示错误信息。然后接下来我们来测试一下登录,首先我们拿数据库表里已经注册的用户“001@qq.com/111111”来登录:

前台登录界面输入用户名“001@qq.com”,密码“111111”,点击登录,然后我们发现成功登录了,这个结果是正常的。

然后我们接着来试一下错误的用户名或者密码,这里我们直接拿一个上面用户表不存在的用户“007@qq.com/111111”来进行登录,最后结果提示“用户名或者密码错误”,这个结果也是正常的。

正确的用户名密码能登录成功,错误的用户名密码就登录失败,看上去没有任何问题,那是不是就意味着这个登录功能就没有bug没有漏洞了呢?现在下决定还为时尚早,前面我们做测试都是拿的正常的数据,不是特殊,极端的数据。后面我们将输入一些特殊的数据来继续完成测试。测试之前,我们来分析一下登录的一行核心代码,我们稍微有点编程基础的同学都看得懂下面登录逻辑里的数据库查询代码:

这一行代码其实就是拿到前端传进来的用户名和密码来拼接得到一条sql,然后在后台执行这条拼接的sql去查询用户表是否存在这样的用户,看上去似乎没啥问题,其实不然,我们看到这条sql里的条件字段的跟它的值拼接的时候用了一对单引号包起来了,这个也很好解释,因为数据库中字符串类型的条件字段后面带值的时候需要带一对单引号(这里需要一定的数据库基础,没有这部分基础的同学可以加我们的测试群,找相关管理员要数据库基础这一部分视频来学习),而正是因为这样的拼接写法导致了sql注入漏洞的存在,因为我们可以通过在前端登录页面用户名一栏输入:’ or ‘1’=’1这样一个特殊的表达式,密码的话随便填一个,比如还是填111111,那最后服务器后台拿到前台传入的用户名和密码去做sql拼接的时候,得到的最终sql将会是这样一条:select count(*) from nm_user where password=’111111’ and username=’’ or ‘1’=’1’;而这样一条sql因为存在一个恒等的条件表达式:’1’=’1’,所以无论如何都可以从user表查到数据的(只要user表有数据),所以最后就通过了服务器后台的校验,登录成功了,如下图:

但是,我们的数据库其实是没有这样的用户的。这里再次附上我们用户表的数据:

而这样的一个用户名却登录成功了,这个就是sql注入,通过构建一些特殊的表达式或者特殊的sql然后通过表单提交到后台服务器,骗过后台服务器去执行这样一条恶意的sql或者别有用心的sql来绕过服务器的校验。

好的,简单的举例说明了一下什么是sql注入,我相信大家也对于这个概念有了一定的理解,这里其他的一些sql注入场景这里就不再另行举例了,例子是变的,但是思想是不变的,大家把握住sql注入的概念和思想就可以了。大家可以写个简单的demo去验证下,或者拿自己公司的项目去验证下,不保证能复现这样的问题,因为这样的sql注入漏洞还是很好去避免的,直接使用ibatis,mybatis,hibernate数据库等框架的相关API就能规避这样的安全漏洞,因为这些框架里操作数据库的API底层都是使用的PreparedStatement而不是Statement,前者相对于后者的一个好处是它提供了一个sql预编译的机制和防注入的一个功能。

【数据库】软件安全测试之SQL注入的更多相关文章

  1. web安全测试&渗透测试之sql注入~~

    渗透测试概念: 详见百度百科 http://baike.baidu.com/link?url=T3avJhH3_MunEIk9fPzEX5hcSv2IqQlhAfokBzAG4M1CztQrSbwsR ...

  2. 安全测试之sql注入

    不管是web界面还是app,都会涉及表单输入和提交,如果程序员没有对提交的字符进行过滤或者特殊处理,很容易会产生问题,这里讲的的sql注入就是其中一种方式,在表单中输入sql语句达到进入系统的目的. ...

  3. jdbc操作数据库以及防止sql注入

    public class pr { public static void main(String[] args) { Connection conn = null; Statement st = nu ...

  4. 渗透测试之sql注入验证安全与攻击性能

    由于渗透测试牵涉到安全性以及攻击性,为了便于交流分享,本人这里不进行具体网址的透露了. 我们可以在网上查找一些公司官方网站如(http://www.XXXXXX.com/xxxx?id=1) 1.拿到 ...

  5. 渗透测试之sql注入点查询

    一切教程在于安全防范,不在于攻击别人黑别人系统为目的 寻找sql注入点方法: 拿到网页后进行查找注入点: 1.通过单引号 ' ;    在 url 后面输入单引号进行回车(如果报错可能存在sql注入为 ...

  6. 【数据库】 防止sql注入,过滤敏感关键字

    private bool FilterIllegalChar(string sWord) { var result = false; var keyWord = @"select|inser ...

  7. 常用数据库2 sqlite及SQL注入

    知识内容: 1.sqlite数据库介绍 2.sqlite数据库操作 3.SQL注入 一.sqlite数据库介绍 1.sqlite数据库 sqlite数据库:轻量级的数据库,一般开发中使用sqlite数 ...

  8. Java防止SQL注入(转)

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  9. 防SQL注入

    addslashes(); 一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库 ...

随机推荐

  1. H5实现的时钟

    源码如下: <!doctype html> <html> <head></head> <body> <canvas id=" ...

  2. Linux/Unix系统编程手册 第三章:系统编程概念

    本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...

  3. 【jQuery插件】pagepiling滚屏插件使用

    pagePiling.js 这款 jQuery 插件可以帮助前端开发人员轻松实现全屏滚动效果. 支持所有的主流浏览器,包括IE8+,支持移动设备.下面详细讲解下pagePiling.js的使用步骤. ...

  4. Qss 样式表的尝试

    QLineEdit{ border:1px solid #137eb6; padding:2px; background-color:#F5F5F5; } QToolTip{ border:1px s ...

  5. BZOJ5102 POI2018Prawnicy(堆)

    考虑固定右端点,使左端点最小.那么按右端点排序后查询前缀这些区间的左端点第k小即可.然而写了一个treap一个线段树都T飞了,感觉惨爆.事实上可以用堆求第k小,维护一个大根堆保证堆中元素不超过k个即可 ...

  6. python selenium2 有关cookie操作实例及如何绕开验证码

    1.先看一下cookie是啥 cookie是访问web时服务器记录在用户本地的一系列用户信息(比如用户登录信息),以便对用户进行识别 from selenium import webdriver im ...

  7. 【刷题】洛谷 P1501 [国家集训队]Tree II

    题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...

  8. 单点登录(十七)----cas4.2.x登录mongodb验证方式成功后返回更多信息更多属性到客户端

    我们在之前已经完成了cas4.2.x登录使用mongodb验证方式登录成功了.也解决了登录名中使用中文乱码的问题. 单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方 ...

  9. java之初学线程

    线程 学习线程相关的笔记,前面写过关于很多线程的使用,有兴趣的可以去了解下 线程 概念理解 并发 : 指两个或多个事件在同一个时间段内发生(交替执行). 并行 : 指两个或多个事件在同一时刻发生(同时 ...

  10. Eclipse Oxygen(4.7.0)安装插件Eclipse Class Decompiler反编译JAR文件

    引用自官方内容 Eclipse Class Decompiler是一款Eclipse插件,整合了多种反编译器,和Eclipse Class Viewer无缝集成,能够很方便的使用插件查看类库源码,进行 ...