asp防注入安全问题
一、古老的绕验证漏洞
虽然古老,依然存在于很多小程序之中,比如一些企业网站的后台,简单谈谈。这个漏洞出现在没有对接受的变量进行过滤,带入数据库判断查询时,造成SQL语句的逻辑问题。例如以下代码存在问题:
username=request("username")
password=request("password")
sql = "select * from user where username='" & username & "' and password='" & password & "'"
很容易看出在没有对username、password进行过滤就带入SQL语句进行判断了,提交'or''=',SQL语句就变成了select * from user where username=''or''='' and password=''or''='',返回值为ture。
一般在登录处过滤字符,代码如下:
replace(request.form("username"),"'","")
replace(request.form("password"),"'","")
上面指定了POST方式接受提交过来的数据,指定接受方式很重要,下面谈谈。
二、指定接受数据提交方式
ASP中的Request对象可以接受GET、POST、COOKIES请求。将其简化写成**=Request("参数")的格式接受数据,此时WEB接受数据时先以GET方式接受,如果不匹配再以POST方式接受,最后再以Cookies方式接受。也就是Cookies注射造成的原因。
指定接受方式不仅可以避免Cookies注射,还可以提高WEB处理的速度。
一个存在问题的代码如下:
id=request("id")
sql="select * from Articles where id="&id&""
set rs=conn.execute(sql)
这里不管id过滤没有过滤,关键是id接受时没有指定接受方式,造成了Cookies注射。
这样写:
id=request.QueryString("id")
sql="select * from Articles where id="&id&""
set rs=conn.execute(sql)
id使用了get方式接受数据。
三、HtmlEnCode
HtmlEnCode是ASP中Server的一个对象,可以直接格式化HTML不被执行在浏览器上,比如以下代码:
<%
lx="<script>alert('test')</script>"
response.write lx
%>
最后浏览时弹出提示窗口。
如果改成以下代码:
<%
lx="<script>alert('test')</script>"
lx=Server.HtmlEncode(lx)
response.write lx
%>
浏览器直接显示<script>alert('test')</script>,HTML代码直接被格式化了。
这个对象很有用,一般在接受数据不需要使用HTML代码格式的情况下,直接使用它进行过滤。比如搜索结果显示、留言板等等。如:
test=request.QueryString("test")
response.write test
以上代码中,test没有进行过滤直接显示了,如果test接受一个内容为<script>alert("test")</script>时,代码被执行,就会弹出一个内容为test的提示。
改写为下:
test=server.htmlencode(request.QueryString("test"))
response.write test
那么再次提交<script>alert("test")</script>,浏览器就显示一段字符"<script>alert("test")</script>".
四、注射漏洞
注射方面就不多介绍了,介绍起来太多了,大家也很熟悉,直接说防范方法,有问题的代码如下:
id=request("id")
sql="select * from Articles where id="&id&""
set rs=conn.execute(sql)
明显id不进行过滤带入了SQL查询,最简单的方法就是判断id是否为整型数据,代码如下:
id=Request("id")
if Not IsNumeric(id) then '这里用IsNumeric判断id是否为整型
Response.write "错误提交"
Response.end
else
sql="select * from Articles where id="&id&""
set rs=conn.execute(sql)
end if
还可以使用判断提交内容是否含有非法字符,直接贴代码,代码是以前小蓝的Tryaspwebsystem程序中的防注射代码,经过我们两个改了又改:
<%
dim sql_injdata
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
SQL_inj = split(SQL_Injdata,"|")
'get拦截
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr(LCase(Request.QueryString(SQL_Get)),Sql_Inj(Sql_DATA))>0 Then
Response.Write "非法提交"
Response.end
end if
next
Next
End If
'post注入拦截 If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
if instr(LCase(Request.Form(Sql_Post)),Sql_Inj(Sql_DATA))>0 Then
Response.Write "非法提交"
Response.end
end if
next
next
end if
on error resume next
%>
上面代码中没有看到防范Cookies注射的?前面说了,指定了接受方式就没问题了。
五、字符过滤
一般用来防止跨站,定义一个结构,将非法的字符全部替换了:
function Str( data )
Str = replace( data, "'", "''" )
Str = replace( Str, "&", "&" )
Str = replace( Str, " ", " " )
Str = replace( Str, "<", "<" )
Str = replace( Str, ">", ">" )
Str = replace( Str, VbCr, "<br>" )
Str = replace( Str, "'", "'" )
Str = replace( Str, CHR(34), """ )
end function
直接用str(request("*"))的方法调用过滤。
如果要还原为正常显示,代码如下:
function Str1(data)
Str1 = replace( data, "'", "''" )
Str1 = replace( Str1, "&", "&" )
Str1 = replace( Str1, " ", " " )
Str1 = replace( Str1, "<", "<" )
Str1 = replace( Str1, ">", ">" )
Str1 = replace( Str1, "<br>",VbCr )
Str1 = replace( Str1, "'","'" )
end function
六、数据库防下载:
只要将数据库的扩展名删除,就可以做到防下载了。大
都知道IIS里有个默认文档,当用户浏览网站主页或者网站目录时,首先浏览的就是这默认文档,一般为 index.htm、index.asp等等。如果删除了扩展名,那么直接提交数据库地址时,就会被误认为浏览目录,但这个目录并非存在,所以404错误,返回找不到该页。举例:假设我们取数据库名为"luanx"(没有扩展名),然后通过访问地址,因为此目录不存在而找不到(测试环境是Windows XP/2003,IIS 5.0/6.0,FAT32/NTFS的硬盘)。此方法只用于Windows 2003的服务器,XP下还是能下载,不过没几个人用XP架设服务器的。
七、暴库防范
暴库这个大家都知道,在数据库连接文件中加入一句错误处理就可以了:on error resume next
八、上传漏洞防范
直接使用lcase函数,该函数从右截取指定个数的字符串,截取后进行判断。关于上传漏洞不建议过滤扩展名,而是直接判断是否为指定的扩展名,代码如下:
file=lcase(right(file.filename,4))
if file<>"" then
response.write "文件格式不对" response.end
end if
九、User-agent的安全
可以直接参考http://hi.baidu.com/bbs171/blog/item/6438e8b557f4bcc536d3ca4a.html
加上这一点注意的目的是想让大家感受到任何输入、输出都不是可信任的。
十、杂七杂八
除了以上,还要注意一些问题:
1、后台路径更改。
2、密码用MD5加密。
3、数据库表段不要用一些常见的,容易被猜出来。
4、任何数据库名都要修改,特别是一些编辑器或者网上下的第三方面程序加入在自己程序中的。
5、别被社工就OK了。
asp防注入安全问题的更多相关文章
- ASP防注入
因为在改进公司的一套ASP代码,所以考虑了一下防注入的问题. 参考了网上的几处代码,进行了修改和整合,都转换成小写再处理. 还考虑了script注入. 代码如下: 'Asp防注入代码 SQL_injd ...
- SQL防注入程序 v1.0
/// ***************C#版SQL防注入程序 v1.0************ /// *使用方法: /// 一.整站防注入(推荐) /// 在Global.asax.cs中查找App ...
- sql 防注入 维基百科
http://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A SQL攻击(SQL inj ...
- php之防注入程序绕过浅谈
<?php/*判断传递的变量是否含有非法字符如:$_POST/$_GET功能:SQL防注入系统*/ //屏蔽错误提示error_reporting(7); //需要过滤的字符 $ArrFiltr ...
- 简单实用的PHP防注入类实例
这篇文章主要介绍了简单实用的PHP防注入类实例,以两个简单的防注入类为例介绍了PHP防注入的原理与技巧,对网站安全建设来说非常具有实用价值,需要的朋友可以参考下 本文实例讲述了简单实用的PHP防注 ...
- [转]PDO防注入原理分析以及使用PDO的注意事项
原文:http://zhangxugg-163-com.iteye.com/blog/1835721 好文章不得不转. 我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答 ...
- SQL防注入程序
1.在Global.asax.cs中写入: protected void Application_BeginRequest(Object sender,EventArgs e){ SqlIn ...
- PDO防注入原理分析以及使用PDO的注意事项
我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下两个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...
- php防注入留言板(simple)
新手学php,试手案例便是留言板.以前未连接数据库时,我是直接将用户输入的留言写入到一个txt,然后再从txt读取显示(~.~别鄙视). 最近学习了php访问MySQL数据库的一些知识,重写了一下留言 ...
随机推荐
- money 转换成 varchar
Sql :cast(sum(colname) as varchar) 或者 convert(varchar,sum(colname)) ),sum(colname))
- Android之进度条1
第一种方法(比较简单): package com.example.dialogdemo; import java.util.Random; import android.app.Activity; i ...
- Hibernate+DWR无刷新三级联动
DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在 ...
- js cookie使用方法详解
代码如下 复制代码 <script>function getCookie(c_name){ if (document.cookie.length>0){ //先查询cookie是否为 ...
- UMeng 友盟的用户数,启动数 等
最近一哥们研究UMeng 友盟的用户数,启动数,设备和位置相关数据,发现真的可以模拟啊. 支持Android,IOS,WPhone平台,同时可以实现每小时按10万级的速度增加,启动次数也是可以按10万 ...
- Factory Method模式
Factory Method(工厂方法)模式属于GoF设计模式中的创建型分组,它用于在不之制定待创建对象的具体类的情况下创建对象.--<asp.net设计模式> 说白了就是一个人想要出国旅 ...
- OpenCV3添加滑动条和鼠标事件到图形界面
鼠标事件和滑动条控制在计算机视觉和OpenCV中非常有用,使用这些控件,用户可以直接与图形界面交互,改变输入图像或者变量的属性值. /* In this section, we are going t ...
- discuz管理中心无法登陆
检查下配置文件,当前管理是不是创始人. 如是,那试下修改数据库,在数据表出错时也会这样,还有一个也同时试下 \config\config_global.php 文件 $_config['admincp ...
- 操作xml文档的常用方式
1.操作XML文档的两种常用方式: 1)使用XmlReader类和XmlWriter类操作 XmlReader是基于数据流的,占用极少的内存,是只读方式的,所以速度极快.只能采用遍历的模式查找数据节点 ...
- php常量运用注意
多个文件引入,常量重复定义会失效,后者无法重复定义...靠