亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

1、什么是Sql注入攻擊

SQL注入攻擊通過(guò)構(gòu)建特殊的輸入作為參數(shù)傳入Web應(yīng)用程序,而這些輸入大都是SQL語(yǔ)法里的一些組合,通過(guò)執(zhí)行SQL語(yǔ)句進(jìn)而執(zhí)行攻擊者所要的操作,它目前是黑客對(duì)數(shù)據(jù)庫(kù)進(jìn)行攻擊的最常用手段之一。

本文將帶你從介紹 Web 應(yīng)用運(yùn)行原理開(kāi)始,一步一步理解 Sql 注入的由來(lái)、原理和攻擊方式。

2、Web程序三層架構(gòu)

三層架構(gòu)(3-tier architecture) 通常意義上就是將整個(gè)業(yè)務(wù)應(yīng)用劃分為:

界面層(User Interface layer)

業(yè)務(wù)邏輯層(Business Logic Layer)

數(shù)據(jù)訪問(wèn)層(Data access layer)。

Sql注入基本原理

 

 

區(qū)分層次的目的即為了“高內(nèi)聚低耦合”的思想。在軟件體系架構(gòu)設(shè)計(jì)中,分層式結(jié)構(gòu)是最常見(jiàn),也是最重要的一種結(jié)構(gòu)被應(yīng)用于眾多類型的軟件開(kāi)發(fā)。

3、Sql注入產(chǎn)生原因及威脅

剛剛講過(guò)當(dāng)我們?cè)L問(wèn)動(dòng)態(tài)網(wǎng)頁(yè)時(shí), Web 服務(wù)器會(huì)向數(shù)據(jù)訪問(wèn)層發(fā)起 Sql 查詢請(qǐng)求,如果權(quán)限驗(yàn)證通過(guò)就會(huì)執(zhí)行 Sql 語(yǔ)句。 這種網(wǎng)站內(nèi)部直接發(fā)送的Sql請(qǐng)求一般不會(huì)有危險(xiǎn),但實(shí)際情況是很多時(shí)候需要結(jié)合用戶的輸入數(shù)據(jù)動(dòng)態(tài)構(gòu)造 Sql 語(yǔ)句,如果用戶輸入的數(shù)據(jù)被構(gòu)造成惡意 Sql 代碼,Web 應(yīng)用又未對(duì)動(dòng)態(tài)構(gòu)造的 Sql 語(yǔ)句使用的參數(shù)進(jìn)行審查,則會(huì)帶來(lái)意想不到的危險(xiǎn)。

Sql 注入帶來(lái)的威脅主要有如下幾點(diǎn)

猜解后臺(tái)數(shù)據(jù)庫(kù),這是利用最多的方式,盜取網(wǎng)站的敏感信息。

繞過(guò)認(rèn)證,列如繞過(guò)驗(yàn)證登錄網(wǎng)站后臺(tái)。

注入可以借助數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程進(jìn)行提權(quán)等操作

4、判斷Sql注入點(diǎn)

4.1 判斷是否存在sql注入漏洞

通常情況下,可能存在 Sql 注入漏洞的 Url 是類似這種形式 :http://xxx.xxx.xxx/abcd.php?id=XX對(duì) Sql 注入的判斷,主要有兩個(gè)方面:

判斷該帶參數(shù)的 Url 是否存在 Sql 注入?

如果存在 Sql 注入,那么屬于哪種 Sql 注入?

可能存在 Sql 注入攻擊的 ASP/PHP/JSP 動(dòng)態(tài)網(wǎng)頁(yè)中,一個(gè)動(dòng)態(tài)網(wǎng)頁(yè)中可能只有一個(gè)參數(shù),有時(shí)可能有多個(gè)參數(shù)。有時(shí)是整型參數(shù),有時(shí)是字符串型參數(shù),不能一概而論。總之只要是帶有參數(shù)的 動(dòng)態(tài)網(wǎng)頁(yè)且此網(wǎng)頁(yè)訪問(wèn)了數(shù)據(jù)庫(kù),那么就有可能存在 Sql 注入。如果程序員沒(méi)有足夠的安全意識(shí),沒(méi)有進(jìn)行必要的字符過(guò)濾,存在SQL注入的可能性就非常大。

