1. 程式人生 > >sql注入篇2

sql注入篇2

一、前言

  上一篇:sql注入篇1

二、基於回顯的注入型別判斷

  1、有結果的注入

    例如下圖:

(sqlllab less-1)可以看到有正常結果返回,對於的利用方式就是老套路了,先order by查詢出當前語句查詢的列數,在使用union查詢一一爆資料,當然,也可以使用指令碼直接脫庫。

  2、基於布林值的注入

    通俗來說,就是盲注,回顯的頁面不會出現任何有關資料的結果,但會顯示一些特殊的顯示,可以判斷我們猜測正確與否。例如下圖(sqllab less-5):

上面兩張截圖中,第一張id=1,第二張id=-1,但在資料庫中id這個引數是沒有-1這個值的,所以第二張截圖中,頁面返回空(之所以出現sql語句,是我更改了原始碼顯示在頁面,方便研究學習用的),而在第一張截圖中id=1,結果為真,頁面返回來you are in....這個特殊的標誌,我們可以理解為出現you are in...為真,反之,頁面不返回任何東西為假。基於此,我們可以猜測出整個資料庫中的資料(一般直接跑sqlmap 或者寫指令碼跑,下圖是sqlmap結果)

當然,我們也可以手動注入,在手動注入之前,先介紹一下一些用於注入的相關函式,常用於基於布林注入的函式有mid,substr,length等等,更多的就不在這裡說了,想要了解更多的或者想要了解其用法的可以百度或者谷歌,個人覺得這篇文章寫得挺好的,感興趣可以去看一下或者百度。

    介紹完相關函式後,針對sqllab less-5這一關,我們可以實際動手來嘗試一下手動注入:

利用http://127.0.0.1:9001/sqllab/Less-5/?id=1%27%20and%20mid(database(),1,1)=%27s%27%23猜測出當前正在使用的資料庫名字第一個字母為s(當然,這裡只是演示,一般常規注入步驟是先猜解出資料庫名字長度,在一一猜解出來),剩下的常規的漫長道路了,當然,這種需要大量手動資料猜測的,建議使用自動化的工具,如sqlmap或者動手能力強的直接寫指令碼爆破(筆者的指令碼不知道丟到哪裡去了,所以以後找到了或者重新寫一次之後再放出來吧)。

  3、基於報錯的注入

   通俗來說,就是頁面不回顯任何有關資料的結果,包括真假值,但是通過使用一些函式會顯示報錯資訊,從而暴露了資料庫的相關資訊。

   a、floor注入

    (1)、原理

      原理講解語文水平能力不行(逃。。。),這裡附上一遍文章連結,對floor報錯注入原理講得非常清楚。

    (2)、利用

     poc: select * from users where id=1 and(select 1 from (select count(*) ,concat(database(),floor(rand(0)*2))x from users group by x)a)

    b、extractvalue()報錯注入

    (1)、原理

      EXTRACTVALUE (XML_document, XPath_string);
      第一個引數:XML_document是String格式,為XML文件物件的名稱,文中為Doc
      第二個引數:XPath_string (Xpath格式的字串) ,如果不瞭解Xpath語法,可以在網上查詢教程。
      作用:從目標XML中返回包含所查詢值的字串
      函式的XPath_string必須滿足Xpath語法,否則就會報錯,這樣我們就可以利用此報錯來爆出我們想要的資訊。

    (2)、利用

      以wuzhicms為例,poc: http://192.168.116.129/index.php?m=promote&f=index&v=search&_su=wuzhicms&fieldtype=place&keywords=%27%20and+extractvalue(1,concat(0x7e,(select database())))%23(192.168.116.129是筆者自己搭建用作搭載wuzhicms的虛擬機器伺服器),如圖所示:

成功爆出當前資料庫wuzhicms。(更多有關wuzhicms(cve-2018-14515)參見筆者的這篇文章)更多有關extractvalue()報錯注入可以參見這篇文章,這篇部落格寫得挺詳細的。

    c、UpdateXml報錯注入

    (1)、原理

      UPDATEXML (XML_document, XPath_string, new_value);
      第一個引數:XML_document是String格式,為XML文件物件的名稱,文中為Doc
      第二個引數:XPath_string (Xpath格式的字串) ,如果不瞭解Xpath語法,可以在網上查詢教程。
      第三個引數:new_value,String格式,替換查詢到的符合條件的資料
      作用:改變文件中符合條件的節點的值
      引數Xpath_string的要求與EXTRACTVALUE函式相同。

    (2)、利用

      updatexml函式使用語法和extractvalue()差不多,這裡就不在講了。

    d、關於爆錯注入其實遠不止這上面所說的三種,還有很多,這裡只寫了常見的三種,對其餘報錯注入有興趣的可以自己去百度。

  4、基於時間的注入

    基於時間注入通過判讀頁面返回時間長短來得到資料。常用的函式有sleep()、benchmark().

    (1)、sleep()

    以sqllab less-9為例,poc如下:http://127.0.0.1:9001/sqllab/Less-9/?id=1%27%20and%20if((mid(database(),1,1)=%27s%27),sleep(5),1)%23(poc解釋:如果當前資料庫名字第一個字母為s,執行sleep(5),否則執行1)。

從截圖返回的結果中,我們可以看到返回時間為6.03秒,說明當前資料庫名字第一個字母為s,其餘資料查詢也一樣,這裡不再做過多說明。

    (2)、benchamark()

    benchmark()有兩個引數,第一個是執行次數,第二個是要執行的表示式,這裡還是以sqllab less-9為例,poc如下:http://127.0.0.1:9001/sqllab/Less-9/?id=1%27%20and%20if((mid(database(),1,1)=%27s%27),benchmark(10000000,md5(123)),1)%23(poc解釋:如果當前資料庫名字第一個字母為s,執行benchamark函式,執行1000000次md5(123),否則執行1),截圖如下:

 

可以看見頁面返回時間為3.31秒,說明當前資料庫名字第一個字母為s(如果返回時間不明顯,可以增加benchmark函式中執行次數的量級),其餘資料的猜測就是常規操作了,這裡不再講解。

三、結束語

  對sql注入的講解就到這裡,sql注入的知識其實遠不止這些,感興趣的可以百度或者谷歌,如果上述有不對的地方,還請諒解,畢竟作者還是一菜鳥,完結,撒花。