interface

SQL injection,SQL注入,指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的,SQL注入的漏洞危害巨大,会导致数据库被脱库。是现在最常见的Web漏洞。
主要形式包括直接将带啊嘛插入到与SQL命令串联在一起并使其执行的用户输入变量。

示例

用户通过浏览器发送类似http://www.test.com/produck.aspx?id=1连接请求,位于逻辑层的WEB服务器从文件系统加载脚本传递给脚本解析引擎。逻辑层执行相关业务逻辑规则或直接将web页面返回给表示层web浏览器。
一个未经过滤的SQK查询程序段示例:

string query = "SELECT * FROM Products WHERE id = 'num'";
//创建数据库连接
Database database = DatabaseFactory.CreateDatabase();
//创建查询语句
DbCommand sqlStringCommand = database.GetSqlStringCommand(query);
//执行查询
Result = database.ExecuteQuery(sqlStringCommand);
(这个过程中国query的值没有进行判断,直接被带入执行,导致漏洞产生)
//返回查询结果
return Result

注入过程示例

恶意构造的HTTP请求
http://www.test.com.product.aspx?id=1 and 1=2
没有对字段id值判断,这个值可以操作随意执行了下列查询
SELECT * FROM Products WHERE id=1 and 1=2;
这个语句不会执行id=1的商品信息,因为在查询and操作数中1=2不成立。

盲注

盲注意味着页面不会显示SQL语句错误,要通过一定手段来判断构造的注入语句是否正确执行:布尔型和时间型,布尔型是根据页面是否正确显示来判断是否执行,时间型是根据页面加载时间是否变化来判断。
这里需要掌握一些MySQL相关函数:
length(str):返回str字符串的长度,如执行select
length(databases()):返回当前数据库名称的长度,而单独select
database():返回当前数据库名称
substr(str,pos,len):从pos位置取出str字符串的len个字符
select substring('abcde',4,2)则返回de,pos为负则倒数第pos个位置
ASCII(str):返回字符串str最左边字符ASCII代码,如果str是空字符串,返回0,如果str是NULL,返回NULL,select ASCII('a')返回97
将上面几个函数组合就有布尔志出现
如Select ascii(database(),2,1) = 101;当database(),即当前数据库名称正数第二个字符为e,则返回1

攻击

可以手工,也可以用攻击辅助软件:sqlmap、NBSI

  1. 寻找SQL注入点
  2. 获取和验证SQL注入点
  3. 获取信息
  4. 实施直接控制
  5. 间接进行控制

攻击载体

  1. GET请求 2. POST请求 3. HTTP头 4. COOKIE

注入类型

  1. Time-based blind SQL injection(基于时间延迟注入)
  2. UNION query SQL injection(可联合查询注入)
  3. Error-based blind SQL injection(报错型注入)
  4. Boolean-based blind SQL injection(布尔型注入)
  5. Stacked queries SQL injection(可多语句查询注入)
  1. 数字型注入
  2. 字符型注入
  3. 搜索型注入

实践 - 通过information_schema爆破表名、字段名

原理

MySQL,MySQL默认在数据库中存放一个"information_schema"数据库,这个数据库里需要记住三个表名「SCHEMATA」、「TABLES」和「COLUMNS」

SCHEMATA

这个表中存储用户创建所有数据库的库名,需要记住这个表中数据库库名的字段为「SCHEMA_NAME」

TABLES

这个表存储用户创建所有数据库库名和表名,需要记住数据库库名和表名的字段分别为:「TABLE_SCHEMA」「TABLE_NAME」
在获取数据库、表名,注入语句中information_schema这个数据库出现的很频繁,所以这篇文章注重了解这个数据库。

COLUMNS

COLUMNS表存储用户创建数据库库名、表名和字段名,我们需要记住表中记录数据库名、表名和字段名,「SCHEMA」、「TABLE_NAME」和「COLUMN_NAME」

information_schema是MYSQL自带的,提供访问数据库元数据的方式,元数据是关于数据的数据,如数据库名或者表名, 列的数据类型,或者访问权限。

> use information_schema; # 进入数据库
> show databases; #查看所有数据库
> select schema_name from information_schema.schemata limit 0,1 #原理通过查询schemata中schema_name的结果,其中limit 0,1用来获取提一条记录
> desc tables; #查看表结构
> select count(*) from tables;# 查看有多少条记录
> select * from tables limit 141,1\G # \G让一条记录显示一行,以至于看起来不乱

https://wenku.baidu.com/view/092bf799db38376baf1ffc4ffe4733687e21fcf1.html

最后修改:2022 年 04 月 27 日
如果觉得我的文章对你有用,请随意赞赏