最為經(jīng)典的單引號(hào)判斷法: 在參數(shù)后面加上單引號(hào),比如:

1
http://xxx/abc.php?id=1'

 

如果頁(yè)面返回錯(cuò)誤,則存在 Sql 注入。 原因是無(wú)論字符型還是整型都會(huì)因?yàn)閱我?hào)個(gè)數(shù)不匹配而報(bào)錯(cuò)。 (如果未報(bào)錯(cuò),不代表不存在 Sql 注入,因?yàn)橛锌赡茼?yè)面對(duì)單引號(hào)做了過(guò)濾,這時(shí)可以使用判斷語(yǔ)句進(jìn)行注入,因?yàn)榇藶槿腴T基礎(chǔ)課程,就不做深入講解了)

4.2 判斷Sql注入漏洞的類型

通常 Sql 注入漏洞分為 2 種類型:

數(shù)字型

字符型

其實(shí)所有的類型都是根據(jù)數(shù)據(jù)庫(kù)本身表的類型所產(chǎn)生的,在我們創(chuàng)建表的時(shí)候會(huì)發(fā)現(xiàn)其后總有個(gè)數(shù)據(jù)類型的限制,而不同的數(shù)據(jù)庫(kù)又有不同的數(shù)據(jù)類型,但是無(wú)論怎么分常用的查詢數(shù)據(jù)類型總是以數(shù)字與字符來(lái)區(qū)分的,所以就會(huì)產(chǎn)生注入點(diǎn)為何種類型。

4.2.1 數(shù)字型判斷

當(dāng)輸入的參 x 為整型時(shí),通常 abc.php 中 Sql 語(yǔ)句類型大致如下: select * from <表名> where id = x 這種類型可以使用經(jīng)典的 and 1=1 和 and 1=2 來(lái)判斷:

Url 地址中輸入 http://xxx/abc.php?id= x and 1=1 頁(yè)面依舊運(yùn)行正常,繼續(xù)進(jìn)行下一步。

Url 地址中繼續(xù)輸入 http://xxx/abc.php?id= x and 1=2 頁(yè)面運(yùn)行錯(cuò)誤,則說(shuō)明此 Sql 注入為數(shù)字型注入。

原因如下: 當(dāng)輸入 and 1=1時(shí),后臺(tái)執(zhí)行 Sql 語(yǔ)句:

1
select * from <表名> where id = x and 1=1

 

沒(méi)有語(yǔ)法錯(cuò)誤且邏輯判斷為正確,所以返回正常。

當(dāng)輸入 and 1=2時(shí),后臺(tái)執(zhí)行 Sql 語(yǔ)句:

1
select * from <表名> where id = x and 1=2

 

沒(méi)有語(yǔ)法錯(cuò)誤但是邏輯判斷為假,所以返回錯(cuò)誤。 我們?cè)偈褂眉僭O(shè)法:如果這是字符型注入的話,我們輸入以上語(yǔ)句之后應(yīng)該出現(xiàn)如下情況:

1
2
select * from <表名> where id = 'x and 1=1' 
select * from <表名> where id = 'x and 1=2'

 

查詢語(yǔ)句將 and 語(yǔ)句全部轉(zhuǎn)換為了字符串,并沒(méi)有進(jìn)行 and 的邏輯判斷,所以不會(huì)出現(xiàn)以上結(jié)果,故假設(shè)是不成立的。

4.2.2 字符型判斷

當(dāng)輸入的參 x 為字符型時(shí),通常 abc.php 中 SQL 語(yǔ)句類型大致如下: select * from <表名> where id = ‘x’ 這種類型我們同樣可以使用 and ‘1’=’1 和 and ‘1’=’2來(lái)判斷:

