SQL注入1

2021-06-16 07:27:14 字數 3005 閱讀 1511

1、整型引數的判斷

當輸入的引數yy為整型時,通常abc.asp中sql語句原貌大致如下:

select * from 表名 where 字段=yy,所以可以用以下步驟測試sql注入是否存在。

①附加乙個單引號),此時abc.asp中的sql語句變成了

select * from 表名 where 字段=yy』,abc.asp執行異常;

② and 1=1, abc.asp執行正常,而且與

執行結果相同;

③ and 1=2, abc.asp執行異常;

如果以上三步全面滿足,abc.asp中一定存在sql注入漏洞。

2、字串型引數的判斷

當輸入的引數yy為字串時,通常abc.asp中sql語句原貌大致如下:

select * from 表名 where 字段='yy',所以可以用以下步驟測試sql注入是否存在。

①附加乙個單引號),此時abc.asp中的sql語句變成了

select * from 表名 where 字段=yy』,abc.asp執行異常;

②&nb ... 39;1'='1', abc.asp執行正常,而且與

執行結果相同;

③&nb ... 39;1'='2', abc.asp執行異常;

如果以上三步全面滿足,abc.asp中一定存在sql注入漏洞。

3、特殊情況的處理

有時asp程式設計師會在程式設計師過濾掉單引號等字元,以防止sql注入。此時可以用以下幾種方法試一試。

①大小定混合法:由於vbs並不區分大小寫,而程式設計師在過濾時通常要麼全部過濾大寫字串,要麼全部過濾小寫字串,而大小寫混合往往會被忽視。如用select代替select,select等;

②unicode法:在iis中,以unicode字符集實現國際化,我們完全可以ie中輸入的字串化成unicode字串進行輸入。如+ =%2b,空格=%20 等;urlencode資訊參見附件一;

③ascii碼法:可以把輸入的部分或全部字元全部用ascii碼代替,如u=chr(85),a=chr(97)等,ascii資訊參見附件二;

二、區分資料庫伺服器型別

一般來說,access與sql-server是最常用的資料庫伺服器,儘管它們都支援t-sql標準,但還有不同之處,而且不同的資料庫有不同的攻擊方法,必須要區別對待。

1、 利用資料庫伺服器的系統變數進行區分

sql-server有user,db_name()等系統變數,利用這些系統值不僅可以判斷sql-server,而且還可以得到大量有用資訊。如:

① and user>0 不僅可以判斷是否是sql-server,而還可以得到當前連線到資料庫的使用者名稱

②&n ... db_name()>0 不僅可以判斷是否是sql-server,而還可以得到當前正在使用的資料庫名;

2、利用系統表

access的系統表是msysobjects,且在web環境下沒有訪問許可權,而sql-server的系統表是sysobjects,在web環境下有訪問許可權。對於以下兩條語句:

① and (select count(*) from sysobjects)>0

② and (select count(*) from msysobjects)>0

若資料庫是sql-serve,則第一條,abc.asp一定執行正常,第二條則異常;若是access則兩條都會異常。

3、 mssql三個關鍵系統表

sysdatabases系統表:microsoft sql server 上的每個資料庫在表中佔一行。最初安裝 sql server 時,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 資料庫的項。該錶只儲存在 master 資料庫中。 這個表儲存在master資料庫中,這個表中儲存的是什麼資訊呢?這個非常重要。他是 儲存了所有的庫名,以及庫的id和一些相關資訊。

這裡我把對於我們有用的欄位名稱和相關說明給大家列出來。name //表示庫的名字。

dbid //表示庫的id,dbid從1到5是系統的。分別是:master、model、msdb、mssqlweb、tempdb 這五個庫。用select * from master.dbo.sysdatabases 就可以查詢出所有的庫名。

sysobjects:sql-server的每個資料庫內都有此系統表,它存放該資料庫內建立的所有物件,如約束、預設值、日誌、規則、儲存過程等,每個物件在表中佔一行。以下是此系統表的欄位名稱和相關說明。

name,id,xtype,uid,status:分別是物件名,物件id,物件型別,所有者物件的使用者id,物件狀態。

物件型別(xtype)。可以是下列物件型別中的一種:

c = check 約束

d = 預設值或 default 約束

f = foreign key 約束

l = 日誌

fn = 標量函式

if = 內嵌表函式

p = 儲存過程

pk = primary key 約束(型別是 k)

rf = 複製篩選儲存過程

s = 系統表

tf = 表函式

tr = 觸發器

u = 使用者表

uq = unique 約束(型別是 k)

v = 檢視

x = 擴充套件儲存過程

當xtype='u' and status>0代表是使用者建立的表,物件名就是表名,物件id就是表的id值。

用: select * from chouyfd.dbo.sysobjects where xtype='u' and status>0 就可以列出庫chouyfd中所有的使用者建立的表名。

syscolumns :每個表和檢視中的每列在表中佔一行,儲存過程中的每個引數在表中也佔一行。該錶位於每個資料庫中。主要欄位有:

name ,id, colid :分別是欄位名稱,表id號,欄位id號,其中的 id 是 剛上我們用sysobjects得到的表的id號。

用: select * from chouyfd.dbo.syscolumns where id=123456789 得到chouyfd這個庫中,表的id是123456789中的所有字段列表。

SQL注入詳解 1

隨著b s 模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢 根據程式返回的結果,獲得...

SQL注入詳解 1

隨著b s 模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢 根據程式返回的結果,獲得...

簡單的sql注入1

題目 開啟題目 先隨便輸了些數字,發現只有1 2 3查詢結果 接下來進行第一步測試 輸入乙個帶單引號的資料,目的是測試是否存在注入點,輸入1 發現報錯,說明此處存在注入點。且後台 應該是一般的seletc語句,可以通過開閉合單引號來進行注入。輸入1 and 1 1發現id後顯示1 1 1說明存在過濾...