SQL注入基础

简介: SQL注入基础

一.产生

当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查。

在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到sql语句中,被当作sql语句的一部分进行执行,如果代码中没有过滤或者过滤不严谨是会出现漏洞的。 (拓扑图如图一)

二.SQl注入类型:

包括数字型注入、UNION注入、字符型注入、布尔盲注、时间注入、报错注入和堆叠注入等。

1.数字型

数字型注入就是指注入点的数据类型为数字型,没有用单引号引起来。

判断方法:

当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:

select * from <表名> where id = x

这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。

Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

原因如下:

当输入 and 1=1时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=1

没有语法错误且逻辑判断为正确,所以返回正常。(如图二)

当输入 and 1=2时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=2

没有语法错误但是逻辑判断为假,所以返回错误。(如图三)

我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

select * from <表名> where id = 'x and 1=1'
select * from <表名> where id = 'x and 1=2'

查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

参考博客

2.字符型

字符型注入就是注入点的数据类型是字符型。与数字型的区别在于字符型注入要用一对单引号引起来。

字符型判断:

当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:

select * from <表名> where id = ‘x’

这种类型我们同样可以使用 and ‘1’='1 和 and ‘1’='2来判断:

Url 地址中输入 http://xxx/abc.php?id= x' and '1'='1 页面运行正常,继续进行下一步。
 Url 地址中继续输入 http://xxx/abc.php?id= x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。

原因如下:

当输入 and ‘1’='1时,后台执行 Sql 语句:

select * from <表名> where id = ‘x’ and ‘1’=‘1’

语法正确,逻辑判断正确,所以返回正确。(图四)

当输入 and ‘1’='2时,后台执行 Sql 语句:

select * from <表名> where id = ‘x’ and ‘1’=‘2’

语法正确,但逻辑判断错误,所以返回错误。(图五)

3.UNION注入 (流程):

依次判断类型,字段数,回显点,依次爆库名,表名,字段名,数据.

(1)类型判断(字符型or 数字型)

(2)判断字段数:

例如:id=1’ order by 1 – +(或-- -)

union有一个十分严格的约束条件,因为是联合查询,必选保证字段数一致,即两个查询结果有相同的列数,因此我们要对字段数进行判断,使用 order by number 其作用为输出第number列。(注释符-- +,使后面语句失效)

(图一)

此时页面正常,增加number;

当页面异常时(图二)

number-1即为实际列数。

(3)判断回显点

知道该表的字段数之后,我们还需要确定在哪个字段出会输出有效信息。

联合查询的输出是严格按照顺序进行的,因此当id=1存在时会在第0行输出第一个sql语句查询到的结果,自然我们输入的数字就到了下一行。而 limit num1,num2的作用为从第num1行开始显示num2行内容

我们可以看到2,3被输出了(图三),

说明这两个位置都可以作为回显点。

当然我们也可以不用limit语句,只需让前面sql语句查询结果为空即可(如图四)

(4)爆库名,表名,字段名,数据 同数据库查询方法。

4.堆叠注入

实质就是通过结束符(分号)来执行多条sql语句。

我们在mysql的命令行界面执行一条查询语句,这时语句的结尾必须加上分号结束,如果我们想要执行多条sql那就用结束符分号进行隔开。就是在不可控的用户输入中通过传入结束符+新的sql语句来获取想要的息,大致过程如(图五)

触发条件

1.目标存在sql注入漏洞2.目标未对";"号进行过滤3.目标中间层查询数据库信息时可同时执行多条sql语句。

5.布尔盲注

(1)适用情况

没有返回SQL执行的错误信息,

错误与正确的输入,返回的结果只有正确与错误(图一与图二)

(2)相关函数:

left()函数

语法:left (string,n) string为要截取的字符串,n为长度。

payload:name=lili’ and left((select database()),1)=‘p’–+ (图三)

mid()函数:

语法:mid(string, start[, length]) ,string为要提取字符的字段,start为开始截取位置(起始值是1),length为截取的长度(可选,默认余下所有字符)

(图四)

正则表达式 regexp

语法: regexp^【a-z】表示字符串中第一个字符是在 a-z范围内。

regexp ^a 表示字符串第一个字符是a。

regexp ^ab 表示字符串前两个字符是ab。payload:name=lili’ and (select database()) regexp ‘^p’–+ (图五)

like函数:语法:Like 'a%'表示字符串第一个字符是a。 Like 'ab%‘表示字符串前两个字符是ab。%表示为任意值,payload:name=lili’ and (select database()) like ‘p%’–+

(图六)

if语句

语法:if(判断条件,正确返回的值,错误返回的值),注意数据库中的if与后端if不一样,payload:name=lili’ and 1= if(((select database())like ‘p%’),1,0)–+ ,表示如果if语句中的第一个参数为真,则输出第一个值1,不为真输出第二个值0;

(图七)

substr()函数

substr()函数是截取字符串的函数。

语法:substr(string,start,length)

参数string :被截取的字符串。

参数start :截取的起始位置。

参数length :从截取位置截取的长度。

char(x)函数

将x的值转为所对应的字符

payload:name=lili’ and mid((select database()),1,1)=char(112)–+

ord()函数

返回一个字符的ASCII码。

语法:ord(character)

参数character:为单个字符,如果是字符串的话,则只按照字符串的第一个字符计算。

length()函数

length()函数是否返回一个字符串的长度。

语法:length(string)

参数string :为需要输出其长度的字符串。

(3)基本操作步骤:

构造目标查询语句,选择拼接方式,构造判断表达式,提取数据长度,提取数据内容。

目录
相关文章
|
10天前
|
SQL Web App开发 安全
【less-1】基于SQLI的SQL字符型报错注入
【less-1】基于SQLI的SQL字符型报错注入
15 2
|
10天前
|
SQL 安全 PHP
基于PHPCMS的SQL注入(Havij)
基于PHPCMS的SQL注入(Havij)
15 1
|
23天前
|
SQL 关系型数据库 MySQL
怎么通过第三方库实现标准库`database/sql`的驱动注入?
在Go语言中,数据库驱动通过注入`database/sql`标准库实现,允许统一接口操作不同数据库。本文聚焦于`github.com/go-sql-driver/mysql`如何实现MySQL驱动。`database/sql`提供通用接口和驱动注册机制,全局变量管理驱动注册,`Register`函数负责添加驱动,而MySQL驱动在`init`函数中注册自身。通过这个机制,开发者能以一致的方式处理多种数据库。
|
29天前
|
SQL 安全 关系型数据库
SQL 注入神器:SQLMap 简单使用
SQL 注入神器:SQLMap 简单使用
|
10天前
【干货】sql-labs、请求方式、注入类型、拼接方式
【干货】sql-labs、请求方式、注入类型、拼接方式
10 0
|
1月前
|
SQL 存储 Java
如何避免SQL注入攻击?
如何避免SQL注入攻击?
|
19小时前
|
SQL 安全 Java
java的SQL注入与XSS攻击
java的SQL注入与XSS攻击
7 2
|
9天前
|
SQL 监控 安全
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
|
10天前
|
SQL Web App开发 前端开发
【less-11】基于SQLI的POST字符型SQL注入
【less-11】基于SQLI的POST字符型SQL注入
21 2
|
10天前
|
SQL 开发框架 安全
【干货】如何判断 Sql 注入点
【干货】如何判断 Sql 注入点
15 1