ASP防暴防注入相关

SQL注入就是通过巧妙插入SQL代码,让系统执行,
从得到的结果来一步步解开破解信息。
而这个代码,只要是交互的地方都有可能被插入。
例如字符串传递:XXX.asp?id=****,或者在用户名输入框,或者搜索框
因此,我们只要保证所插入的信息没有SQL代码就可以了。
例如,用户登录程序中,我们只要把
username=request.Form("username")
修改为 username=trim(request.Form("username"))
也就是去掉空格,这样SQL代码就没法用,
就基本可以防范从用户登录界面进行SQL注入了。
但是还不够,因为空格可以用unicode码代替,
所以我们还要把unicode特有的字符%替换掉,就没问题了。
对于从字符串传递的参数,我们也可以同样处理,
用trim()去除空格,然后用replace替换% 。
这样还不够,还应再把( )小括号替换掉,把单引号'替换掉。
如果是id之类纯数字,还应在用cint()强制转为数字,
如果不是数字就会在这一步出错。
只要网站有输入的地方,而且这个输入的地方会被诸如:
sql="select * from asdf where id="&id
这样的语句执行,就必须防范SQL注入。
Access+asp除了防范SQL注入,还要防范暴库,
也就是被黑客用一些语句判断出你数据库地址,把整个数据库下载下来。

防止数据库被下载,你可以在数据库里面新建一个表,
表里面输入一个文本内容为<%asdfasdfasdf%>随便输,
反正只要不能被执行就可以了。然后把数据库改名为.asp后缀。
这样对方试图下载的时候就会提示:
asp解析出错,第XX行。这样就不用怕暴库了。
此外配置mdb文件解析对应,配置数据池等等方法
都可以比较有效的防止暴库。
我觉着在数据库文件名开头加上#也很管用,又省心,大推荐。

## 附一个防止SQL注入的文件 ##
在CONN.ASP开头写上<!--#include file="sql.asp" -->就可以了。
这个也很简单,但愿管用!

<%
Dim Query_Badword,Form_Badword,Err_Message,Err_Web,form_name

'------定义部份 头----------------------------------------------------------------------

Err_Message = 3     '处理方式:1=提示信息,2=转向页面,3=先提示再转向

Err_Web = "index.Asp"   '出错时转向的页面

Query_Badword="'∥and∥select∥update∥chr∥delete∥%20from∥;∥insert∥mid∥master.∥set∥chr(37)"    

'在这部份定义get非法参数,使用"∥"号间隔    

Form_Badword="'∥%∥&∥*∥#∥(∥)∥select∥and∥set∥delete" 
'在这部份定义post非法参数,使用"∥"号间隔
'Form_Badword="'∥%∥&∥*∥#∥(∥)∥=∥select∥and∥set∥delete"

'------定义部份 尾-----------------------------------------------------------------------
'

On Error Resume Next

'----- 对 get query 值 的过滤.

if request.QueryString<>"" then
Chk_badword=split(Query_Badword,"∥")
FOR EACH Query_form_name IN Request.QueryString
for i=0 to ubound(Chk_badword)
If Instr(LCase(request.QueryString(Query_form_name)),Chk_badword(i))<>0
Then Select Case Err_Message
Case "1"
Response.Write "<Script Language=JavaScript>alert
('含有非法字符,请重新检查输入!');
window.close();</Script>"
Case "2"
Response.Write "<Script Language=JavaScript>location.href='"&Err_Web&"'</Script>"
Case "3"
Response.Write "<Script Language=JavaScript>alert
('含有非法字符,请重新检查输入!');
location.href='"&Err_Web&"';</Script>"
End Select
Response.End
End If
NEXT
NEXT
End if

'-----对 post 表 单值的过滤.

if request.form<>"" then
Chk_badword=split(Form_Badword,"∥")
FOR EACH form_name IN Request.Form
for i=0 to ubound(Chk_badword)
If Instr(LCase(request.form(form_name)),Chk_badword(i))<>0 Then
Select Case Err_Message
Case "1"
Response.Write "<Script Language=JavaScript>alert
('含有非法字符,请重新检查输入!');
window.close();</Script>"
Case "2"
Response.Write "<Script Language=JavaScript>location.href='"&Err_Web&"'</Script>"
Case "3"
Response.Write "<Script Language=JavaScript>alert
('含有非法字符,请重新检查输入!');
location.href='"&Err_Web&"';</Script>"
End Select
Response.End
End If
NEXT
NEXT
end if
%>

 

