渗透测试SQL注入漏洞原理与验证(1)——数据库基础

2024-09-27 19:21:56 浏览数 (2)

数据库概述

数据库 ( DataBase,DB ):存储在磁带、磁盘、光盘或其他外存介质上、按一定结构组织在一起的相关数据的集合。

数据库管理系统 (DataBase ManagementSystem,DBMS): 一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。

数据库系统 (DataBase System,DBS) : 通常由软件、数据库 (DB) 和数据库管理员 (DBS) 组成。软件主要包括操作系统、各种宿主语言、实用程序以及数据库管理系统(DBMS)。

数据库(DB) 由 数据库管理系统 (DBMS) 统一管理,数据的插入、修改和检索均要通过数据库管理系统 (DBMS) 进行。数据库管理员负责创建、监控和维护整个数据库使数据能被任何有权使用的人有效使用。

数据库分类

关系型数据库

  • 关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。通过SQL结构化查询语句存储数据,保持数据一致性,遵循ACID理论。
  • 关系型数据库的典型产品:MySQL、Microsoft SQL Server、Oracle、PostgreSQL、IBM DB2、Access等。

非关系型数据库

  • 非关系型数据库也被称为NOSQL数据库,NOSQL的本意是“NotOnly SQL”指的是非关系型数据库,而不是“No SQL”的意思。因此,NOSQL的产生并不是要彻底地否定关系型数据库,而是作为传统关系型数据库的一个有效补充。NOSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。
  • 非关系型数据库的典型产品:Memcached、Redis、mongoDB等。

ACID理论

识别数据库

盲跟踪

  • Web应用技术
  • 不同数据库SQL语句差异

非盲跟踪

  • 报错、直接查询

默认端口号

  • Oracle:1521
  • MySQL:3306
  • SQL Server:1433
  • PostgreSQL:5432
  • mongoDB:27017
  • Redis:6379
  • MemcacheDB:11211

报错信息

MySQL报错:

代码语言:shell复制
ERROR 1064 (42000):You have an error in your  SOL syntax; check the manual corresponds to your MySOl server version for the right syntax to use near
at line 1

MSSQL(Microsoft SQL Server)报错信息:

Oracle报错信息:

各数据库的版本查询方法区别

代码语言:txt复制
MSSQL              select @@version

MySQL              select version()  /  select @@version

Oracle             select banner from v$version

PostgreSQL         select version()

各数据库在字符串处理时的区别

各数据库与网页编程语言的搭配

  • ASP和.NET : Microsoft SQL Server
  • PHP : MySQL、PostgreSQL
  • Java : Oracle、MySQL

SQL语法基础

order by

order by : 当后面跟着的数字超出了字段数时,就会报错 ! 通过这个可以确定字段数

联合查询union

因为查询语句构造问题,可直接否认掉之前的查询,构造一个全新的语句来执行,需要注意的是查询的列应当和之前对应。

所以用 and.. union select 1,2,3,4,5,6. 来猜解列数(字段数)只有列数相等了,才能返回True。

知道列名后,把列名置于其中任意位置,就能在那个位置暴出列的内容来。

结合其他函数

结合 exists() 函数猜解表名 and exists(select ...)

exists() 函数用于检査子查询是否至少会返回一行数据。实际上不返回任何数据,而是返回True或者

False。

union select 结合系统函数暴数据库信息

MySQL 5.5以上版本自带 information schema数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息,如数据库名、数据库的表、表栏的数据类型与访问权限等。

union 结合系统函数暴数据库信息

information_schema.SCHEMATA表中的SCHEMA_NAME 查看所有的数据库名:

代码语言:txt复制
select  * from hehe where id=3 and 1=2 union select 0,0,SCHEMA_NAME from information_schema.SCHEMATA ;

information_schema.TABLES 表中的TABLE_NAME和TABLE_SCHEMA查看所有的表名和所在的数据库:

代码语言:txt复制
select TABLE_NAME,TABLE_SCHEMA from information_schema.TABLES whereTABLE_SCHEMA = "haha"

结合load file() 读取服务器文件内容

函数 LOAD FILE(file name):读取文件并将文件内容按照字符串的格式返回。

前提条件:

  • 文件的位置必须在服务器上,必须为文件制定路径全名,而且必须拥有FILE特许权(MySQL配置文件中,secure_file_priv不能为NULL)
  • 文件必须可读取,文件容量必须小于 max_alowed_packet 字节
  • 若文件不存在,或因不满足上述条件而不能被读取,则函数返回值为 NULL

load_file()用在MySQL中可以在UNOIN中充当一个字段,读取Web服务器的文件。


本文部分图片摘自深信服安全服务认证工程师课程课件中,为方便个人学习使用,勿作商用!!!!文字内容为自己手打,并非直接搬运!如有侵权,请联系删除!!!

本文档所提供的信息仅用于教育目的及在获得明确授权的情况下进行渗透测试。任何未经授权使用本文档中技术信息的行为都是严格禁止的,并可能违反《中华人民共和国网络安全法》及相关法律法规。使用者应当合法合规地运用所学知识,不得用于非法入侵、破坏信息系统等恶意活动。我们强烈建议所有读者遵守当地法律与道德规范,在合法范围内探索信息技术。

我正在参与2024腾讯21天技术创作挑战赛|年中回顾特别季,年中技术沉淀,拯救你的flag,快来和我瓜分大奖!

0 人点赞