Url 地址中輸入 http://xxx/abc.php?id= x’ and ‘1’=’1 頁(yè)面運(yùn)行正常,繼續(xù)進(jìn)行下一步。

Url 地址中繼續(xù)輸入 http://xxx/abc.php?id= x’ and ‘1’=’2 頁(yè)面運(yùn)行錯(cuò)誤,則說(shuō)明此 Sql 注入為字符型注入。

原因如下: 當(dāng)輸入 and ‘1’=’1時(shí),后臺(tái)執(zhí)行 Sql 語(yǔ)句:

1
select * from <表名> where id = 'x' and '1'='1'

 

語(yǔ)法正確,邏輯判斷正確,所以返回正確。

當(dāng)輸入 and ‘1’=’2時(shí),后臺(tái)執(zhí)行 Sql 語(yǔ)句:

1
select * from <表名> where id = 'x' and '1'='2'

 

語(yǔ)法正確,但邏輯判斷錯(cuò)誤,所以返回正確。同學(xué)們同樣可以使用假設(shè)法來(lái)驗(yàn)證。

5、Sql注入實(shí)例

5.1 繞過(guò)登陸

我們正常的登陸是輸入用戶名密碼到后臺(tái)數(shù)據(jù)庫(kù)判斷用戶名密碼是否正確,看看后臺(tái)代碼是如何實(shí)現(xiàn)的

1
select * from user where username = '$name' and password = '$pwd'"

 

用戶名密碼都輸入123,實(shí)際執(zhí)行的sql語(yǔ)句是:

1
select * from users where username='123' and password='123'

 

我們嘗試在用戶名中輸入 123’ or 1=1 #, 密碼同樣輸入 123’ or 1=1 #顯示登陸成功,為什么會(huì)登錄成功呢,我們來(lái)看看實(shí)際執(zhí)行的sql語(yǔ)句

1
select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'

 

按照 MySQL 語(yǔ)法,# 后面的內(nèi)容會(huì)被忽略,所以以上語(yǔ)句等同于(實(shí)際上密碼框里不輸入任何東西也一樣):

1
select * from users where username='123' or 1=1

 

由于判斷語(yǔ)句 or 1=1 恒成立,所以結(jié)果當(dāng)然返回真,成功登錄。 我們?cè)賴L試不使用 # 屏蔽單引號(hào),采用手動(dòng)閉合的方式: 我們嘗試在用戶名中輸入 123’ or ‘1’=’1, 密碼同樣輸入 123’ or ‘1’=’1 (不能少了單引號(hào),否則會(huì)有語(yǔ)法錯(cuò)誤): 此處輸入圖片的描述 此處輸入圖片的描述 實(shí)際執(zhí)行的 Sql 語(yǔ)句是:

1
select * from users where username='123' or '1'='1' and password='123' or '1'='1`

 

看到了嗎??jī)蓚€(gè) or 語(yǔ)句使 and 前后兩個(gè)判斷永遠(yuǎn)恒等于真,所以能夠成功登錄。

還有通過(guò)sql語(yǔ)句注入來(lái)獲取隱私信息,所以sql注入需要引起程序員們的注意。

6、預(yù)防Sql注入的方法

下面我針對(duì)JSP,說(shuō)一下應(yīng)對(duì)方法:

(1)(簡(jiǎn)單又有效的方法)PreparedStatement

采用預(yù)編譯語(yǔ)句集,它內(nèi)置了處理SQL注入的能力,只要使用它的setXXX方法傳值即可。

使用好處:

(1).代碼的可讀性和可維護(hù)性.

(2).PreparedStatement盡最大可能提高性能.

(3).最重要的一點(diǎn)是極大地提高了安全性.

原理:

sql注入只對(duì)sql語(yǔ)句的準(zhǔn)備(編譯)過(guò)程有破壞作用

