SQL漏洞注入(附实战练习)

环境部署

phpstudy、DVWA、SQLI-LABS(学习sql注入平台)、upload-labs、课程源码环境web

SQL注入原理

SQL 注入就是指 web 应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的 参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过构造恶意的 sql 语句来 实现对数据库的任意操作。

举例说明:

i d = id= id=_GET[‘id’]

s q l = S E L E C T ∗ F R O M u s e r s W H E R E i d = sql=SELECT * FROM users WHERE id= sql=SELECTFROMusersWHEREid=id LIMIT 0,1

Mysql与SQL注入相关的知识

1.information_schema

a) 在 MySQL5.0 版本后,MySQL 默认在数据库中存放一个“information_schema”的 数据库,在该库中,我们需要记住三个表名,分别是 schemata,tables,columns。

b) Schemata 表存储的是该用户创建的所有数据库的库名,需要记住该表中记录数据 库名的字段名为 schema_name。

c) Tables 表存储该用户创建的所有数据库的库名和表名,要记住该表中记录数据库 库名和表名的字段分别是 table_schema 和 table_name.

d) Columns 表存储该用户创建的所有数据库的库名、表名、字段名,要记住该表中 记录数据库库名、表名、字段名为 table_schema、table_name、columns_name。

2.数据库的结构

a) 数据库(database):按照数据结构来组织、存储和管理数据的仓库多个数据表 的集 l

b) 数据表(table):以矩阵方式存储数据,在操作界面中以表格形式展现; l

c) 列(column): 具有相同数据类型的数据的集合; l

d) 行(row): 每一行用来描述某条记录的具体信息; l

e) 值(value): 行的具体信息, 每个值必须与该列的数据类型相同; l

f) 表头(header): 每一列的名称; l

g) 键(key): 键的值在当前列中具有唯一性。

SQL漏洞注入(附实战练习)_第1张图片

3.数据库查询语句

a) 数据库查询语句如下:

想要查询的值 A= select 所属字段名 A from 所属表名 where 对应字段名 B=值 B

4.Limit 的用法

Limit 的使用格式是 limit m,n,其中 m 指的是记录开始的位置,从 m=0 开始,表示第一条记录;

n 是指取几条记录。

5.需要记住的几个函数

a) Version();当前 mysql 的版本

b) Database();当前网站使用的数据库

c) User();当前 MySQL 的用户

6.注释符号

三种注释符号:

i. 1.#

ii. 2.–空格 空格可以使用+代替 (url 编码%23 表示注释)

iii. 3. //

SQL注入的探测方法

1.SQL 注入漏洞攻击流程

SQL漏洞注入(附实战练习)_第2张图片

2.SQL 注入漏洞探测方法

一般来说,SQL 注入一般存在于形如:http://xxx.xxx.xxx/abc.asp?id=XX 等带有参数的 ASP 动态网页中,有时一个动态网页中可能只有一个参数,有时可能有 N 个参数,有时是整型 参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页并且该网页访问 了数据库,那么就有可能存在 SQL 注入。如果 ASP 程序员没有安全意识,没有进行必要的字符 过滤,存在 SQL 注入的可能性就非常大。

在探测过程中,需要分析服务器返回的详细错误信息。在默认情况下,浏览器仅显示“HTTP 500 服务器错误”,并不显示详细的错误信息。因此,需要调整浏览器的配置。在 IE 浏览器中 选择“工具”→“Internet 选项”命令,弹出“Internet 选项”对话框,选择“高级”选项卡,把“显示友好 HTTP 错误信息”前面的勾去掉。

3.注入类型判断

为了把问题说明清楚,以下以 http://xxx.xxx.xxx/abc.asp?ip=YY 为例进行分析,YY 可 能是整型,也有可能是字符串。

A.整型参数的判断

当输入的参数 YY 为整型时,通常 abc.asp 中 SQL 语句大致如下:

select * from 表名 where 字段=YY

