Sql注入式攻擊是指利用設計上的漏洞,在目標服務器上運行Sql 命令以及進行其他方式的攻擊 動態生成Sql命令時沒有對用戶輸入的數据進行驗証是Sql注入攻擊得逞的主要原因
比如一個在線書店,可以根据用戶的輸入關鍵字搜索相關的圖書。
string name = GetUserInput("BookName");
string script = "select table_book where book_name? like? N'%" + name + RunSql(script)
RunSql(script);
如果
name? = " ' select @@servername where '' = ' ";
這樣就可以得到DB Server的名字

還以在線書店為例,用戶只有登陸後才能察看自己的帳戶信息,這樣做是無可寘疑的,然而用戶驗証的代碼如下
//id和password直接來自用戶的輸入。未做處理
string id = GetUserInput("UserID");
string password = GetUserInput("UserPassword");
tring script = "select * from table_user where User_ID = '" + id? + "' and User_Password? = '" + password? + "' ";
RunSql(script);
如果用戶輸入的password為“ or ''=' ”,那麼生成的script就為
select * from table_user where User_ID = 'UserID' and User_Password? = ' ' or ''=' '
這樣一來,即使不知道用戶的密碼也可以察看該用戶的帳戶信息了
再比如,入侵者會把一些巧妙偽裝的代碼嵌入到你動態生成的Sql命令中,比如
Delete table_Book where 1 = 1? ...
use master--

上面的例子都是一些簡單的示例,攻擊者還可能通過sql的漏洞對操作係統進行攻擊,比如運行
[xp_cmdshell],[xp_regread]
噹然實際上的攻擊沒有這麼簡單,攻擊者還會利用係統設計的其他漏洞。比如程序把數据庫返回的出錯信息沒有進行轉換就直接輸出給用戶看,那麼攻擊者就設計一些sql語句誘導係統返回需要的信息

從上面的這些例子可以看出,對數据庫訪問權限的設計不噹,給與每一個數据庫連接太多的權限,甚至dbo或sa的權限,也是sql注入式攻擊利用的主要漏洞之一。
?
防範sql注入式攻擊
最小權限原則。特別是不要用dbo或者sa賬戶,為不同的類型的動作或者組建使用不同的賬戶,最小權限原則適用於所有與安全有關的場合
對用戶輸入進行檢查。對一些特殊字符,比如單引號,雙引號,分號,逗號,冒號,連接號等進行轉換或者過濾;使用強數据類型,比如你需要用戶輸入一個整數,就要把用戶輸入的數据轉換成整數形式;限制用戶輸入的長度等等。這些檢查要放在server運行,client提交的任何東西都是不可信的
使用存儲過程,如果一定要使用sq語句,soul by ludacris sl150 耳機,那麼用標准的方式組建sql語句,比如可以利用parameters對象,避免用字符串直接拼sq命令。
噹sql運行出錯時,不要把數据庫返回的錯誤信息全部顯示給用戶,錯誤信息經常會透露一些數据庫設計的細節
針對常用的sql注入式攻擊方式對症下藥
arrow
arrow
    全站熱搜

    Mori Yoko 發表在 痞客邦 留言(0) 人氣()