SQL注入 (一) 原理及介绍


摘要由 AI 智能生成

前言

刚开始接触SQL注入的时候,确实有点难。特别是看见CTF题目的时候,总是有点不敢下手。不过,SQL注入作为比较经典的漏洞类型,只要理解它的原理和基础操作,其实没那么复杂。

SQL注入原理

简单来说,SQL注入就是攻击者通过不当的用户输入,构造特定的SQL语句,直接让数据库执行恶意操作。也就是说,SQL注入的本质是把用户输入当作代码来执行

SQL注入的两个必要条件:

  1. 用户能够控制输入内容
  2. Web应用会把这些输入的内容带进数据库执行

举个例子:如果网站有个登录表单,系统直接把你输入的用户名和密码拼接到SQL语句里执行,而没有进行过滤,那你就可以通过构造特殊的输入,绕过登录验证,甚至获取其他用户的数据。

SQL注入基础

常用函数

在SQL注入中,我们常常需要利用一些数据库自带的函数,来探测系统信息或提取数据。以下是一些常用的MySQL函数,掌握这些对于初学者来说非常重要:

system_user():  查看当前系统用户名  
user():  查看当前数据库用户名  
current_user(): 查看当前连接数据库的用户名  
database(): 查看当前使用的数据库  
version():  查看MySQL版本  
load_file():  读取本地文件(需要特殊权限)  
@@datadir: 查看数据库路径  
@@basedir: 查看MySQL安装路径  
group_concat(): 将多个数据拼接成一个字符串  
substr(str,start,length):截取字符串

必学的“三表一库”

在MySQL里,默认有一个叫做 information_schema 的数据库,它存储了数据库的元数据,包括所有数据库、表、列的信息。你可以把它看作是数据库的“目录”。

一库:information_schema

  • 这是存放数据库结构信息的数据库。

三表:

  1. SCHEMATA 表:存储了所有数据库的信息。
  2. 重点字段:schema_name(数据库名称)
  3. TABLES 表:存储了每个数据库中的所有表的信息。
  4. 重点字段:
  5. TABLE_NAME(表名)
  6. TABLE_SCHEMA(该表所属的数据库)
  7. COLUMNS 表:存储了每个表中列的信息。
  8. 重点字段:
  9. COLUMN_NAME(列名)
  10. TABLE_NAME(该列所属的表名)
  11. TABLE_SCHEMA(该列所属的数据库)

注意: 在注入时,想要访问这些表中的数据,你需要用“数据库名.表名”的格式来指定表名,例如:information_schema.tables

SQL注入入门技巧

  1. 确定注入点:首先,你得找到Web应用中可控的输入点。常见的注入点包括表单、URL参数、Cookie等。如果一个页面可以输入东西,并且这个输入影响到数据库,那它可能就是一个注入点。
  2. 简单测试:最简单的测试方法是输入一个单引号 ' 看看页面会不会报错。如果报了SQL语法错误,那就可能有SQL注入的机会。
  3. 常用注入方法:对于初学者来说,最常见的是 UNION 联合查询注入。你可以通过联合查询,把你想要的数据和页面正常显示的数据一起展示出来。比如,你可以通过注入查询数据库里的用户名和密码。
  4. 防护措施:除了学习如何进行SQL注入,你还得知道如何防御。常见的防御措施包括使用预编译SQL语句、对用户输入进行严格过滤和验证,以及控制数据库用户的权限,避免暴露敏感数据。

结语

SQL注入是Web安全领域的经典漏洞之一。理解它的原理并掌握基础的注入技巧后,会发现其实并不难。不仅要学会如何攻击,还要知道如何防守,确保自己开发的应用不受威胁。

评论区
头像