天天看点

#yyds干货盘点#sql注入总结

一、介绍

1.什么是SQL注入?

sql 注入是一种将 sql 代码添加到输入参数中,传递到 sql 服务器解析并执行的一种GJ手法。

2.SQL注入的原理

SQL 是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用 SQL。而 SQL 注入是将 Web 页面的原 URL、表单域或数据包输入的参数,修改拼接成 SQL 语句,传递给 Web 服务器,进而传给数据库服务器以执行数据库命令。

3.形成SQL注入的原因

用户输入的数据被 SQL 解释器执行。

4.SQL注入的危害

1、GJ者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。2、通过操作数据库对某些网页进行篡改;3、修改数据库一些字段的值,嵌入网马链接,进行挂马GJ。4、服务器被远程控制,被安装后门。可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。5、数据库被恶意操作:数据库服务器被GJ,数据库的系统管理员帐户被篡改。6、破坏硬盘数据,导致全系统瘫痪。

5.SQL注入基本知识

注:以下命令语句均基于 MySQL 数据库

(1)增删改查语句

增 Insert

基本语法 ​

​INSERT INTO 表名称 VALUES (值1, 值2,....)​

​例子 

insert into student(name,sex,age) values('张三',18,'男')

删 delete

基本语法 ​

​DELETE FROM 表名称 WHERE 列名称 = 值​

​例子 

delete from student where id=1

改 update

基本语法 ​

​UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值​

​列子 

update student set name = '张三' where id=1

查 select

基本语法 ​

​SELECT 列名称 FROM 表名称​

​例子 

select * from student

(2)系统函数

  • version()——MySQL 版本
  • user()——数据库用户名
  • database()——数据库名
  • @@datadir——数据库路径
  • @@version_compile_os——操作系统版本

(3)字符串连接函数

​concat(str1,str2,...)​

​​没有分隔符地连接字符串

​​

​concat_ws(separator,str1,str2,...)​

​​含有分隔符地连接字符串

​​

​group_concat(str1,str2,...)​

​连接一个组的所有字符串,并以逗号分隔每一条数据

(4)一般流程

Mysql 有一个系统数据库 information_schema,存储着所有的数据库的相关信息,一般的, 我们利用该表可以进行一次完整的注入。以下为一般的流程。

猜数据库

​select schema_name from information_schema.schemata​

猜某库的数据表

​select table_name from information_schema.tables where table_schema=’xxxxx’​

猜某表的所有列

​Select column_name from information_schema.columns where table_name=’xxxxx’​

获取某列的内容

​​

​Select *** from ****​

二、分类

根据输入参数分为:

  • 数字型注入
  • 字符型注入

根据注入技巧分为:

  • 联合注入
  • 盲注
  • 堆叠注入
  • 报错注入
  • 二次注入
  • 宽字节注入

根据提交类型分为:

  • GET 注入
  • POST 注入
  • COOKIE 注入
  • HTTP 头部注入

1.根据输入参数分类的 SQL 注入

(1)数字型注入

我们经常可以看到这样的 url ​​http://xxx.com/users.php?id=1​​ 基于此种形式的注入,一般被叫做数字型注入,这是因为其注入点 id 类型为数字。这一类的 SQL 语句原型一般为 select * from 表名 where id=1。

(2)字符型注入

我们有时又会看到这样的 url ​​http://xxx.com/users.php?name=admin​​ 基于此种形式的注入,一般被叫做字符型注入,这是因为其注入点 name 类型为字符串。这一类的 SQL 语句原型一般为 select * from 表名 where name='admin'

2.根据注入技巧分类的 SQL 注入

(1)联合注入

什么是联合注入?

联合注入顾名思义,就是使用联合查询进行注入的一种方式,是一种高效的注入的方式,适用于有回显同时数据库软件版本是5.0以上的 MYSQL 数据库。

union 操作符介绍

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

(2)盲注

什么是盲注?

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时我们需要利用一些方法进行判断或尝试,这个过程称为盲注

盲注的分类

a.布尔盲注

什么是布尔盲注?

布尔盲注是指利用页面返回的对错信息来间接推测数据库中的信息的一种手段。(构造逻辑判断)

适用条件:布尔盲注一般适用于页面没有回显字段(不支持联合查询),且 web 页面返回 True 或者 false 时。

常用函数

截取函数:left() right() substr() mid()
转换函数:ascii() hex()
比较函数:if()      
b.时间盲注

什么是时间盲注?

时间盲注又称延时注入,指通过页面执行的时间来判断数据内容的注入方式。

什么时候使用?

当注入时,无论我们传入什么值,网页正常或报错都显示一种页面时,那么网页的是否正常显示将不是我们用来判断是否注入成功的依据,就要用基于时间的盲注。

方法:通过if判断语句与 sleep 函数结合,通过网站访问的响应时间来判断sql语句的正确性

示例:​

​if(left(database(),1)='s',0,sleep(3))​

​这段 payload 的含义是如果数据库的第一位为's'时,网页正常执行,否则延时3秒

c.报错盲注

什么是报错盲注?

是指通过构造特定的SQL语句,让GJ者想要查询的信息通过页面的错误提示回显出来的注入方式

什么时候使用:当正常的回显注入无法显示结果,网页可以显示报错信息时,就可以使用报错注入

常见的报错函数

1)floor 报错注入

在进行报错注入时,floor()函数一般需要与rand()、count()、group by联用。

示例:

​Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2)) a from information_schema.columns group by a​

原理:

rand() 随机产生0~1的数值,floor() 向下取整,所以 floor(rand()*2结果是0或1。

group by 用于分组,当同时执行count和group by函数时,MYSQL会创建一个虚拟表,虚拟表进行计数和分组。在执行group by语句的时候,group by语句后面的字段会被运算两次。

floor会报错的原因就是group by在向临时表插入数据时,插入重复主键导致的报错,又因为报错之前concat()里的语句已经执行过了,所以会直接爆出concat函数里执行后的结果

2)exp 报错注入

示例:

​select exp(~(select * FROM(SELECT USER())a))​

原理:

exp()即为以e为底的对数函数,exp中的函数成功执行后返回0,对0按位取反会返回一个无符号的BIGINT值,所以会造成Double型数据溢出错误从而报错,借此得到数据。

3)extractvalue 和 updatexml 报错注入

示例:

​extractvalue(1,concat(0x7e,(select @@version),0x7e))​

updatexml(1,concat(0x7e,(select @@version),0x7e),1)

原理:

当使用 extractvalue(xml_frag, xpath_expr) 函数时,若 xpath_expr 参数不符合 xpath 格式,就会报错。而 ~ 符号(ascii 编码值:0x7e)是不存在 xpath 格式中的, 所以一旦在 xpath_expr 参数中使用 ~ 符号,就会产生 xpath syntax error (xpath语法错误),通过使用这个方法就可以达到报错注入的目的。

updatexml同理

(3)堆叠注入

什么是堆叠注入?

堆叠注入产生的原因?

联合注入与堆叠注入的区别