另一防注代码:

SQL_injdata =":|;|>|<|--|sp_|xp_|\|dir|cmd|^|(|)|+|$|'|copy|format|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"

SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write "SQL Error"
Response.end
end if
next
Next
End If

If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
Response.Write "SQL Error"
Response.end
end if
next
next
end if

 

=====另========

如何防止网页被修改加入脚本病毒? 现将这个问题总结分享一下.

1、简单的补救措施:在服务器IIS中,把所有的ASP,HTML文件的属性设置为Everyone只读(一般是IUSR_),只把数据库的权限设置成可写, 注意:如果你没有服务器的管理权限,那么登录上的空间ftp,选中那些不需要写入的文件或文件夹,右键点击-属性:把其中的三组写入权限都取消,但如果你有ACCESS数据库,要把数据库设成可写,不然读数据时会出错。

2、先把恶意代码删掉(替换掉),然后把网站目录下的所有文件全部用杀软杀下 ,然后一个一个检查下是否存在后门.

3、在你的程序里写上以下防注入函数

on error resume next   '这行代码放到conn.asp的第一行。

'防止注入
dim qs,errc,iii
qs=request.servervariables("query_string")
'response.write(qs)
dim deStr(18)
deStr(0)="net user"
deStr(1)="xp_cmdshell"
deStr(2)="/add"
deStr(3)="exec%20master.dbo.xp_cmdshell"
deStr(4)="net localgroup administrators"
deStr(5)="select"
deStr(6)="count"
deStr(7)="asc"
deStr(8)="char"
deStr(9)="mid"
deStr(10)="'"
deStr(11)=":"
deStr(12)=""""
deStr(13)="insert"
deStr(14)="delete"
deStr(15)="drop"
deStr(16)="truncate"
deStr(17)="from"
deStr(18)="%"
errc=false
for iii= 0 to ubound(deStr)
if instr(qs,deStr(iii))<>0 then
errc=true
end if
next
if errc then
Response.Write("对不起,非法URL地址请求!")
response.end
end if


4、在文件中<head></head>加入

<script language="javascript">
<!--
 if (top.location != location) top.location.href = location.href;
//-->
</script>

====================== 以下为摘录======================

网页防篡改

一,Stream开关可自由设置,ASP中的ADODB.Stream 对象用来操作二进制或文本数据的流。通常用于无组件上传和验证码等功能。关闭该组件可以提高网站安全。 Fso开关也可自由设置,FSO(FileSystemObject)是微软ASP的一个对文件操作的控件,该控件可以对服务器进行读取、新建、修改、删除目录以及文件的操作。关闭该组件有利于提高网站安全。

二,假设网站建好后,今后一段时间都不会再用到ftp上传功能,这时可以暂时关闭FTP上传,有助于提高网站的安全,即使ftp密码泄露,黑客也不能操作空间内的文件,设置后60秒后生效。

三,另外还可设置脚本权限与写入权限,如果网站只使用了asp,可设置为只开放asp权限。这样黑客即使上传了php的木马到空间也不能运行,最少的权限=最大的安全。写入权限设置则系统支持全国领先的目录权限设置,允许关闭网站的写入权限,锁定虚拟主机。对安全有重要意义,例如可以将access数据库放在databases目录,而将wwwroot目录的写入权限关闭,令asp木马根本无法上传,这样比关闭FSO更安全。

 

 

======再一个=============

 ASP防注入漏洞方法

  在做安全配置前,我们先了解一下入侵者的攻击手法。现在很流行注入攻击,所谓注入攻击,就是利用提交特殊地址将ASP中引用的正常SQL语句和入侵者所需要的SQL语句一并执行,使入侵者达到入侵的目的。现在更是有一些脚本注入工具发布,使菜鸟也可以轻松完成对ASP的注入攻击。那么我们先来了解一下这些工具是怎样注入的。
首先,入侵者会对一个网站确定可不可以进行注入,假设一篇文章的地址为:http://www.scccn.com/news.asp?id=1一般会以提交两个地址来测试,如:
http://www.scccn.com/news.asp?id=1 and 1=1
http://www.scccn.com/news.asp?id=1 and 1=2
第一个地址后面加了 and 1=1,构成的SQL语句也就变为了:Select * from 表单名 where id=1 and 1=1这句话要成立就必须and前后语句都成立。那么前面的文章地址是可以访问的,后面的1=1也是客观成立的,那么第一个地址就可以正常显示;相反1=2是显然不成立的,关键就看这步了,如果提交and 1=2页面还是正常显示说明他并没有将and 1=2写入SQL语句,此站也就不存在注入漏洞;但如果提交and 1=2之后返回了错误页面则说明此站点将后面的语句带入了SQL语句并执行了,也就说明他可以进行SQL注入。(注:如果地址后面跟的是news.asp?id='1'就得变为news.asp?id=1' and '1'='1来补全引号了)
    那么,知道可以注入后入侵者可以做什么呢?
    这里就简单的说一下,比如提交这样的地址:
http://www.scccn.com/news.asp?id=1 and exists (select * from 表名 where 列名=数据)
根据返回的正确或错误页面来判断猜的表名和列名是否正确,具体实现时是先猜表名再猜列名。当猜出表名和列名之后还可以用ASC和MID函数来猜出各列的数据。MID函数的格式为:mid(变量名,第几个字符开始读取,读取几个字符),比如:mid(pwd,1,2)就可以从变量pwd中的第一位开始读取两位的字符。ASC函数的格式为:ASC("字符串"),如:asc("a")就可以读出字母a的ASCII码了。那么实际应用的时候就可以写为:asc(mid(pwd,1,1))这样读取的就是pwd列的第一个字符的ASCII码,提交: asc(mid(pwd,1,1))>97以返回的页面是否为正确页面来判断pwd列的第一个字符的ASCII码是否大于97(a的ASCII码),如果正确就再试是否小于122(z的ASCII码)……这样慢慢缩小字符的ASCII码的范围,猜到真实的ASCII码也只是时间的问题。一位一位的猜就可以得到数据库中的用户名和密码了。还有一种ASP验证缺陷——就是用户名和密码都输'or '1'='1,构造SQL语句Select * form 表单名 where username='' or '1'='1' and pwd='' or '1'='1'就可以达到绕过密码验证的目的。
    说了那么多,其实防范的方法很简单,我们把特殊字符(如and、or、'、")都禁止提交就可以防止注入了。ASP传输数据分为get和post两种,    get是通过将数据添加到URL后提交的方式,post则是利用邮寄信息数据字段将数据传送到服务器。
那么,我们先来看看如何将get方式提交数据中的特殊字符过滤。首先要知道,IIS是以字符串的形式将get请求传给asp.dll的,在将数据传递给Request.QueryString之后,asp解析器会解析出Request.QueryString的信息,然后跟据"&"来分出各个数组内的数据。现在我们要让get方式不能提交以下字符:
'、and、exec、insert、select、delete、update、count、*、%、chr、mid、master、truncate、char、declare

    SQL通用防注入程序是由火狐的枫知秋编写的,功能相当完善的防注入代码。它能对定义的过滤字符实现get提交的过滤,并能记录攻击者的IP提交的数据信息。使用时只须在要防注入的文件头中加入代码<!--#Include File="WrSky_Sql.Asp"-->可以实现对变量的过滤。如果在数据库连接文件(如conn.asp)后加入程序代码,则可以实现整站的变量过滤,从而达到防注入的效果。

<%
dim sql_leach,sql_leach_0,Sql_DATA,SQL_Get,Sql_Post
sql_leach = "',and,exec,insert,select,delete,update,count,*,%,chr,mid,master,truncate,char,declare"
sql_leach_0 = split(sql_leach,",")

If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(sql_leach_0)
if instr(Request.QueryString(SQL_Get),sql_leach_0(Sql_DATA))>0 Then
Response.Write "请不要尝试进行SQL注入!"
Response.end
end if
next
Next
End If


If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(sql_leach_0)
if instr(Request.Form(Sql_Post),sql_leach_0(Sql_DATA))>0 Then
Response.Write "请不要尝试进行SQL注入!"
Response.end
end if
next
next
end if
%>


    防止暴库的办法,在数据库文件前面加上On Error Resume Next

<%
On Error Resume Next
dim conn,connstr,db
            
%>.

 


 

本博客所有文章如无特别注明均为原创。作者:ok12复制或转载请以超链接形式注明转自 成功志
原文地址《ASP防暴防注入相关
分享到:更多

相关推荐

发表评论

路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交

网友评论(0)