簡學-SQL注入(報錯注入)
阿新 • • 發佈:2021-02-11
簡學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)報錯原理探究.
- 由 floor() + rand() + group by 導致的主鍵衝突報錯:
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 無法處理的字元,從而使我們獲取到的資訊完整。
- extractvalue(xml_flag,xpath_expr) 函式會接受兩個引數,X_flag 表示在 xml 中的節點片段,xpath_expr 表示 Xpath 格式的查詢路徑。如果第二個引數不符合 Xpath 的語法規則,會引起資料庫報錯。這也是我們在注入是利用的點。
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));
- exp函式報錯注入,是利用其會產生 DOUBLE型數值溢位報錯,返回報錯資訊,從而進行注入攻擊。(這個漏洞貌似存在版本限制 < 5.6,下面只給出利用方法)產生報錯是因為通過