所以可以用以下步骤测试 SQL 注入是否存在。

(1)在 URL 链接中附加一个单引号,即 http://xxx.xxx.xxx/abc.asp?p=YY’,此时 abc.ASP 中的 SQL 语句变成了

select * from 表名 where 字段=YY’。

测试结果为 abc.asp 运行异常;

(2)在 URL 链接中附加字符串“and 1=1”即 http://xxx.xxx.xxx/abc.asp?p=YY and 1=1。

测试结果为 abc.asp 运行正常,而且与 http://xxx.xxx.xxx/abc.asp?p=YY 运行结果相同;

(3)在 URL 链接中附加字符串“and 1=2”即 http://xxx.xxx.xxx/abc.asp?p=YY and 1=2。

测试结果为 abc.asp 运行异常。

如果以上三种情况全部满足,abc.asp 中一定存在 SQL 注入漏洞。

B.字符串型参数的判断

当输入的参数 YY 为字符串时,通常 abc.asp 中 SQL 语句大致如下: select * from 表名 where 字段=‘YY’,所以可以用以下步骤测试 SQL 注入是否存在。

(1)在 URL 链接中附加一个单引号,即 http://xxx.xxx.xxx/abc.asp?p=YY’, 此时 abc.ASP 中的 SQL 语句变成了 select * from 表名 where 字段=YY’。

测试结果为 abc.asp 运行异常;

(2)在 URL 链接中附加字符串“’and ‘1’=‘1”即

http://xxx.xxx.xxx/abc.asp?p=YY ’and ‘1’=‘1。

测试结果为 abc.asp 运行正常,而且与 http://xxx.xxx.xxx/abc.asp?p=YY 运行结果相同;

(3)在 URL 链接中附加字符串“’and ‘1’=‘2”即

http://xxx.xxx.xxx/abc.asp?p=YY ’ and ‘1’=‘2。

测试结果为 abc.asp 运行异常。

如果以上三种情况全部满足,abc.asp 中一定存在 SQL 注入漏洞。

Union 注入攻击及代码分析

1.Union 联合查询

Union 联合、合并:将多条查询语句的结果合并成一个结果,union 注入攻击为一种手工测试。

2.Union 联合注入思路

A:判断是否存在注入点

http://127.0.0.1/web/sql/union.php?id=1

1’ 异常

1 and 1=1 返回结果和 id=1 一样

1 and 1=2 异常

从而则一定存在 SQL 注入漏洞

B:order by 1-99 语句来查询该数据表的字段数量

Id=1 order by 1-99

来判断字段数

C:利用获得的列数使用联合查询,union select 与前面的字段数一样 找到了数据呈现的位置

http://127.0.0.1/web/sql/union.php?id=1 union select 1,2,3,4,5,6

D:根据显示内容确定查询语句的位置,利用 information_schema 依次进行查询 schemata,tables,columns

E:已知库名、表名和字段名,接下来就爆数据

下面是实战:http://127.0.0.1/grade/query.php 进行手工注入获取老师账户和密码

第一步:判断是否存在sql注入漏洞
SQL漏洞注入(附实战练习)_第3张图片
SQL漏洞注入(附实战练习)_第4张图片
SQL漏洞注入(附实战练习)_第5张图片

此处正常说明为字符型

第二步判断数据表字段数

SQL漏洞注入(附实战练习)_第6张图片
SQL漏洞注入(附实战练习)_第7张图片

字段数为1

第三步:判断查询输出的位置

SQL漏洞注入(附实战练习)_第8张图片

第四步:脱库,爆数据库表名 grade
SQL漏洞注入(附实战练习)_第9张图片

第五步:爆表名admins,classes,english,networks,students,teachers

SQL漏洞注入(附实战练习)_第10张图片
第六步:爆字段名id,name,pass

SQL漏洞注入(附实战练习)_第11张图片
第七步:爆数据值
SQL漏洞注入(附实战练习)_第12张图片

你可能感兴趣的:(Web安全)