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 );
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 数据库的版本信息。攻击者可能会利用它了解数据库环境。
USER() / CURRENT_USER(): 获取当前 MySQL 用户名。
@@datadir: 用于获取数据库数据存储的目录路径。
@@version_compile_os: 返回 MySQL 服务器所运行的操作系统类型。
1 SELECT @@version_compile_os ;
3.条件判断函数
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(): 生成随机数,攻击者有时会利用随机函数制造不易检测的注入模式。
FLOOR(): 用于生成随机整数,通过与 RAND() 一起使用,可能用于盲注攻击。
1 SELECT FLOOR (RAND()* 100 );
1 SELECT DISTINCT table_schema FROM information_schema.tables;