SQL 注入攻击通过向应用程序提供恶意的 SQL 语句,企图操控数据库执行攻击者的命令。攻击者往往利用一些常见的 MySQL 函数来进行 SQL 注入,主要目的是绕过验证、提取敏感信息或破坏数据。以下是一些在 SQL 注入中常用的函数:

1.字符串函数

  • CONCAT(): 用于连接字符串。攻击者可以使用它来构造复杂的查询,拼接多条信息。
1
SELECT CONCAT(username, ':', password) FROM users;
  • CONCAT_WS(): 类似于 CONCAT(),但允许用指定的分隔符连接多个字符串。
1
SELECT CONCAT_WS('-', id, username, email) FROM users;
  • CHAR(): 通过传递 ASCII 码来构造字符串,可以用来绕过过滤器。
1
2
SELECT CHAR(117, 115, 101, 114);
-- 返回 'user'
  • GROUP_CONCAT(): MySQL 中的一个聚合函数,它用于将来自同一组的多个值连接成一个字符串。
1
GROUP_CONCAT([DISTINCT] column_name [ORDER BY clause] [SEPARATOR 'separator_string']);
  • LOAD_FILE(): 用于读取服务器上的文件,可能被滥用来读取系统文件(如果 MySQL 用户有足够权限)。
1
SELECT LOAD_FILE('/etc/passwd');
  • HEX() / UNHEX(): 转换数据为十六进制或从十六进制转换回来,用于绕过简单的字符串过滤。
1
2
SELECT HEX('data');
SELECT UNHEX('64617461');

2.信息函数

  • VERSION(): 返回 MySQL 数据库的版本信息。攻击者可能会利用它了解数据库环境。
1
SELECT VERSION();
  • DATABASE(): 返回当前选中的数据库名。
1
SELECT DATABASE();
  • USER() / CURRENT_USER(): 获取当前 MySQL 用户名。
1
SELECT USER();
  • @@datadir: 用于获取数据库数据存储的目录路径。
1
SELECT @@datadir;
  • @@version_compile_os: 返回 MySQL 服务器所运行的操作系统类型。
1
SELECT @@version_compile_os;

3.条件判断函数

  • IF(): 可用于条件判断,构造不同的查询路径。
1
SELECT IF(1=1, 'True', 'False');
  • IFNULL(): 如果第一个参数为 NULL,返回第二个参数,可以在注入中使用来绕过 NULL 值过滤。
1
SELECT IFNULL(NULL, 'replacement');
  • CASE: 多条件判断语句,可以根据多个条件来控制注入结果。
1
SELECT CASE WHEN 1=1 THEN 'A' ELSE 'B' END;

4.加密和编码函数

  • MD5() / SHA1(): 返回字符串的 MD5 或 SHA1 散列值,可以用于密码猜测攻击中(例如比对已知的散列值)。
1
2
SELECT MD5('password');
SELECT SHA1('password');

5.SQL 数据处理函数

  • GROUP_CONCAT(): 将多行数据合并为一行,常用于 SQL 注入时获取大量数据。
1
SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'users';
  • UNION: 并非严格意义上的函数,但常用于 SQL 注入攻击,允许攻击者合并多个查询结果。结合其他函数可以获取任意表的数据。
1
SELECT id, username FROM users UNION SELECT 1, VERSION();

6.盲注相关函数

  • SLEEP(): 用于时间盲注,故意延迟查询响应时间,帮助攻击者判断条件是否为真。
1
SELECT IF(1=1, SLEEP(5), 'false');
  • BENCHMARK(): 通过执行重复的操作来延迟响应时间,类似于时间盲注的用途。
1
SELECT BENCHMARK(1000000, MD5('test'));

7.数据库和表信息获取函数

  • information_schema: 并非函数,但这是一个特殊的系统数据库,包含所有表、列等元数据信息。攻击者通常会利用它来枚举数据库结构。
1
2
SELECT table_name FROM information_schema.tables WHERE table_schema = 'your_database';
SELECT column_name FROM information_schema.columns WHERE table_name = 'users';

8.其他函数

  • RAND(): 生成随机数,攻击者有时会利用随机函数制造不易检测的注入模式。
1
SELECT RAND();
  • FLOOR(): 用于生成随机整数,通过与 RAND() 一起使用,可能用于盲注攻击。
1
SELECT FLOOR(RAND()*100);
  • DISTINCT: 去重。
1
SELECT DISTINCT table_schema FROM information_schema.tables;