作为一名网站开发人员,不管是自己为公司网站编写代码,还是维护公共网站,都时刻面临着一项极其重要的任务 —— 网站的安全保障。无疑,细心地编写无漏洞代码是前提,但是,对于今天的黑客来说,发现漏洞是手到擒来的事情,因此探究漏洞,一旦发现,也能针对性地修复问题。
那么,如何突破常规思维,发现更多可能的漏洞呢?这时,看看一些网站的asp源代码,可以给我们提供一些思路和启示。
asp源代码,即Active Server Pages的源代码。asp界面灵活、易于学习,极其适合新手进行网站开发操作。但是,究竟隐藏了多少漏洞?我们来看看下面的示例。
首先是ASP的一些基本操作。下面是一个登陆代码的例子,其中,用户名和密码由客户端提交,后台与数据库中存储的信息对比,如果相同,即代表登陆成功:
```
<%
name=Request.Form("name")
pwd=Request.Form("pwd")
set conn=Server.CreateObject("ADODB.Connection")
conn.ConnectionString="DRIVER=Microsoft Access Driver (*.mdb);DBQ="&Server.MapPath("test.mdb")
conn.open
set rs=Server.CreateObject("ADODB.recordset")
rs.CursorType=3
rs.locktype=3
sql="select * from user where name='"& name & "' and pwd='"& pwd & "'"
rs.open sql,conn
if rs.EOF then
response.write("用户名或密码错误!")
else
Session("user")=rs("id")
response.redirect("default.asp")
end if
rs.close
Set rs = nothing
set conn=nothing
%>
```
在这段代码中,我们可以看到后台的数据库连接方式,以及用于登陆的session验证。但是,仔细看代码,发现在用户名和密码比对的过程中,出现了诸如 `'`、`"`等特殊字符,并未做特殊处理,这就给黑客留下了攻击空间。因此,可以通过构造特殊字符,打破登陆的限制,实现一些危害性行为。
而在ASP中,除了登陆,还有很多常见的操作,比如搜索功能。在ASP中,搜索常常涉及到 SQL 语句的使用,那么,无论是 SQL 注入,还是 XSS 攻击,都会在其中留下漏洞。下面是一个搜索代码的例子:
```
<%
keyword=Request.Querystring("keyword")
set conn=Server.CreateObject("ADODB.Connection")
conn.ConnectionString="DRIVER=Microsoft Access Driver (*.mdb);DBQ="&Server.MapPath("test.mdb")
conn.open
set rs=Server.CreateObject("ADODB.recordset")
rs.CursorType=3
rs.locktype=3
sql="select * from content where title like '%" & keyword & "%'"
rs.Open sql,conn
if rs.EOF then
Response.Write("对不起,没有您要的搜索结果!")
else
Do while not rs.EOF %>
- "><%response.write(rs("title"))%>
- <%response.write(rs("content"))%>
<%rs.movenext
loop
end if
rs.close
Set rs = nothing
set conn=nothing
%>
```
在这个例子中,我们可以看到,关键字是通过查询参数传入程序中。在某些情况下,是很容易构造自己的参数的。而参数的输入,又会进一步被转化为 SQL 语句,这就为黑客注入自己的 SQL 语句提供了可能。假设黑客构造的访问路径中,加入如下注入语句:
```
http://www.example.com/search.asp?keyword=a' or 'a'='a
```
那么,程序就会组装成如下 SQL 语句:
```
select * from content where title like '%a' or 'a'='a%'
```
此时,由于 `or 'a'='a` 始终为真,所以查询结果将返回所有文章,即攻击就得逞了。因此,在搜索中,我们不能直接将关键字组装在 SQL 语句中,还需要对关键字进行一些过滤和处理,需要对于特殊字符进行过滤和替换。
在ASP程序中,SQL 注入不仅仅存在于搜索中,还会存在于登陆、注册、评论等等环节中,因此,我们在编写代码的时候,必须审慎对待查询参数的组装方式。
XSS攻击是另外一个常见的漏洞类型。在ASP中,XSS的攻击主要是在前端页面与后台数据交互的过程中发生。由于 ASP 的页面动态生成,因此后台数据与前端数据的关联较为紧密,也更容易形成漏洞。
在前往了解XSS攻击之前,我们先了解一下ASP中输出语句的两个关键字:
* Response.Write
* <%=…%>
这两个语句的区别在于,它们的编译方式不一样。Response.Write语句是被编译为一个函数调用,而<%=…%>语句在编译时,则是一个变量替换。
在处理输出字符的时候,使用Response.Write会导致一些问题。如果这些字符被放在了HTML的标签中,比如在 `input` 标签的value中,它们将被翻译为HTML代码。因此,这种方式可以轻松的注入 JavaScript 代码,使得网页产生 XSS 事件。下面是一个例子:
```
```
其中,如果用户输入 ``,这段 script 代码就会被code攻击,实现一个对网站安全的攻击。
所以,如何避免这种情况呢?在ASP中,最好的方法就是使用转义字符,将字符串中的 < 和 > 转义,彻底消除翻译为HTML代码的风险。在需要输出的前端代码中,如下表示:
```
```
总的来说,从ASP源代码中,我们也能发现不少涉及到漏洞的领域,比如SQL注入、XSS攻击等,那么,在编写ASP代码的时候,我们应该有一些基本策略。比如,参数稍加处理,SQL注入可避免,不要使用 Response.Write,而选择转义字符等,避免XSS攻击,及时及时维护,保证网站的安全性。又例如,可以使用w3af、nikto、nmap、acunetix等工具对网站进行渗透测试,从而支持二次代码审查及修正。
当然,要想安全的开发ASP,必须多练代码,并注意变量的类型、范围、作用域、和风险。
相信对于ASP代码研究的朋友而言,本文可以突破常规思维,为发现更多漏洞提供思路和方法。同时,我们也迎来更多网站的测试员和网络安全人士,共同保护我们共同享有的网络环境。