??xml version="1.0" encoding="utf-8" standalone="yes"?>
http://www.scccn.com/news.asp?id=1 and 1=1
http://www.scccn.com/news.asp?id=1 and 1=2
W一个地址后面加了 and 1=1Q构成的SQL语句也就变ؓ了:Select * from 表单名 where id=1 and 1=1q句话要成立必and前后语句都成立。那么前面的文章地址是可以访问的Q后面的1=1也是客观成立的,那么W一个地址可以正常显C;相反1=2是显然不成立的,关键qq步了,如果提交and 1=2面q是正常昄说明他ƈ没有and 1=2写入SQL语句Q此站也׃存在注入漏洞Q但如果提交and 1=2之后q回了错误页面则说明此站点将后面的语句带入了SQL语句q执行了Q也p明他可以q行SQL注入。(注:如果地址后面跟的是news.asp?id='1'得变ؓnews.asp?id=1' and '1'='1来补全引号了Q?br /> 那么Q知道可以注入后入R者可以做什么呢Q?br /> q里q单的说一下,比如提交q样的地址Q?br />http://www.scccn.com/news.asp?id=1 and exists (select * from 表名 where 列名=数据)
Ҏq回的正或错误面来判断猜的表名和列名是否正确Q具体实现时是先猜表名再猜列名。当猜出表名和列名之后还可以用ASC和MID函数来猜出各列的数据。MID函数的格式ؓQmid(变量?W几个字W开始读?d几个字符)Q比如:mid(pwd,1,2)可以从变量pwd中的W一位开始读取两位的字符。ASC函数的格式ؓQASCQ?字符?Q,如:asc("a")可以读出字母a的ASCII码了。那么实际应用的时候就可以写ؓQasc(mid(pwd,1,1))q样d的就是pwd列的W一个字W的ASCII码,提交Q asc(mid(pwd,1,1))>97以返回的面是否为正页面来判断pwd列的W一个字W的ASCII码是否大?7Qa的ASCII码)Q如果正就再试是否于122Qz的ASCII码)……这h慢羃字W的ASCII码的范围Q猜到真实的ASCII码也只是旉的问题。一位一位的猜就可以得到数据库中的用户名和密码了。还有一UASP验证~陷——就是用户名和密码都?or '1'='1Q构造SQL语句Select * form 表单名 where username='' or '1'='1' and pwd='' or '1'='1'可以达到绕q密码验证的目的?br /> 说了那么多,其实防范的方法很单,我们把特D字W(如and、or??Q都止提交可以防止注入了。ASP传输数据分ؓget和post两种Q get是通过数据添加到URL后提交的方式Qpost则是利用邮寄信息数据字段数据传送到服务器?br />那么Q我们先来看看如何将get方式提交数据中的Ҏ字符qo。首先要知道QIIS是以字符串的形式geth传给asp.dll的,在将数据传递给Request.QueryString之后Qasp解析器会解析出Request.QueryString的信息,然后跟据"&"来分出各个数l内的数据。现在我们要让get方式不能提交以下字符Q?br />'、and、exec、insert、select、delete、update、count??、chr、mid、master、truncate、char、declare
那么Q防止get方式注入的代码就如下Q?br /><%
dim sql_leach,sql_leach_0,Sql_DATA
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注入Q?
Response.end
end if
next
Next
End If
%>
其中Q变量sql_leach中的字符串就是指定过滤的字符Q以","隔开?br /> 接着qopost提交方式的注入,我们可以看到Qrequest.form也是以数lŞ式存在的Q只要对它再q行一ơ@环判断就可以了。防止以post方式注入的ASP代码如下Q?br /><%
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注入Q?
Response.end
end if
next
next
end if
%>
q样Qget和post注入都被止了?br /> 另外是数据库的问题Q首先现在很行的用*.asp命名数据库已l没什么意义了Q因为可以用下蝲软g来下载;在数据库名前?的作用也不大Q虽然访问时览器只讉K#前面的内容,但是如果?用其unicode表达法(%23Q替换掉可以访问了。既然这P那么我们止入R者暴库就可以了。一般暴数据库的ҎQ是读取数据库的文件名Q如conn.aspQ前?/"替换?%5c"Q?\"的unicode表达法)q样可以ASP?5c解释问网站根目录Q而实际是数据库不在指定位|,找不到数据库Q再IE讄?昄友好的HTTP错误信息"的情况下自然暴Z数据库的路径?br /> 防范的方法也比较单,是让ASPE序即在出错的情况下也不报错直接执行下一步就可以了。在ASP的conn文g中加q么一句:on error resume nextOK了?br />q有几点要注意的Q?br />1.数据库命名长些ƈ量攑֜|站根目录下Q数据库的表名和字段名尽量不合常规;2.保存敏感信息Q如用户和密码)的数据库量和在前台面引用的数据库分开Q如果用新的暴库Ҏ由前台页面暴Z数据库,那么入R者也得不到有价值的信息Q;3.后台的目录名和登陆页面的名字要改的不d些,千万不可出现admin或者login之类的字W,以免被注入Y件扫描到后台?.如果前台或后台有上传文g的功能,切记不能有Q何其他功能直接的或间接的拥有更改文g名的权限。这L多重保障更加安全些了?br />
]]>
<%
sql="select top 5 * from release where pid="&shengid&" and showflag=1 order by id desc "
set getnews=server.createobject("adodb.recordset")
getnews.open sql,strconn,3
%>
<table width=98% cellspacing=0 cellpadding=4 height=160 class=<%=getcss("p1c3table")%>1 bordercolor=<%=getcss("p1c3tablecolor")%>>
<tr>
<td>
<marquee name='mymarquee' height=160 behavior=scroll direction=up scrollamount=2 scrolldelay=120 onmouseover='this.stop()' onmouseout='this.start()'>
<%
do while not getnews.eof %>
<p>
<img src=images/1.gif>
<a href=page3.asp?id=<%=getnews("id")%>&menustyle=release&ctype=1&sname=<%=request("sname")%> target=_blank >
<font color=black><%=getnews("title")%></font><font color=gray>(<%=ymd(getnews("pubtime"))%>)</font>
</a>
</p>
<%getnews.movenext
loop
set getnews=nothing
%>
</marquee>
</td>
</tr>
</table>
横向Q如新浪的新?动态的。)Q?
<table>
<tr ><td>
<marquee name='mymarquee' behavior=scroll direction=left height=10 scrollamount=2 scrolldelay=120 onmouseover='this.stop()' onmouseout='this.start()'>
<font color=<%=getcss("marqueeword")%>><%=date%> <% = Session("UserName") %> 您好Q?lt;/font>
<% do while not getm.eof %>
<a href=page3.asp?menustyle=release&id=<%=getm("id")%>&sname=<%=request("sname")%> target=_blank>
<font color=<%=getcss("marqueeword")%>><%=getm("title")%></font>
</a>
<%
getm.movenext
loop
set getm=nothing
%>
</marquee>
</td>
</tr>
</table>
]]>
<% set rs=server.createobject("adodb.recordset")
sql="select category.categoryid as id,category.categoryname as cname,classid,classname,classnumber from category,class where category.categoryid=class.categoryid order by category.sortnumber "
rs.open sql,conn,1,1
i=0
while not rs.eof
if i mod 3=0 then%>
<TR>
<%end if
id=rs("id")
id1=rs("id") %>
<TD vAlign=top>
<TABLE >
<tr>
<Td <%=trim(rs("cname"))%></A>
</Td>
</tr>
<tr>
<td>
<TABLE >
<%while not rs.eof and id1=id%>
<TR>
<TD >
<%=rs("classname")%></TD>
</TR>
<% rs.movenext
if not rs.eof then
id1=rs("id")
end if
wend%>
</TABLE>
</TD>
</TR>
</TABLE>
</TD>
<% i=i+1
if i mod 3=0 then%>
</TR>
<%end if
wend%>