server 2003上跑asp超时问题
Posted in asp, iis on 01/22/2010 08:20 下午 by tunpishuang问题是,打开站点静态html文件和不需要连接oracle数据库的asp文件可以打开,有连数据库的文件无法打开。
尝试了各种方法,包括重新建立站点、重新建立应用池、分配权限等无果。
事件查看器报错是应用池超时。
最后
net stop w3svc
net start w3svc
搞定了。
太奇怪了。
问题是,打开站点静态html文件和不需要连接oracle数据库的asp文件可以打开,有连数据库的文件无法打开。
尝试了各种方法,包括重新建立站点、重新建立应用池、分配权限等无果。
事件查看器报错是应用池超时。
最后
net stop w3svc
net start w3svc
搞定了。
太奇怪了。
第一种方法:在服务器上运行jscript (via)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <script language="JScript" runat="Server"> function toObject(json) { eval("var o=" + json); return o; } </script> <% Dim json json = "{'uid':'1','username':'abc','email':'123@163.com'}" Set json = toObject(json) Response.Write json.uid & "<br/>" Response.Write json.username & "<br/>" Response.Write json.email & "<br/>" Set json = Nothing %> |
第二种方法:使用MSScriptControl.ScriptControl,和第一种方法类似,只是在不同的环境下执行js。这里有一个例子和parser。
第三种方法:另外一个parser。
第四种方法:使用aspjson
字面理解,option就是设置,explicit的意思:详述的,明确的;毫不隐瞒的,露骨的。
option explicit 表示所有的变量要先声明,再使用
如果使用,Option Explicit 语句必须写在模块的所有过程之前。
如果模块中使用了 Option Explicit,则必须使用 Dim、Private、Public、ReDim 或 Static 语句来显式声明所有的变量。如果使用了未声明的变量名在编译时间会出现错误。
使用 Option Explicit 可以避免在键入已有变量时出错,在变量的范围不是很清楚的代码中使用该语句可以避免混乱。
一个简单的例子:
1 2 3 4 | option explicit dim dimedvar myvar=10 '报错:变量未定义: 'myvar' dimedvar="dimed" '没有报错 |
当任务布置下来的时候,我完全不知道报表是个啥东东。开始做的那个单表的完全就是自己yy出来的结果,最后不满意,只有重新做过。
思路简单也造成了这个报表模块功能的局限性。在写代码的过程中碰到了很多的问题,并一一解决掉。
这个模块使用两个表report_info和report_field。
report_info记录报表的基本信息,包括报表名称、说明、模板、建立的用户、创建时间等。
report_field通过report_id和report_info的id是关联字段,包括主要保存每个需要调出数据的sql语句。
report_field填写好的数据,通过模板上的[#keyword#]关键字来替换,就得到了一个简单的报表。
开始全部使用div,发现排版很乱,最后碰巧找到了<fieldset>这个不是很流行的标签。报表信息填写、sql语句生成、模板、已添加字段都有条不紊的排好了,<fieldset>里面放一个<legend> 就知道这个字段集合主要是用来做啥的了。
开始本来打算自己制作一个表单用来自动生成sql语句,但是后来越想越复杂,有and有or,多表的时候有left join,right join,full join,还有括号表示优先级,比如数据类型是数字还得验证、是日期类型至少也得弹出一个js的日期选择框吧。最后找到了codeslave哥写的highquery,这东西就是我所需要的,完全可以满足这个报表模块的需求,但是在后来发现了一个棘手的问题。highquery初始化的时候里面的字段列表是通过它自己写的Field对象new出来的。这样每次页面加载后,从request.querystring传过来的表名就固定了,无法动态的载入其他表单字段信息,最后只有弄成弹窗了。
我使用级联下拉菜单来让用户选定需要查询指定表的指定字段的指定函数 比如db1.max(field1)。也需要通过无刷新页面取数据,所以临时看了一下jquery调用ajax的相关文章,下面这段代码用了一下午才憋出来,囧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $("#selectTableInner").change(function(){ var fieldName=this.options[this.selectedIndex].value; $.ajax({ type :"GET", url :"getData.asp?table_name="+fieldName, dataType:"json", success :function(msg){ $("#selectFieldInner").empty(); $("#selectTableInner option").each(function(i){ selectFieldInner.options.add(new Option(msg.fieldlist[i].FIELD_ALIASES,msg.fieldlist[i].FIELD_NAME)); }); } }); document.getElementById("condition_en").value=""; }); |
还有一个javascript原生版本ajax
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | sel.onchange=function(){ var fieldName=this.options[this.selectedIndex].value; var url="getData.asp?table_name="+fieldName; if(window.ActiveXObject) xhr=new ActiveXObject("Microsoft.XMLHTTP"); else if(window.XMLHttpRequest) xhr=new XMLHttpRequest(); xhr.open("GET",url); xhr.onreadystatechange=callback; xhr.send(null); }; function callback() { msg2=xhr.responseText; var func=new Function("return"+msg2); var json=func(); var selectFieldInner=document.getElementById("selectFieldInner"); for(i=0;i<json.fieldlist.length;i++){ FieldList.add(new Field(json.fieldlist[i].FIELD_ALIASES,json.fieldlist[i].FIELD_NAME,'varchar','100','','')); } } |
我是通过json格式来传输数据。在服务器端将asp对象转换成json对象又让我犯难了。找到了一个项目:aspjson,同时包含里面的JSON.asp和JSON_UTIL.asp 可以直接将sql执行出来的数据转换成json对象。因为javascript对json原生支持,所以javascript对json的访问也是非常简单的。因为aspjson是老外开发的,自称是支持unicode,但在写代码的时候出现asp下标越界错误。最后搞了半天找到原因,提交了一个issue,并被作者fixed了。很快,貌似他一直都在线,恩,是个宅男。
开网上的文章所jquery对象不能被赋值,最后在写代码的时候也出现这个问题。所在最后在包含了jquery.js的页面里面写了很多的getElementById(),代码混杂,这就是jquery没学好的后果。
接下来的博文我会将一些具体问题记录一下。
写了段代码
1 2 3 4 5 6 7 8 9 | for i=0 to ubound(arr,2) if (arr(2,i)="日期") then response.write("FieldList.add(new Field('"&arr(1,i)&"','"&arr(0,i)&"','datetime', '100', '', ''))") else if (arr(2,i)="整数") then response.write("FieldList.add(new Field('"&arr(1,i)&"','"&arr(0,i)&"','number', '100', '', ''))") else response.write("FieldList.add(new Field('"&arr(1,i)&"','"&arr(0,i)&"','varchar', '100', '', ''))") end If Next |
结果报错:
Microsoft VBScript 编译器错误 错误 ‘800a041f’
错误的 ‘Next’
/report/report_add.asp,行 188
Next
^
搞了2个小时,查了文档无果(其实是因为没仔细看)
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements]] . . .
[Else
[elsestatements]]
End If
在这里找到了答案
把else if改成elseif 搞定。
真是太粗心了。
IIS报错:
Response 对象 错误 ‘ASP 0251 : 80004005′
超过响应缓冲区限制
/test.asp,行 0
此 ASP 页的执行造成响应缓冲区超过其配置限制。
代码大概如下:
1 2 3 4 5 6 7 8 | if request.querystring("table_name") <> "" then table_name=request.querystring("table_name") sql="SELECT f1,f2 FROM table_info WHERE table_name='"&table_name&"'" set rs=conn.execute(sql) do while not rs.eof or rs.bof response.write rs(0) loop end if |
因为知道是缓冲区大小超出限制,说明response.write输出了大量的数据。
默认情况下iis是开启了缓存的,所以要等到数据输出完毕然后才从内存将数据发送到浏览器输出。
所以我在代码前面加入:
1 | response.buffer=false |
来关闭缓存,也可以到iis ,网站 -> 启动缓存 -> 设置为false (IIS7)。
发现了大量同一个字段数据输出,才知道是没有写rs.movenext ,囧。
在loop上一行加上rs.movenext , 然后最好开启缓存,对性能绝对有提升。
上周二跑到我哥的公司去面试,最后录用了,应该是看在哥的面子上。
公司主要的产品是医院办公自动化系统和信息管理系统,比较专业的说法叫HOA和HIS,用asp+oracle/sqlserver开发的。还有考勤机、一卡通等产品。
已经上班有个星期了,主要的工作就是读HOA系统代码,方便以后系统的修改。
星期五上午到歌乐山胸科医院去给别个装HOA系统,导入数据库的时候出现了问题:
IMP-00019:由于 ORACLE 错误 1400 而拒绝行
IMP-00003:遇到 ORACLE 错误 1400
ORA-01400:无法将 Null 插入(“DB”.”TABLE”.”ID”)
屏幕不停的滚动,后来才知道那个表有11万多行,就这样不停的报错,就算是加入ignore=y参数,导入数据库也要1个小时才能搞定。
最不解的是回家用电脑查询ID字段没有一个记录为Null的,看样子应该不是导入数据库的问题。
这个星期一换了一个干净点的数据库终于把这个问题给解决了,但是系统还是有点问题,服务器开机后,客户机无法登陆进OA系统。但是登陆进服务器之后再注销一次就可以了,相当不解的问题。
很巧合的时候,我们上歌乐山那天正好是“11.27”大屠杀纪念日,很多人都去了红岩广场。
去的时候也非常不方便,从小龙坎走到陈家湾,然后坐807到烈士墓,然后做长安车上山。
不知道是不是我们公司HOA系统的bug,我到了公司可以登陆进HOA系统,回到寝室就完全没反应了,但是用sqlplus就可以连接到数据库。应该和本地连接有一点的联系。
看了大概一个星期的代码,我最大的感受就是代码质量不高,不符合MVC开发模式。代码和样式完全是混合的,再加上table的布局,还有一些不规范的变量申明(比如iii,kkk无意义字符,错误的英文单词),确实看起来很恼火。不过我都将我读代码发现的问题,需要改进的,还自己不知道的都记录下来,需要以后有机会能用上它重写这个系统。
公司用了dll来加密系统,这方面的知识我还是空白,不过可以尝试分析一下dll源代码,但是貌似没人给我。
今天星期二,考试科目”internet开发”,说白了就是asp.net,没啥好说的,很水儿。
考完了,在工行存了点钱,然后在网上买了本书:“SQL语法范例大全(SQL Server 、Oracle通解)”,选择这本书的原因是不仅讲了oracle,还讲了sqlserver,包括存储过程的编写(这个是以后要求的)。希望对我现在的工作有帮助。
感觉上班和上课生活有相似的有不同的。相似的是都是坐在电脑前面,不同的是作息时间。
我现在真正的成为了IT民工,工薪一族,虽然听说公司最近数月都没发工薪了。
家里人叫我去考公务员,铁饭碗,稳定。其实我一点兴趣也没有。唉,必须得看出点成绩才能改变家里人的“铁饭碗”思想。
irrelevant:
10月1日放国庆了,该死的学校30号晚上尽然还要上晚自习,没有办法只有10月1日回家了。在寝室看完了国庆60周年的阅兵式,这次大家的普遍的反应是没有50周年好看。那个猥琐的导播的技术也确实是烂到了家。最牛逼的还是小平同志那个时候的阅兵式,打过仗的就是不一样啊。今天是十月五日,晃眼间今天就5日了,国庆就过了大半,无所谓,反正学校、家里的生活对我来说没有好大的区别,现在最想的还是找工作,实践自己的所学。
——————————————————–
今天没有事情做,友情检测了一个站点 ,思路和过程我会详细记录,此本发布之前已经修补好了所有的漏洞,请看官不要徒劳。检测的主要目的是学习安全技术,挂马死全家。
首先瞥了一下网站的基本构架,89不离10是用asp+access搭建的,安全性非常让人质疑,然后随便打开一个带有参数的地址:http://www.xxx.com/xsnews/News_View.asp?NewsID=80 。
习惯性的在网站后面的参数加上’ 成了:
http://www.xxx.com/xsnews/News_View.asp?NewsID=80′
结果网页照常正常显示,只是新闻导航有点变化:
动态信息 – [新闻标题] 变成了:$$路径$$ ,我8成估计是模板代码。我突然发现子目录的名字是xsnews,就直接打开这个子目录:
http://www.xxx.com/xsnews/
网站使用的是讯时网站管理系统,但是具体的版本还是未知,我姑且算它使用的是最新版本,就到官方网站下载了一个最新的版本本地假设好,来研究研究:http://www.xuas.com/view.asp?id=2 ,access版本是免费的,mssql是收费的。
down下来,看了看文件目录,我艹,这完全没有统一的命名规范嘛,有大写的,有小写的,有“-”连接的,有“_”连接的。还有后面加“2”的,首先一点来判断这个系统就是做得不专业(当然叫我做不一定做得出来,但至少俺至少了解一些系统开发时的一些规范)。
既然前台的sql注入没有希望了,那么我们来看看后台登录代码 login.asp,最牛逼的是这几行,用随机数来生成验证码,这种验证码用了等于没有用,写个js应该可以自动获取里面的值,然后自动填写注册码。理论是这样的,我有时间实验一下。
171 172 173 174 175 | Randomize an="" an= int((99999-11111+1) * RND +11111) session("xuasyzm")=an Response.Write an |
———————以下是表单的详细信息:
| ID | 名称 | 方法 | 操作 |
|---|---|---|---|
| FrontPage_Form1 | POST | admin_login.asp |
| 索引 | ID | 名称 | 类型 | 值 | 标签 | 大小 | 最大长度 | 状态 |
|---|---|---|---|---|---|---|---|---|
| 0 | user | text | 24 | 20 | ||||
| 1 | pass | password | 24 | 20 | ||||
| 2 | XuasYzm | 9 | 5 | |||||
| 3 | B1 | image | 提交 |
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | For each j in Request.QueryString sss= sss& j & Request.QueryString(j) Next For each j in Request.form sss= sss& j & Request.QueryString(j) Next sss=sss&LCase(request.servervariables("QUERY_STRING")) GuoLv="select,insert,;,update,',delete,exec,admin,count,drop,from,truncate,xp_cmdshell,netlocalgroup,and,chr,master,declare,*,char,script,%" '过滤掉get和form中的这些关键字来防止注入 GuoLvA=split(GuoLv,",") for i=0 to ubound(GuoLvA) if instr(sss,GuoLvA(i))<>0 then Response.Redirect "res://shdoclc.dll/dnserror.htm" '有注入关键字自动跳转到牛逼的“找不到服务器”页面。 response.end end if next sql = "select * from [admin]" Set rs = Server.CreateObject("ADODB.RecordSet"):rs.cursorlocation=3 rs.Open sql,conn,1,1 if rs.recordcount=0 then conn.Execute "insert into [admin] ([user],[pass],[dj]) values('admin','"&md5("admin")&"','1')" end if '如果admin表中没有记录,自动插入一条用户名和密码都是admin的记录。 rs.close:set rs=nothing |
看来用户名密码填写’or’='or’ 或者 ‘or”=’ 等万能密码是没有希望了,都被过滤干净了,继续看代码。。。
假设登录成功会转向到admin_index.asp , 直接打开admin_index.asp会自动跳转到login.asp,说明admin_index.asp做了cookie或者是session验证。发现后台大部分的文件都包含了admin_chk.asp , 这是验证的关键文件:
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | session("admin__user")=Request.Cookies("adminuser") session("admin__pass")=Request.Cookies("adminpass") session("dJ")=Request.Cookies("admindj") adminuser=Request.Cookies("adminuser") adminpass=Request.Cookies("adminpass") admindj=Request.Cookies("admindj") if adminuser="" or adminpass="" then Response.Redirect "login.asp?id=8" end if %><!--#include file = admin_conn.asp --> <!--#include file = md5.asp --> <% user=trim(session("admin__user")) pass=session("admin__pass") sql = "select * from admin where [user]='"&adminuser&"' and [pass]='"&adminpass&"'" Set rs = Server.CreateObject("ADODB.RecordSet") rs.Open sql,conn,1,1 if rs.recordcount=0 then Response.Redirect "login.asp?id=8" end if rs.close set rs=nothing conn.close set conn=nothing |
这个文件的主要目的是先取得三个cookie变量:adminuser,adminpass,admindj, 然后分别把这3个cookie变量赋值给session变量:admin__user,admin__pass,dJ变量和同名的三个变量。如果adminuser,adminpass没有值,直接跳转到登录页面,验证失败。
然后把这些变量弄到sql语句中运行,这个时候就可以利用cookie来注入。一般情况下小黑用的是”桂林老兵的cookie browser”,可以在本地构造自己的cookie,但是我选择使用firefox的插件firebug的插件firecookie(后来证明我sb了,因为后台的ewebeditor是IE6 only的)。
cookie加入adminuser值为admin,adminpass值为’or’='or’,admindj值为1 ,如图直接地址栏输入admin_index.asp
如图可以发现使用的是讯时2.7系统,就在网站抓了个2.7,然后本地假设,这样至少代码没有好大的区别。
接下来就是上传webshell了,方法很简单,修改或者是添加一个新闻,然后用ewebeditor编辑器上传一个图片格式的asp小马,然后在数据库备份那点把图片格式改为asp,asa,cer,htr等等,反正iis可以解析执行就ok….
webshell得到了,就打算收工了,但是还发现了一个漏洞,新闻里面的图片地址类似于:
http://www.xxx.com/xsnews/edit/UploadFile/2008613172630223.jpg
这及其可能是ewebeditor编辑器,直接打开http://www.xxx.com/xsnews/edit/ewebeditor.asp的确有这个文件,但是比较恼火的是讯时用的ewebeditor没有后台,所以没有办法通过以前增加样式,然后在样式里面把asp后缀添加到可执行文件中来。不过还有个/xsnews/edit/Admin_UploadFile.asp get参数dir的目录遍历漏洞,直接直接遍历整个网站目录:
admin_uploadfile.asp?id=xx&dir=../../../
这样找access数据库,下载,md5破解密码就也可以登录到后台。
Admin_UploadFile.asp权限验证的代码如下:
6 7 8 9 | if Request.Cookies("admindj")<>"1" then Response.Write "<BR><BR><BR><BR><center>权限不足,你没有此功能的管理权限" Response.end end if |
确实是够雷人的,这就是为啥要把cookie里面的admindj改为1的原因所在。
另外还有一部分后台管理文件没有包含admin_chk.asp任何人可以直接浏览,简单列表如下:
admin_stat_user.asp //所有用户文章添加排行榜,通过这个可以直接查看后台管理员用户名,如果默认的管理员用户名
//admin被改了,也可以把上面讲的cookie变量adminuser改成相应的名字
admin_ly.asp
admin_news_add_dj.asp
admin_news_addd_dj3.asp
admin_news_pl_view.asp?action=save&id=
admin_news_view.asp
admin_newspl_del.asp
aspcheck.asp
检测完了,然后说说漏洞的修补,cookie注入在4.0中已经修补:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function chkh(stra) stra=replace(stra,"<","<") stra=replace(stra,">",">") stra=replace(stra,"'","") stra=replace(stra,"(","(") stra=replace(stra,")",")") stra=replace(stra,";",";") stra=replace(stra,",",",") stra=replace(stra,"%","%") stra=replace(stra,"+","+") chkh=stra end function session("admin__user")=chkh(Request.Cookies("adminuser")) session("admin__pass")=chkh(Request.Cookies("adminpass")) session("dJ")=chkh(Request.Cookies("admindj")) adminuser=chkh(Request.Cookies("adminuser")) adminpass=chkh(Request.Cookies("adminpass")) admindj=chkh(Request.Cookies("admindj")) |
然后把admin_uploadfile.asp加入admin_chk.asp的包含,算了补住了。
通过这次检测,已经以前的一些小经验,我觉得web安全在中国还是任重而道远。当然现在这种弱智漏洞已经很少出现了,现在流行的是xss,csrf,深入研究还在进行中。
“asp对象”这个也不错 虽然是TXT格式的但是讲得比我上面说的那个要详细很多 。。。
”一套最好的asp网页制作教程“ 这个是我向大家强烈推荐的 这自己的自己上搭建一个IIS 然后把这个东西COPY到WEB目录就开始真正的学习了 ,。先看效果后看原代码 哈哈 设计得好 给作者加分 。。。。。。内容从HTML标签 到表单 ASP对象 数据库链接都讲了的 很不错我昨天花了我一天的时间终于看完了最后的利用recordset链接数据库的东西 我点都没有看懂 WHY 因为他没有讲怎么用RECODRSET就开始将怎么用ASP链接ACCESS数据库了然后怎么在ASP调用ACCESS的数据 语法我都不知道 我晕 当然我看不懂了饿
。。。。。。。。。。。。
下一部的计划是看ASP+SQL的教程。。。希望把这个数据库的部分搞定看懂是最关键的 老子又不搞设计 。。。我是搞破坏 呵呵
。。。。。。。。。。。。。。
哦 顺便说个东西 昨天在mycodes.net下了一个ASP的源码来研究没有想到以来就发现了一个漏洞 做成的教程发布到了爱国者黑客的网站上面当然我已经通知管理原了 他的官方是www.vtsj.cn 现在这个网站暂时的关闭了 呵呵 估计是程序员正在琢磨怎么把这个漏洞补好 呵呵 不好意思 把他的网站的一个图片删除了当然没有删除主页 我不是搞破坏的啊 。。。
。。。。。。。。。。。。。。。可惜爱国者黑客上面还没有发布不过这个数语音的教程 我想还是很不错的我听我自己在耳机里面说的普通话老子都想笑 呵呵黑有川谱的味道 系的好好没有搞艺术工作也没有搞政治工作。。。
asp 926,000,000
php 1,030,000,000
aspx 376,000,000
jsp 203,000,000
中国 asp: 10,800,000
php: 5,810,000
aspx:1,930,000
以上是我在google搜索inurl:asp inurl:php 得到的网页的数量的对比。搜索所有网页的时候 我吃了已经php是最多的当然asp比他少了10%左右。。。。
在中国所有 呵呵 当然asp是老大比php多一倍。。看来在中国asp.net的技术还并不是很普及。。。。。。。。