mysql中文注入_SQL注入之Mysql报错注入
——志向和熱愛是偉大行為的雙翼。
昨天偷懶了沒學什么東西,先自我反省一下 - -。
今天認真的學習了一下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(基于時間延遲注入)
今天我們說的就是Mysql的報錯注入(想了解其他的請移步這里),共有11中方法(最后一種不適用于老版本)。
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注入之Mysql报错注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装百分之80卡住_关注丨男子翻越高铁站
- 下一篇: linux 访问共享内存,Linux下的