在可以聯合查詢的主題中,數據庫查詢到的數據壹般會回顯到首頁,這是聯合註入的前提。
它適用於帶有echo的MYSQL數據庫和5.0以上的數據庫軟件版本,因為MYSQL會有壹個系統數據庫information_schema,用於存儲數據庫元數據(關於數據的數據),如數據庫名稱、表名、列數據類型、訪問權限等。
聯合註射的過程:
為了判斷註入點,and 1 = 1/and 1 = 2可以用來判斷註入點。
當註入類型為數字時,返回的頁面會有所不同,但都可以正常執行。
Sql註入通常是數字註入和字符註入:
1,數字註入
數字語句:
在這種情況下,直接使用AND 1 = 1/和1 = 2可以正常執行,但返回的接口不同。
2.字符註入
字符聲明:
字符語句輸入我們的輸入將由壹對單引號或這些雙引號結束。
因此,如果我們也輸入and 1 = 1/and 1 = 2,我們會發現回波圖像並無不同。
當我們傳入and 1 = 1/and 1 = 2時,語句變成
傳入的內容變成了字符串,而不是命令。
因此,最簡單的字符類型測試方法是添加單引號‘,這會導致錯誤。
添加註釋-正常回顯界面後。
這裏的另壹點是sql語句的閉包有時是不同的。以下是壹些常見的。
在這壹步中,您可以使用order by函數,該函數根據指定的字段名對MySQL中的查詢結果進行排序。除了指定的字段名稱之外,您還可以指定要排序的字段的字段。第壹個查詢字段是1,第二個是2,依此類推,因此可以使用order by判斷列數。
以字符註入為例:
當列數存在時,它將正常回顯。
但是當列數不存在時,將會報告錯誤。
這壹步解釋了為什麽它是聯合註射,並使用聯合。UNION的作用是合並兩個select查詢的結果。
但是,在顯示數據時,程序通常只獲取結果集中的第壹行數據,這使得聯合註入非常有用。
當我們查詢的第壹行不存在時,第二行將回顯給我們。
當查詢數據設置為-1時,第壹行的數據為空,第二行自然成為第壹行。
在此基礎上進行註射。
可以發現2和3都是可用的顯示點。
像以前壹樣使用union select,並壹次性顯示group_concat()。
目前很多Web程序都沒有正常的錯誤回顯,所以我們需要使用錯誤註入來註入SQL。
錯誤註入的利用步驟與聯合註入相同,但利用函數不同。
以updatexml為例。
update XML(XML _ target,xpath_expr,new_xml)
Xml_target:需要操作的Xml片段。
Xpath_expr:需要更新的xml路徑(Xpath格式)
New_xml:更新的內容
該函數用於更新所選xml片段的內容,用xml_target替換XML標記的給定片段的單個部分,然後返回更改後的XML。xml_target替換的部分匹配xpath_expr用戶提供的XPath表達式。
當xpath路徑錯誤時,該函數將報告錯誤,並將返回路徑內容,以便我們可以在錯誤內容中看到我們想要的內容。
而以~開頭的內容不是xml格式中的語法,那麽可以使用concat函數拼接~使其報錯,當然只要不符合格式就可以報錯。
【極客挑戰賽2019】hard SQL
登錄界面嘗試註入,測試後發現是單引號字符註入,union和空格被過濾,無法使用聯合註入,但回顯錯誤消息,表示可以使用錯誤註入。
通過使用updatexml函數的錯誤報告原則進行註入,並通過在路徑處使用concat函數將~與我們的註入語句進行拼接。
查找xpath錯誤並執行sql語句返回錯誤。
在off the charts的步驟中,發現等號也被過濾了,但可以使用like代替等號。
爆炸場
爆炸性數據
這裏有壹個問題是標誌不完整,因為updatexml可以查詢的字符串的最大長度是32,所以這裏使用了left函數和right函數來讀取它。
有許多函數可用於錯誤註入,以下三個函數也是常用的:
棧註入是多個語句壹起執行。
原理是mysql_multi_query()支持多條sql語句同時執行。成堆地分離和執行sql語句。
例如
如果妳有足夠的權限,妳甚至可以添加、刪除和檢查數據庫。但是疊加註入的局限性很大。但與union聯合執行不同的是,它可以同時執行無數條語句和任何sql語句。union執行的語句是有限的。
【強力網杯2019】便簽
判斷註入類型後,我們嘗試了聯合註入,發現select被過濾,不區分大小寫的過濾是常規的。
然後使用堆棧註入,並使用show來避免select。
接下來,獲取表信息和字段信息。
那串數字非常可疑。flag很有可能在其中。看看這個。
這裏的表名應該加上反單引號,這是數據庫的引用字符。
找到了標誌,但沒有辦法直接讀取它。再次閱讀單詞時,我發現其中有壹個id字段,我猜數據庫語句是
結合1‘或1=1#,可以讀取所有數據。通過重命名,可以將1919810931114更改為單詞。
最終有效載荷:
盲註應掌握的幾個功能?
當網頁屏蔽錯誤信息時,只能通過網頁返回真假判斷,本質上是壹種暴力破解,這是布爾盲註的利用點。
首先,判斷註射點和註射類型相同。
但是盲註沒有判斷列數的步驟和判斷顯示位的步驟,這與回聲註入不同。
判斷完註入類型後,需要判斷數據庫的長度,這裏使用了length函數。
以【WUSTCTF2020】顏值評分查詢為例。
輸入參數後,我發現get在url處傳入了壹個stunum。
然後使用長度函數測試是否有註入點。
發現頁面有明顯變化。
把進來的變成
該頁面顯示該學生不存在。
那麽可以得出結論,數據庫名稱的長度為3。
測試發現空格被過濾。
然後有必要檢查數據庫名稱。有兩種方法。
壹,只有substr函數,直接比較
在編寫腳本時,該方法可用於直接遍歷。
第二,添加ascii函數
在編寫腳本時,也可以直接遍歷這個有效負載,還可以用於二分搜索法,這樣速度更快。
下壹步與聯合註入相同,只是使用substr函數逐個截取字符並逐個進行判斷。但是,這種壹個壹個的盲註手工筆記非常麻煩,所以需要腳本。
直接遍歷腳本
二分法腳本
當在代碼中使用時間盲時,存在sql註入漏洞,但頁面既不會回顯數據也不會回顯錯誤消息。
語句執行後,它不是真的或假的,因此我們不能通過頁面的內容來判斷它。
所以有布爾盲就壹定有時間盲,但時間盲不壹定有布爾盲。
時間盲註主要利用sleep功能使網頁的響應時間不同從而實現註入。
無sql實驗室8:
無論妳進入什麽,只有壹個妳在...會被回響,這是時間盲註的特點。
正常輸入時。當id=1時,時間為11毫秒。
判斷是單引號字符註入後,插入sleep語句。
顯而易見,響應時間為3053毫秒。
使用不同的時間,您可以使用腳本來運行數據庫,並且後續步驟與布爾盲註相同。
爆破倉庫
(指空氣質量指數)超過500微克/立方米
爆炸場
腳本
在SQL註入過程中,union、and、or都被完全過濾掉了,所以我們可以考慮使用XOR註入。
什麽是異或?
異或是壹種邏輯運算。簡單來說,算法就是:兩個條件相同(真或假),為假(0),兩個條件不同,為真(1)。null和任意條件之間的異或運算為null。如果從數學的角度來理解,空集和任意集合的交集都是null。
即1 1 = 0,0 0 = 0,1 0 = 1。
利用這壹原理,當並、與或都被過濾時,可以實現註入
【極客挑戰賽2019】final SQL
給出了五個選項,但都沒有用。點擊後它們都會出現在網址上?身份證.
And union、And、or都被過濾。
測試結果?ID = 1 1將給出壹個錯誤。
但是呢?Id = 1 0將返回?id=1的頁面,就是前面說的原理,1的時候等於1,那麽return?id=1的頁面。
根據原理寫payload,然後寫腳本。
爆破倉庫
(指空氣質量指數)超過500微克/立方米
爆炸場
基於此,我們可以編寫壹個基於XOR的布爾盲註腳本。
實驗推薦:課程:SQL註入基礎(和田網安實驗室)