1. 程式人生 > 其它 >簡學-SQL注入(報錯注入)

簡學-SQL注入(報錯注入)

技術標籤:網路安全網路安全mysql

簡學SQL注入


0x09 SQL注入之報錯注入

  • 一種 SQL 注入的型別,用於 SQL 語句報錯的語法,用於注入無回顯,但會提示報錯資訊的情況。返回的錯誤資訊,即攻擊者需要的資訊。

0x09.1 報錯注入的原理

  • MySQL 報錯注入主要利用了 MySQL 的一些邏輯漏洞,如 BigInt 大整型數溢位、不同函式呼叫漏洞等,因此根據邏輯特點,可以將報錯注入分為以下幾點:
    • BigInt 等資料型別溢位
    • Xpath語法錯誤
    • count() + rand()*2 + group_by() 重複計數,導致臨時表插入主鍵重複造成報錯
    • 空間資料型別函式錯誤

0x09.2 報錯注入常見的函式

  • 會導致 MySQL 報錯並顯示出資料函式:
    • rand() 函式:rand(N) 返回隨機浮點數 a,範圍是 0 <= a < 1.0;
    • count() 函式:count(x) 返回 x 資料集的數量;
    • floor() 函式:floor(x) 會返回一個不大於 x 的整數;
      • 由 floor() + rand() + group by 導致的主鍵衝突報錯:
        	select count(*),concat((select user()),floor(rand(0)*2)) x from users group by x
        
      • 這個注入主要是利用 concat() 函式將 注入語句與 floor(rand(0)*2)
        拼接起來,將想要查詢的結果與報錯內容一併你回顯給攻擊者,從而達到報錯注入的目的。
        在這裡插入圖片描述
      • 如果想要深入理解為什麼 floor(rand(0)*2) 與 group by 結合會產生主鍵衝突報錯,這裡我引用之前看到的一篇文章很詳細的解釋了原因:Mysql報錯注入之floor(rand(0)*2)報錯原理探究.
    • extractvalue() 函式:使用 XPath 表示發從 xml 文件中獲取指定元素。(最多32個字元);
      • extractvalue(xml_flag,xpath_expr) 函式會接受兩個引數,X_flag 表示在 xml 中的節點片段,xpath_expr 表示 Xpath 格式的查詢路徑。如果第二個引數不符合 Xpath 的語法規則,會引起資料庫報錯。這也是我們在注入是利用的點。
      • payload
        	=id?' and extractvalue(1,concat(0x7e,(select @@version))) -- '
        
      • 這條命令,通過在 id 後面新增單引號(') 閉合引數,然後拼接 extractvalue 函式執行 注入語句。在函式中使用 concat() 是因為我們查詢的結果會被 extractvalue 截斷一部分字元,如下:
        在這裡插入圖片描述
      • 因此我們需要利用 concat 函式去拼接一個 extractvalue 無法處理的字元,從而使我們獲取到的資訊完整。
        在這裡插入圖片描述
    • updatexml() 函式:更新選定 xml 片段的內容;
      • updatexml 函式的利用方式同extractvalue 函式差不多,都是利用引數的語法規則不正確從而觸發報錯。
      • payload
        	=id?' and updatexml(1,concat(0x7e,(select @@version)),1) -- '
        
      • 通過兩個 1 觸發函式報錯,利用 concat 函式將資訊完整的拼接出來。
        在這裡插入圖片描述
    • exp() 函式:返回e的X次方的值;
      • exp函式報錯注入,是利用其會產生 DOUBLE型數值溢位報錯,返回報錯資訊,從而進行注入攻擊。(這個漏洞貌似存在版本限制 < 5.6,下面只給出利用方法)產生報錯是因為通過 ~ 對成功執行的函式取反就會得到最大的無符號BIGINT值,超出 exp() 可接受的範圍,造成數值溢位報錯。
      • payload
      	=id?' and exp(~(select * from (select @@version)x) -- '
      
      • 你可以通過以下程式碼在本地 Mysql 中進行測試:
      	select exp(~(select * from ("獲取資訊的查詢語句")x));