在一般的多使用者應用系統中,只有擁有正確的使用者名稱和密碼的使用者才能進入該系統。我們通常需要編寫使用者登入視窗來控制使用者使用該系統,這裡以visualbasic+ado為例:
一、漏洞的產生
用於登入的表:users(name,pwd)。
建立乙個窗體frmlogin,其上有兩個文字框text1,text2和兩個命令按鈕cmdok,cmdexit。兩個文字框分別用於讓使用者輸入使用者名稱和密碼,兩個命令按鈕用於「登入」和「退出」。
1、定義adoconnection物件和adorecordset物件:
optionexplicit
dimadoconasadodb.connection
dimadorsasadodb.recordset
2、在form_load中進行資料庫連線:
cmdok中的**
執行該程式,看起來這樣做沒有什麼問題,但是當在text1中輸入任意字串(如123),在text2中輸入a'or'a'='a時,我們來看sqlstr此時的值:
select*fromusersswheresname='123'andpwd='a'or'a'='a'
執行這樣乙個sql語句,由於or之後的'a'='a'為真值,只要users表中有記錄,則它的返回的eof值一定為false,這樣就輕易地繞過了系統對於使用者和密碼的驗證。
這樣的問題將會出現在所有使用select*fromusersswheresname='"&&name&&"'andpwd='"&&password&&"'的各種系統中,無論你是使用那種程式語言。
二、漏洞的特點
在網路上,以上問題尤其明顯,筆者在許多**中都發現能使用這種方式進入需要進行使用者名稱和密碼驗證的系統。這樣的乙個sql漏洞具有如下的特點:
1、與程式語言或技術無關:無論是使用vb、delphi還是asp、jsp。
2、隱蔽性:現有的系統中有相當一部分存在著這個漏洞,而且不易覺察。
3、危害性:不需要進行使用者名稱或密碼的猜測即可輕易進入系統。
三、解決漏洞的方法
1、控制密碼中不能出現空格。
2、對密碼採用加密方式。
這裡要提及一點,加密不能採用過於簡單的演算法,因為過於簡單的演算法會讓人能夠構造出形如a'or'a'='a的密文,從而進入系統。
3、將使用者驗證和密碼驗證分開來做,先進行使用者驗證,如果使用者存在,再進行密碼驗證,這樣一來也能解決問題。
ThinkPHP使用不當可能造成敏感資訊洩露
thinkphp在開啟debug的情況下會在runtime目錄下生成日誌,而且debug很多站都沒關的,所以影響應該很大吧 我們來看一下thinkphp3.2版本生成日誌結構 thinkphp3.1結構 runtime logs home 16 09 09.log 可以看到是 專案名 runtime...
不當編寫SQL語句導致系統不安全
在一般的多使用者應用系統中,只有擁有正確的使用者名稱和密碼的使用者才能進入該系統。我們通常需要編寫使用者登入視窗來控制使用者使用該系統,這裡以visual basic ado為例 一 漏洞的產生 用於登入的表 users name,pwd 建立乙個窗體frmlogin,其上有兩個文字框text1,t...
不當編寫SQL語句導致系統不安全
漏洞的產生 用於登入的表 users name,pwd 建立乙個窗體frmlogin,其上有兩個文字框text1,text2和兩個命令按鈕cmdok,cmdexit。兩個文字框分別用於讓使用者輸入使用者名稱和密碼,兩個命令按鈕用於 登入 和 退出 1 定義ado connection物件和ado r...