? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?SQL注入面試時(shí)該知道的知識(shí)點(diǎn)
總體見解:
1.只要是支持批處理SQL指令的數(shù)據(jù)庫服務(wù)器,都有可能受到此種手法的攻擊。
2.注入的本質(zhì),是把用戶輸入數(shù)據(jù)作為代碼執(zhí)行。有兩個(gè)關(guān)鍵條件:第一個(gè)是用戶能控制輸入;第二是原本程序要執(zhí)行的代碼,拼接了用戶輸入的數(shù)據(jù),把數(shù)據(jù)當(dāng)代碼執(zhí)行了。(出自吳瀚清《白帽子講WEB安全》)
3.錯(cuò)誤的回顯是敏感信息,是攻擊者了解某網(wǎng)站web服務(wù)器的重要手段。
4.最常見的盲注驗(yàn)證方法是,構(gòu)造簡單的條件語句,根據(jù)返回頁面是否發(fā)生變化,判斷SQL語句是否得到執(zhí)行。
例如http://a.b.c/item.php?id=2中,執(zhí)行的SQL為:select title,body FROM item where ID =2可以 將域名改為http://a.b.c/item.php?id=2or 1=1,
通過注入數(shù)據(jù),再對(duì)返回頁面進(jìn)行差異結(jié)果比較。兩次結(jié)果不一樣,證明存在注入漏洞。
SQL注入原理:
SQL注入攻擊指的是通過構(gòu)建特殊的輸入作為參數(shù)傳入Web應(yīng)用程序,而這些輸入大都是SQL語法里的一些組合,通過執(zhí)行SQL語句進(jìn)而執(zhí)行攻擊者所要的操作,其主要原因是程序沒有細(xì)致地過濾用戶輸入的數(shù)據(jù),致使非法數(shù)據(jù)侵入系統(tǒng)。(從客戶端提交特殊的代碼,從而收集程序及服務(wù)器的信息,從而獲取你想到得到的資料)
SQL注入漏洞常見類型:
1.沒有正確過濾轉(zhuǎn)義字符
2.Incorrecttypehandling
3.數(shù)據(jù)庫服務(wù)器中的漏洞
4.盲目SQL注入式攻擊
5.條件響應(yīng)
6.條件性差錯(cuò)
7.時(shí)間延誤
SQL注入點(diǎn)的類型:
1,數(shù)字型注入點(diǎn)
2,字符型注入點(diǎn)
3,搜索型注入點(diǎn):
這類注入主要是指在進(jìn)行數(shù)據(jù)搜索時(shí)沒過濾搜索參數(shù),一般在鏈接地址中有“keyword=關(guān)鍵字”,有的不顯示的鏈接地址,而是直接通過搜索框表單提交。
SQL注入原因:①不當(dāng)?shù)念愋吞幚恚虎诓话踩?a target="_blank" rel="nofollow">數(shù)據(jù)庫配置;③不合理的查詢集處理;④不當(dāng)?shù)腻e(cuò)誤處理;⑤轉(zhuǎn)義字符處理不合適;⑥多個(gè)提交處理不當(dāng)。
SQL注入一般步驟:
發(fā)現(xiàn)SQL注入位置;
·判斷環(huán)境,尋找注入點(diǎn),判斷數(shù)據(jù)庫類型;
其次,根據(jù)注入?yún)?shù)類型,在腦海中重構(gòu)SQL語句的原貌,按參數(shù)類型主要分為下面三種:
(A) ID=49這類注入的參數(shù)是數(shù)字型,SQL語句原貌大致如下:
Select * from表名where字段=49
注入的參數(shù)為ID=49 And [查詢條件],即是生成語句:
Select * from表名where字段=49 And [查詢條件]
(B) Class=連續(xù)劇這類注入的參數(shù)是字符型,SQL語句原貌大致概如下:
Select * from表名where字段=’連續(xù)劇’
注入的參數(shù)為Class=連續(xù)劇’ and [查詢條件]
and ‘’=’,即是生成語句:
Select * from表名where字段=’連續(xù)劇’ and [查詢條件] and‘’=’’
(C)搜索時(shí)沒過濾參數(shù)的,如keyword=關(guān)鍵字,SQL語句原貌大致如下:
Select * from表名where字段like ’%關(guān)鍵字%’
注入的參數(shù)為keyword=’ and [查詢條件] and ‘%25’=’,即是生成語句:
Select * from表名where字段like ’%’ and [查詢條件]
and‘%’=’%’
·發(fā)現(xiàn)WEB虛擬目錄,將查詢條件替換成SQL語句,猜解表名,猜列名,猜目標(biāo)目錄的字段長度。
數(shù)據(jù)庫攻擊常用技巧:
猜表名:a.b.c/nes.php? id=5 and substring(@@version,1,1)=4
確認(rèn)表名:id=5 union all select 1,2,3 from admin
列名:id =5 union all select 1,2 passwd from addmin
·上傳ASP木馬,留下后門;
·得到管理員權(quán)限,竊取數(shù)據(jù);
ASP木馬只有USER權(quán)限,要想獲取對(duì)系統(tǒng)的完全控制,還要有系統(tǒng)的管理員權(quán)限。怎么辦?提升權(quán)限的方法有很多種:
上傳木馬,修改開機(jī)自動(dòng)運(yùn)行的.ini文件(它一重啟,便死定了);
復(fù)制CMD.exe到scripts,人為制造UNICODE漏洞;
下載SAM文件,破解并獲取OS的所有用戶名密碼;
等等,視系統(tǒng)的具體情況而定,可以采取不同的方法。
如何防御SQL漏洞?
(還是吳大牛)核心原則:數(shù)據(jù)代碼分離原則。
1.最佳方法:預(yù)編譯語句,綁定變量。使用預(yù)編譯的SQL語句,SQL的語意不會(huì)變化,攻擊者無法改變SQL的結(jié)構(gòu),即使攻擊者插入了類似于’or ‘1’=’1的字符串,也只會(huì)將此字符串作為username查詢。
2.從存儲(chǔ)過程來防御:先將SQL語句定義在數(shù)據(jù)庫中,存儲(chǔ)過程中可能也存在注入問題,應(yīng)該盡量避免在存儲(chǔ)過程中使用動(dòng)態(tài)SQL語句。
3.從數(shù)據(jù)類型角度來防御:限制數(shù)據(jù)類型,并統(tǒng)一數(shù)據(jù)格式。
4.從開發(fā)者角度來防御:開發(fā)時(shí)盡量用安全函數(shù)代替不安全函數(shù),編寫安全代碼。危險(xiǎn)函數(shù),常見的執(zhí)行命令函數(shù),動(dòng)態(tài)訪問函數(shù),如C語言中的system(),PHP的eval(),JSP的include()導(dǎo)致的代碼越權(quán)執(zhí)行,都是注入。
5.從數(shù)據(jù)庫管理者角度來防御:的最小權(quán)限原則,避免root,dbowner等高權(quán)限用戶直接連接數(shù)據(jù)庫。