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注入的知識其實遠不止這些,感興趣的可以百度或者谷歌,如果上述有不對的地方,還請諒解,畢竟作者還是一菜鳥,完結,撒花。