web脚本程序攻击的防范(2)
作者:lanker 来源:cnwill.com 时间:2007-10-18 13:29:00
要说COOKIES是容易忽略的地方,User-Agent 注入会另你意想不到,在HTTP1.1规范就定义了一个“User-Agent”头标,我们抓个包看看:
GET /bbsxp/images/skins/1/T_bg.gif HTTP/1.1
Accept: */*
Referer: http://localhost/bbsxp/Default.asp
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
Host: localhost
Connection: Keep-Alive
Cookie: eremite=0; member_id=1; pass_hash=5140c3b61780e904b05d44f8d3193564; skins=1; ASPSESSIONIDQADBTQQA=AGIPJKACPGNICLMHAFEOBHKA; username=lanker; userpass=E10ADC3949BA59ABBE56E057F20F883E; onlinetime=2003%2D7%2D9+22%3A20%3A13; addmin=10
“User-Agent”用来鉴别浏览器。你在这个字符串中经常可以看到“Mozilla”的一些表单。应用程序使用“User-Agent”字符串来适应浏览器的特殊性,可以允许你指定特殊的字符串这就给我们注射的机会。动网的 User-Agent 注入是最好的说明和实例了。不明白的朋友可以看看 “动网论坛DVBBS漏洞及入侵一则”和“深入分析DVBBS7 User-Agent注入”这两篇文章。这可能就属于他们所说的包注入了。
然而对与一些纯数字的过滤最好莫过于用脚本语言的本身函数:
比如 asp 脚本可以用 cint,clong,isNumeric 这样的过滤可以说是最严格的一种了。PHP脚本里可以用intval 这样的函数。
对于不能过滤“<”和“>”情况下跨站的脚本的防范手段是,将所有的尖扩号都转化成对应的HTML编码。对于“<”表示成“<” 对与“>” 表示成“>” 需要特别注意的是对于上面所有的输入过滤都要在服务端进行,客户端的所有验证都会等于徒劳无用,可以很轻松的绕过。
好了上面的已经过滤的差不多了,是不是现在就万事大吉了呢?答案是否定的,对于一些数字字段还有许多潜在的错误使用方法。即使我们限制了数据必须是数字的值,还是会引起一些错误,所以我们下面要做的是边界的检查,你不要小视边界检查哦,某些时候他会暴出你的绝对路径来地。
一般需要我们注意检查的有:布尔值,数字,和字符串的长度。
最后一个编写程序中注意的就是要有恰当的错误捕捉机制,无论采用什么样的语言编写程序,都应该有象C#,JAVA中的Try,Catch机智来捕获出错信息。对于程序遇到异常错误时能够正常终止运行。在出错的提示页中应该尽量不要包含系统的信息。
总结:上面是我个人在学习中总结的一些经验,希望能对编程人员编写安全健壮的代码有一定把帮助,如有错误的地方还请指教。