即使應用程序總是過濾單引號,攻擊者依然能夠注入SQL同樣通過應用程序使數據庫中的數據重復使用。
例如,攻擊者可能利用下面的信息在應用程序中注冊:
Username:admin'—
Password:password
應用程序正確過濾了單引號,返回了一個類似這樣的insert語句:
insert into users values(123,'admin''—','password',0xffff)
我們假設應用程序允許用戶修改自己的密碼。這個ASP腳本程序首先保證用戶設置新密碼前擁有正確的舊密碼。代碼如下:
username = escape( Request.form("username") );
oldpassword = escape( Request.form("oldpassword") );
newpassword = escape( Request.form("newpassword") );
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + oldpassword + "'";
rso.open( sql, cn );
if (rso.EOF)
{
…
設置新密碼的代碼如下:
sql = "update users set password = '" + newpassword + "' where username = '" + rso("username") + "'"
rso("username")為登陸查詢中返回的用戶名
當username為admin'—時,查詢語句為:
update users set password = 'password' where username='admin'—'
這樣攻擊者可以通過注冊一個admin'—的用戶來根據自己的想法來設置admin的密碼。
這是一個非常嚴重的問題,目前在大型的應用程序中試圖去過濾數據。最好的解決方法是拒絕非法輸入,這勝于簡單地努力去修改它。這有時會導致一個問題,非法的字符在那里是必要的,例如在用戶名中包含'符號,例如
文章來源于領測軟件測試網 http://www.kjueaiud.com/