脚本攻击防范策略完全篇Word下载.docx
- 文档编号:19642128
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:15
- 大小:26.49KB
脚本攻击防范策略完全篇Word下载.docx
《脚本攻击防范策略完全篇Word下载.docx》由会员分享,可在线阅读,更多相关《脚本攻击防范策略完全篇Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
cmdshell'
exec@a'
dirc:
\'
---&
aid=9
得到了管理员的密码也就意味着已经控制的整站,虽然不一定能得到主机的权限,但也为这一步做了很大的铺垫。
类似的SQLInjection攻击的方式方法很多,对不同的文件过滤不严密所采取的查询方式也不同。
所以说想做好一个完整的字符过滤程序不下一凡功夫是不可能的。
4.远程注入攻击
某站点的所谓的过滤只是在提交表格页上进行简单的JS过滤。
对于一般的用户来说,你大可不必防范;
对早有预谋的攻击者来说,这样的过滤似乎根本没作用。
我们常说的POST攻击就是其中一例。
通过远程提交非法的信息以达到攻击目的。
通过上面的攻击方法的介绍,我们大致的了解了攻击者的攻击途径,下面我们就开始重点的介绍,如何有效的防范脚本攻击!
让我们还是从最简单的开始:
防范脚本攻击
JS脚本和HTML脚本攻击的防范其实很简单:
server.HTMLEncode(Str)完事。
当然你还不要大叫,怎么可能?
你让我把全站类似<
%=uid%>
都加过滤我还不累死?
为了方便的过滤,我们只需要将HTML脚本和JS脚本中的几个关键字符过滤掉就可以了:
程序体
(1)如下:
‘以下是过滤函数
<
%
functionCHK(fqyString)
fqyString=replace(fqyString,"
"
,"
)
&
#"
fqyString=Replace(fqyString,CHR(32),"
"
fqyString=Replace(fqyString,CHR(9),"
"
fqyString=Replace(fqyString,CHR(34),"
fqyString=Replace(fqyString,CHR(39),"
'
fqyString=Replace(fqyString,CHR(13),"
fqyString=Replace(fqyString,CHR(10)&
CHR(10),"
/P>
P>
fqyString=Replace(fqyString,CHR(10),"
BR>
CHK=fqyString
endfunction
%>
‘以下是应用实例
%=CHK(Username)%>
Username=CHK(replace(request("
username"
),"
,"
))
使用Include把函数写在公有页面上,这样效率是最好的。
程序体
(1)
另外,值得我们注意的是,很多站点在用户注册,或者是用户资料修改的页面上也缺少脚本的过滤,或者是只在其中之一进行过滤,注册进入后修改资料仍然可以进行脚本攻击。
对用户提交的数据进行检测和过滤,程序体
(2)如下:
IfInstr(request("
="
)>
0or
Instr(request("
%"
),chr(32))>
?
),chr(34))>
),chr(9))>
$"
0then
response.write"
朋友,你的提交用户名含有非法字符,请更改,谢谢合作 <
ahref='
****:
window.history.go(-1);
返回<
/a>
response.end
endif
程序体
(2)
为了提供工作效率我们再将过滤内容程序化,这样对多个参数的过滤效率将有很大程度上的提高:
如程序体(3)
‘以下为程序主体
dimBword(18)
Bword(0)="
Bword
(1)="
Bword
(2)="
Bword(3)="
Bword(4)="
-"
Bword(5)="
Bword(6)="
Bword(7)="
Bword(8)="
Bword(9)="
Bword(10)="
Bword(11)="
:
Bword(12)="
|"
Bword(13)="
("
Bword(14)="
)"
Bword(15)="
--"
Bword(16)="
chr(9)"
Bword(17)="
chr(34)"
Bword(18)="
chr(32)"
errc=false
‘以下是应用实例部分
fori=0toubound(Bword)
ifinstr(FQYs,Bword(i))<
errc=true
next
iferrcthen
scriptlanguage="
****"
parent.alert('
很抱歉!
您的操作违法了);
history,back();
/script>
程序体(3)
有了上面的过滤函数您可以在任何需要过滤的地方应用过滤函数直接使用就可以了。
这就使我们的修复工作大大的简化了。
另外,我想在这里再次多提醒一下,一些站点的UBB在进行小的表情图标转化时也会出现过滤问题,由于很隐蔽所以不容易发现:
如:
我们标签内的文字进行修改,
不知道各位看懂没,前一个单引号用来中和程序提供的左引号,第二个单引号用来中和闭合的右引号,这样程序输出就为:
<
imgsrc='
img/0001.gif'
onerror=****:
alt='
如果图片不存在,那么将激活onerror标签执行脚本程序。
对于已经过滤了单引号的站点在这里用双引号一样可以完成。
对于过滤了****字段的,只用alert()也完全可以。
所以说要过滤就要过滤完全,别给攻击者留下一丝机会。
防范SQLInjection漏洞攻击
可以这样说,这里似乎是整篇文章的重点了.SQLInjection漏洞攻击的的多样化也使得我们在程序防护上不得不想的更多一些。
面对SQLInjection的强大"
攻势"
,我们到底该过滤哪些?
一些常用的危险字符有
数据库字段判别封闭
--某些数据库注释标志
#某些数据库注释标志
"
可能导致程序出错
\跨越目录
3221143836nicode编码的特征字符
$可能用于变量标注
/和\一样
NULL小心"
空"
录入的危险,可能导致数据库或系统处理报错,利用报错构造溢出.
空格和'
一起,构造sqlinjeciton
?
=&
如果存在二次参数传递,可能改写querystr。
(1)从最一般的.SQLInjection漏洞攻击来看:
用户名和密码上的过滤问题,如:
提交:
用户名为:
or'
='
用户密码为:
从程序出发,我们完全可以得出,数据库在执行以下操作
Sql="
SELECT*FROMlUsersWHEREUsername='
andPassword='
这样一来,这样,SQL服务器将返回lUsers表格中的所有记录,而ASP脚本将会因此而误认为攻击者的输入符合lUsers表格中的第一条记录,从而允许攻击者以该用户的名义登入网站。
对此类注入的防范似乎简单的很:
利用以下程序就可以实现,程序体(4)
strUsername=Replace(Request.Form("
Username"
),"
strPassword=Replace(Request.Form("
Password"
程序体(4)
(2)杜绝SQL注入式攻击的第一步就是采用各种安全手段监控来自ASPrequest对象(Reques、Request.QueryString、Request.Form、Request.Cookies和Request.ServerVariables)的用户输入,以确保SQL指令的可靠性。
具体的安全手段根据你的DBMS而异。
SQL注入式攻击可能引起的危害取决于该网站的软件环境和配置。
当Web服务器以操作员(dbo)的身份访问数据库时,利用SQL注入式攻击就可能删除所有表格、创建新表格,等等。
当服务器以超级用户(sa)的身份访问数据库时,利用SQL注入式攻击就可能控制整个SQL服务器;
在某些配置下攻击者甚至可以自行创建用户帐号以完全操纵数据库所在的Windows服务器。
http:
declare@asysnameset@a='
--&
xp'
_cm'
+'
dshell'
甚至可以执行像:
netuserfqyfqy/add这样的指令.当然这就需要你当前的运行身份必须是Sa,或者你攻击的只是一台虚拟主机,我劝你还是就此打住.
对于一些整机使用的站点来说防止通过80端口攻击而直接拿到整机管理权限,这一点就变得至关重要了。
对xp_cmdshell的过滤就成为首要,很多站点的程序都是用GET或者是GET与POST混合来提交数据的,对于此,我们给出一种防止GET进行SQL注入的程序:
如程序体(5)
fqys=request.servervariables("
query_string"
dimnothis(18)
nothis(0)="
netuser"
nothis
(1)="
xp_cmdshell"
nothis
(2)="
/add"
nothis(3)="
exec%20master.dbo.xp_cmdshell"
nothis(4)="
netlocalgroupadministrators"
nothis(5)="
select"
nothis(6)="
count"
nothis(7)="
asc"
nothis(8)="
char"
nothis(9)="
mid"
nothis(10)="
nothis(11)="
nothis(12)="
nothis(13)="
insert"
nothis(14)="
delete"
nothis(15)="
drop"
nothis(16)="
truncate"
nothis(17)="
from"
nothis(18)="
fori=0toubound(nothis)
ifinstr(FQYs,nothis(i))<
你正在试图攻击本服务器或者想取得本服务器最高管理权!
将直接转向首页..'
);
self.location.href='
default.asp'
程序体(5)
我要做点声明的是:
以上的程序只是对GET方式提交的数据进行的过滤,千万不要盲目套用。
像其他一些来自ASPrequest对象(Reques、Request.QueryString、Request.Form、Request.Cookies和Request.ServerVariables)的用户输入的攻击方法的方法,大致都集中在脚本期望的输入变量是数字变量(ID)上,当然我们不能只看数字变量,比如:
//127.0.0.1/systembbs/showtopic.asp?
tid=99&
name=abc'
andleft(userpasswor
d,1)='
a
//127.0.0.1/systembbs/addtopic.asp?
anduserpasswor
d='
另外,如何单一的防止类似这样的注入错误?
tid=99'
;
deleteforum_forum;
page=33
防范程序:
程序体(6)
......addtopic.asp?
action=add......
action=delect......
Action1=trim(Request.QueryString())
ifleft(action1,7)<
action="
then'
限定querystring必须为action=
error(err01)'
错误处理
else
action=Request.querystring("
action"
)'
取得querystring的值
selectcaseaction'
对querystring进行处理
case"
add"
.....
......
caseelse'
如果querystring没有这个值则进行错误处理
error(err02)
endselect
程序体(6)
出现这样的攻击,使我们的站长们不得不又再次头痛,这里我可以给出大家一个解决最好办法,一般的来说,用户名长度字符数不会超过15个字符,大都为14字符。
那么我们从长度出发,来进行过滤:
如程序体(7)
Name=replace(name,"
Iflen(name)>
16then
Response.write"
你要做什么?
Response.end
Endif
程序体(7)
为什么我们这里以及过滤了单引号,怎么还要再次取一个长度限制呢?
不多说了,看看4ngel的文章先<
饶过'
限制继续射入>
.别问我怎么转数字格式,我不会,嘿嘿...^_^!
还继续回到我们的主题,"
脚本期望的输入变量是数字变量(ID)"
.怎样进行注入防范,天呐,方法太多了,最直接的就是判断是否是数字整型,还有一些比较个性的验证办法,我们一一介绍一下如:
程序体(8)
一,判断数字是否是整型
p_lngID=CLng(Request("
ID"
二取字长这一点我相信一般的数据长度不会大于8位所以:
Iflen(ID)>
8then
bedpost"
responseend
三我认为这是一种比较冒险的办法,就是再进行一次数据库的查询,如果数据库表内没有相同的值与之相同那么返回错误.
sql="
SELECTNAMEFROMCategorywhereID="
ID
settemp=conn.Execute(SQL)
iftemp.bofortemp.eofthen
response.Redirect("
index.asp"
cat_name=temp("
name"
settemp=nothing
‘上面的是数据ID的检测,下面则是正式的查询
SELECTIDT_ID,NAMEFROMCategorywhereID="
ID&
ORDERBYxhasc"
rs.opensql,conn,1,1
四,我自己常用的数据过滤脚本,专利,呵~
id=replace(id,"
Iflen(request("
id"
))>
8then‘为什么取长度上面程序中已经说明
老大,你说吧,你想干什么?
..'
history.back();
Ifrequest("
)<
then‘取不为空则是为了防止一些程序页中会出现空值情况,如果不在这里做判断,程序会校验出错.
IfIsNumeric(request("
))=Falsethen'
风清扬修改ID数据监控程式
错误的数据编号类型\n\n请返回校验'
由于我个人的编程习惯,我喜欢将所有的数据检验程序全部保留到整站的公用程序中,比如:
conn.asp啦,只需要写一次就可以修复全站的问题.
说到这里,我提一点关于攻击的问题,就是跑用户密码或者是用户名,一般常用的就是
....../show.asp?
id=1and0<
(selectcount(*)fromadminwhereid=3andleft(username,1)='
a'
这样去一个一个尝试,当然我们不能在这里提什么Perl程序去跑密码,程序是别人写,要自己知道原理.这里我只是想给个比较方便的办法就是取ASC码范围.这个要比单独跑要快很多.不论是是字母,数字,汉字,特殊字符,他们总会有对应的ASC码,用以下办法:
(selectcount(*)fromadminwhereid=3andasc(right(left(username
e,3),1))between1and10000)剩下的就随你了,一般的从97到122就可以啦,字母嘛,很快D.呵呵,有人想用mid函数当然也是不错asc(mid(username,2,1))between1and10000也成.
如何更加有效的防止SQL注入攻击?
我们将在下面的文章中具体提到!
防范远程注入攻击
这类攻击在以前应该是比较常见的攻击方式,比如POST攻击,攻击者可以随便的改变要提交的数据值已达到攻击目的.又如:
COOKIES的伪造,这一点更值得引起程序编写者或站长的注意,不要使用COOKIES来做为用户验证的方式,否则你和把钥匙留给贼是同一个道理.
比如:
Iftrim(Request.cookies("
uname"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 脚本 攻击 防范 策略 完全