分析SQL執行記錄,發現SQL中的注入點

2021-07-17 03:57:22 字數 3814 閱讀 7393

不只一次有人對我說: sql注入已經過時了。 現在的web應用已經很難被注入了。

還好最近看到乙份針對烏雲漏洞庫的統計資料(

其結果明確的指出 sql注入漏洞仍然是目前web應用中數量最多的漏洞。

亡羊補牢,不如思患預防,最完美解決sql注入的方法是程式中沒有sql注入點。即程式中不使用字串拼接sql,而全部使用佔位符動態繫結引數。

為了實現上述目標。需要開發工程師的嚴格自律 (不可信任),和對**進行嚴格的review (額外成本). 為了提高發現sql注入點的效率。我們嘗試分析datahekr審計功能中記錄的sql執行記錄,以自動化的方式發現sql中存在的注入點。分析步驟如下:

1. 分析sql

以如下sql為例。

select

*from

city_list

where

city_name_en

='aaaa'

andcity_name_cn=?

select

*from

city_list

where

substring

(city_name_en,2

,1)=

?select

*from

city_list

where

substring

(city_name_en,2

,1)=

?select

*from

city_list

where

city_name_en

='sh'

andcity_name_cn=?

select

*from

city_list

where

city_name_en

='bj'

andcity_name_cn=?

select

*from

city_list

where

city_name_en=?

andcity_name_cn

='上海'

我們先進行sql的解析。取得sql中hardcode的數值,並對hardcode的引數進行引數化替換,得到如下結果。

select

*from

city_list

where

city_name_en=?

0and

city_name_cn=?

?0='aaaa'

select

*from

city_list

where

substring

(city_name_en,?

0,?1

)=??

0=2,

?1=1

,select

*from

city_list

where

substring

(city_name_en,?

0,?1

)=??

0=2,

?1=1

,select

*from

city_list

where

city_name_en=?

0and

city_name_cn=?

?0='sh'

select

*from

city_list

where

city_name_en=?

0and

city_name_cn=?

?0='bj'

select

*from

city_list

where

city_name_en=?

andcity_name_cn=?

0?0=

'上海'

2. 合併相同結構sql,並統計hardcode引數中出現的不同引數值。

select

*from

city_list

where

city_name_en=?

0and

city_name_cn=?

?0='aaaa'

,'sh'

,'bj'

select

*from

city_list

where

substring

(city_name_en,?

0,?1

)=??

0=2,

?1=1

select

*from

city_list

where

city_name_en=?

andcity_name_cn=?

0?0=

'上海'

select * from city_list where city_name_en = ?0 and city_name_cn = ?

的引數 ?0 中,出現了3個不同的引數值,所以**

select

*from

city_list

where

city_name_en

='aaaa'

andcity_name_cn

=?

中 'aaaa' 處存在注入點。

在其他sql中,雖然也存在hardcode的數值,但是沒有出現不同的數值。所以不認為是sql注入點。

注意點1:

sql中可能出現列舉型別:

select * from city_list where active = 1 and city_name_cn = ?

select * from city_list where active = 0 and city_name_cn = ?

select * from city_list where type = 'a' and city_name_cn = ?

select * from city_list where type = 'b' and city_name_cn = ?

select * from city_list where type = 'c' and city_name_cn = ?

列舉型別在sql中常常是hardcode存在的。為了避免將列舉型別誤報為sql注入點。我們需要考慮hardcode引數值樣本, 例如超過10個不同的值,才認為是注入漏洞。

注意點2:

對於mysql,因為預設useserverprepstmts = false,

(請參考http://

blog.csdn.net/axman/art

icle/details/6913527

), 導致所有傳送到db的sql中都不包含動態引數,全部引數值都被替換入sql文字中. 所以無法通過本文所述的方法進行sql注入點分析。

請先開啟useserverprepstmts = true, 才可以使用本文的方法進行分析。

結束:

本文提及的分析方法,已經應用於 datahekr (saas 資料庫安全中介軟體) 中,請大家免費註冊試用。

記錄sql語句的執行記錄,用於分析

原文 記錄sql語句的執行記錄,用於分析 set statistics profile on set statistics io on set statistics time on go 這之間是要執行的指令碼 select from usertable go 這之間是要執行的指令碼 set sta...

記錄sql語句的執行記錄,用於分析

原文 記錄sql語句的執行記錄,用於分析 set statistics profile on set statistics io on set statistics time on go 這之間是要執行的指令碼 select from usertable go 這之間是要執行的指令碼 set sta...

sql執行過程分析

我們總是寫sql語句,資料庫把結果返回給我們,那中間過程又是什麼?如果了解oracle是怎麼執行sql語句的中間過程,對我們優化sql有很大的幫助 首先了解一下執行sql,需要消耗什麼資源,cpu,記憶體,io,我們要了解什麼情況下會消耗cpu,什麼情況下消耗記憶體,什麼情況下消耗io,只有了解了這...