而PreparedStatement已經(jīng)準(zhǔn)備好了,執(zhí)行階段只是把輸入串作為數(shù)據(jù)處理,

而不再對(duì)sql語(yǔ)句進(jìn)行解析,準(zhǔn)備,因此也就避免了sql注入問(wèn)題.

(2) 使用正則表達(dá)式過(guò)濾傳入的參數(shù)

要引入的包:

import JAVA.util.regex.*;

正則表達(dá)式:

private String CHECKSQL = “^(.+)sands(.+)|(.+)sor(.+)s$”;

判斷是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具體的正則表達(dá)式:

檢測(cè)SQL meta-characters的正則表達(dá)式 :

/(%27)|(’)|(–)|(%23)|(#)/ix

修正檢測(cè)SQL meta-characters的正則表達(dá)式 :/((%3D)|(=))[^n]*((%27)|(’)|(–)|(%3B)|(:))/i

典型的SQL 注入攻擊的正則表達(dá)式 :/w*((%27)|(’))((%6F)|o|(%4F))((%72)|r|(%52))/ix

檢測(cè)SQL注入,UNION查詢關(guān)鍵字的正則表達(dá)式 :/((%27)|(’))union/ix(%27)|(’)

檢測(cè)MS SQL Server SQL注入攻擊的正則表達(dá)式:

/exec(s|+)+(s|x)pw+/ix

等等…..

(3) 字符串過(guò)濾

比較通用的一個(gè)方法:

(||之間的參數(shù)可以根據(jù)自己程序的需要添加)

  •  
public static boolean sql_inj(String str) 
{ 
String inj_str = “’|and|exec|insert|select|delete|update| 
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,”; 
String inj_stra[] = split(inj_str,”|”); 
for (int i=0 ; i < inj_stra.length ; i++ ) 
{ 
if (str.indexOf(inj_stra[i])>=0) 
{ 
return true; 
} 
} 
return false; 
}

 

(4) jsp中調(diào)用該函數(shù)檢查是否包函非法字符

防止SQL從URL注入:

sql_inj.java代碼:

  •  
package sql_inj; 
import java.net.*; 
import java.io.*; 
import java.sql.*; 
import java.text.*; 
import java.lang.String; 
public class sql_inj{ 
public static boolean sql_inj(String str) 
{ 
String inj_str = “’|and|exec|insert|select|delete|update| 
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,”; 
//這里的東西還可以自己添加 
String[] inj_stra=inj_str.split(“|”); 
for (int i=0 ; i < inj_stra.length ; i++ ) 
{ 
if (str.indexOf(inj_stra[i])>=0) 
{ 
return true; 
} 
} 
return false; 
} 
}

 

(5) JSP頁(yè)面判斷代碼:

使用JavaScript在客戶端進(jìn)行不安全字符屏蔽

功能介紹:檢查是否含有”‘”,””,”/”

參數(shù)說(shuō)明:要檢查的字符串

返回值:0:是1:不是

函數(shù)名是

  •  
function check(a) 
{ 
return 1; 
fibdn = new Array (”‘” ,””,”/”); 
i=fibdn.length; 
j=a.length; 
for (ii=0; ii<i; ii++) 
{ for (jj=0; jj<j; jj++) 
{ temp1=a.charAt(jj); 
temp2=fibdn[ii]; 
if (tem’; p1==temp2) 
{ return 0; } 
} 
} 
return 1;
}

 

總的說(shuō)來(lái),防范一般的SQL注入只要在代碼規(guī)范上下點(diǎn)功夫就可以了。

凡涉及到執(zhí)行的SQL中有變量時(shí),用JDBC(或者其他數(shù)據(jù)持久層)提供的如:PreparedStatement就可以 ,切記不要用拼接字符串的方法就可以了。

看完本篇文章,小伙伴們明白sql注入的基本原理了嗎?

分享到:
標(biāo)簽:注入 Sql
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定