什么是sql注入漏洞 概念:客戶端在接受用戶輸入的參數(shù)并拼接到sql語(yǔ)句中提交給服務(wù)端 去數(shù)據(jù)庫(kù)中檢索相應(yīng)的結(jié)果,,但是由于用戶輸入的參數(shù)是惡意查詢的參數(shù),,所以導(dǎo)致sql語(yǔ)句有惡意查詢導(dǎo)致sql注入漏洞。 sql注入型 1,、數(shù)字型(無(wú)符號(hào)干擾) select * from news where id=$id; 2,、字符型(有符號(hào)干擾) select * from news where id='$id'; 3、搜索型(有多符號(hào)干擾) select * from news where id like '%$id%' 4,、框架型(有各種符號(hào)干擾) select * from news where id=('$id'); select * from news where (id='$id'); 判斷有沒(méi)有注入點(diǎn) 1.注入點(diǎn)判斷方法: 1.1.單引號(hào)判斷法---經(jīng)典方法 如果頁(yè)面返回錯(cuò)誤,,則存在,字符型、整型都可判斷,,具體操作在參數(shù)的后面加上'就可,。 1.2.構(gòu)造造and 1=1以及and 1=2,,用于數(shù)字型注入點(diǎn)。 1.3.構(gòu)造and '1' ='1'以及and '1' ='2',,用于字符型注入點(diǎn),。 2.判斷注入點(diǎn)是字符型還是數(shù)字:構(gòu)造payload為:id=1 order by 9999 --+ 如果正確返回頁(yè)面,則為字符型,,否則,,為數(shù)字型。 要掌握的sql基礎(chǔ) 1.MYSQL5.0以上版本:自帶的數(shù)據(jù)庫(kù)名information_schema,,遇見的數(shù)據(jù)庫(kù)基本都是5.0以上,。 2.各對(duì)應(yīng)名: information_schema:存儲(chǔ)數(shù)據(jù)庫(kù)下的數(shù)據(jù)庫(kù)名及表名,列名信息的數(shù)據(jù)庫(kù) information_schema.schemata:記錄數(shù)據(jù)庫(kù)名信息的表 information_schema.tables:記錄表名信息的表 information_schema.columns:記錄列名信息表 schema_name:information_schema.schemata記錄數(shù)據(jù)庫(kù)名信息的列名值 table_schema:information_schema.tables記錄數(shù)據(jù)庫(kù)名的列名值 table_name:information_schema.tables記錄表名的列名值 column_name:information_schema.columns記錄列名的列名值 3.獲取相關(guān)數(shù)據(jù): 3.1,、數(shù)據(jù)庫(kù)版本-看是否符合information_schema查詢-version() 3.2,、數(shù)據(jù)庫(kù)用戶-看是否符合ROOT型注入攻擊-user() 3.3、當(dāng)前操作系統(tǒng)-看是否支持大小寫或文件路徑選擇-@@version_compile_os 3.4,、數(shù)據(jù)庫(kù)名字-為后期猜解指定數(shù)據(jù)庫(kù)下的表,,列做準(zhǔn)備-database() 4.小細(xì)節(jié):查詢的結(jié)果很多,需要全部顯示加上group_concat(),在末尾加上limit 0,1顯示第一條數(shù)據(jù),,limit 0,2 顯示第二條數(shù)據(jù),。后面的數(shù)據(jù)代表顯示多少行從第一個(gè)數(shù)字后面開始不包括第一個(gè)數(shù)字的范圍。 sql注入點(diǎn)會(huì)發(fā)在那些參數(shù)里面 1.sql注入漏洞要發(fā)生的前提是要有數(shù)據(jù)與數(shù)據(jù)庫(kù)進(jìn)行查詢,,所以在對(duì)網(wǎng)站測(cè)試的不僅僅在id參數(shù)等進(jìn)行測(cè)試,,比如User-Agent字段,如果每一個(gè)客戶端在請(qǐng)求網(wǎng)站時(shí)服務(wù)器都記錄了此字段并保存到數(shù)據(jù)庫(kù)中,,這個(gè)過(guò)程與數(shù)據(jù)庫(kù)有著交互,,那么也有可能存在sql注入,數(shù)據(jù)包請(qǐng)求頭任何參數(shù)都有可能成為sql注入的點(diǎn),,列舉幾個(gè)參數(shù),。 User-Agent: 使得服務(wù)器能夠識(shí)別客戶使用的操作系統(tǒng),游覽器版本等.(很多數(shù)據(jù)量大的網(wǎng)站中會(huì)記錄客戶使用的操作系統(tǒng)或+ 瀏覽器版本等存入數(shù)據(jù)庫(kù)中) Cookie: 網(wǎng)站為了辨別用戶身份,、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù) X-Forwarded-For:簡(jiǎn)稱XFF頭,,它代表客戶端,也就是HTTP的請(qǐng)求端真實(shí)的IP,(通常一些網(wǎng)站的防注入功能會(huì)記錄請(qǐng)求端真實(shí)IP地址并寫入數(shù)據(jù)庫(kù)or某文件[通過(guò)修改XXF頭可以實(shí)現(xiàn)偽造IP]). Rerferer:瀏覽器向 WEB 服務(wù)器表明自己是從哪個(gè)頁(yè)面鏈接過(guò)來(lái)的. Host:客戶端指定自己想訪問(wèn)的WEB服務(wù)器的域名/IP 地址和端口號(hào) 在拿到一個(gè)網(wǎng)站的時(shí)候判斷其功能點(diǎn),,比如一個(gè)網(wǎng)站你發(fā)現(xiàn)判定你的ip來(lái)讓你可不可以登入,,說(shuō)明在數(shù)據(jù)庫(kù)存儲(chǔ)了ip進(jìn)行比對(duì),與數(shù)據(jù)庫(kù)有著交互,,這個(gè)時(shí)候可以嘗試進(jìn)行xff注入,。其他點(diǎn)也可以像這樣去判斷。 盲注 盲注:就是在注入過(guò)程中,,獲取的數(shù)據(jù)不能回顯至前端頁(yè)面,。我們需要利用一些方法進(jìn)行判斷或者嘗試,,這個(gè)過(guò)程稱之為盲注。 1,、基于布爾的SQL盲注-邏輯判斷 regexp,like,ascii,left,ord,mid 2,、基于時(shí)間的SQL盲注-延時(shí)判斷 if,sleep 3、基于報(bào)錯(cuò)的SQL盲注-報(bào)錯(cuò)回顯 floor,,updatexml,,extractvalue 延遲: and sleep(1); and if(1>2,sleep(1),0); and if(1<2,sleep(1),0); 布爾: and length(database())=7; and left(database(),1)='p'; and left(database(),2)='pi'; and substr(database(),1,1)='p'; and substr(database(),2,1)='i'; and ord(left(database(),1))=112; 報(bào)錯(cuò): and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1) and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1))); 二次注入 二次注入:是指已存儲(chǔ)(數(shù)據(jù)庫(kù)、文件)的用戶輸入被讀取后再次進(jìn)入到 SQL 查詢語(yǔ)句中導(dǎo)致的注入,。 二次注入主要分為兩步 第一步:插入惡意數(shù)據(jù) 第一次進(jìn)行數(shù)據(jù)庫(kù)插入數(shù)據(jù)的時(shí)候,,僅僅對(duì)其中的特殊字符進(jìn)行了轉(zhuǎn)義,在寫入數(shù)據(jù)庫(kù)的時(shí)候還是保留了原來(lái)的數(shù)據(jù),,但是數(shù)據(jù)本身就包含惡意內(nèi)容 第二部:引用惡意數(shù)據(jù) 在將數(shù)據(jù)存入到了數(shù)據(jù)庫(kù)中之后,,開發(fā)者就認(rèn)為數(shù)據(jù)是可信的,在下一次需要進(jìn)行查詢的時(shí)候,,直接從數(shù)據(jù)庫(kù)中取出了惡意數(shù)據(jù),,沒(méi)有進(jìn)行進(jìn)一步的檢驗(yàn)和處理,就會(huì)造成二次注入 堆疊注入 堆疊注入:在SQL中,,分號(hào)(;)是用來(lái)表示一條sql語(yǔ)句的結(jié)束,。試想一下,我們?cè)诮Y(jié)束一個(gè)sql語(yǔ)句后繼續(xù)構(gòu)造下一條語(yǔ)句,,會(huì)不會(huì)一起執(zhí)行,? 因此這個(gè)想法也就造就了堆疊注入。 前提: 有注入點(diǎn):即存在sql注入漏洞 未過(guò)濾:即未對(duì)';'號(hào)進(jìn)行過(guò)濾 未禁用:即未禁止執(zhí)行多條sql語(yǔ)句 (基本后續(xù)都是用工具進(jìn)行掃,,此步驟就不詳細(xì)寫) 如何防護(hù)sql注入 1,、對(duì)用戶進(jìn)行分級(jí)管理,嚴(yán)格控制用戶的權(quán)限,;2,、在書寫SQL語(yǔ)言時(shí),禁止將變量直接寫入到SQL語(yǔ)句,,必須通過(guò)設(shè)置相應(yīng)的參數(shù)來(lái)傳遞相關(guān)的變量,; 3、在具體檢查輸入或提交的變量時(shí),,對(duì)于單引號(hào)、雙引號(hào),、冒號(hào)等字符進(jìn)行轉(zhuǎn)換或者過(guò)濾,; 4、使用安全參數(shù),; 5,、通過(guò)專業(yè)的掃描工具,,可以及時(shí)的掃描到系統(tǒng)存在的相應(yīng)漏洞; 6,、多層驗(yàn)證,; 7、數(shù)據(jù)庫(kù)信息加密,。 |
|
來(lái)自: zZ華 > 《滲透知識(shí)》