初探asp代码审计
字数 1591 2025-08-29 08:31:54
ASP代码审计实战教学文档
一、前言
ASP(Active Server Pages)是一种经典的服务器端脚本环境,虽然技术较老,但在某些遗留系统中仍有使用。本文将通过一个实际的ASP代码审计案例,详细介绍ASP代码审计的方法、常见漏洞类型及利用方式。
二、环境与项目结构
1. 环境配置
- 操作系统:Windows 7
- Web服务器:IIS
- 数据库:Access
- 源码类型:ASP + Access
2. 重要目录结构
admin/ # 后台管理目录
editor/ # 编辑器目录(某版本编辑器)
inc/ # 配置文件和通用功能函数
uploadfile/ # 上传文件存储目录
xydata/ # 数据库文件存放位置
*.asp # 前台展示页面
三、漏洞审计与分析
1. SQL注入漏洞
1.1 前台SQL注入
<%
id=request.QueryString("id")
if id="" or not isnumeric(id) then
Response.Write "<script>alert('参数错误!');history.go(-1);</script>"
Response.End()
end if
set rs=server.createobject("adodb.recordset")
exec="select * from news where id="& id
rs.open exec,conn,1,1
if rs.eof then
response.Write "<div style=""padding:10px"">没有相关新闻信息!</a>"
response.End()
end if
%>
分析:
- 虽然使用了
isnumeric()函数对ID进行了验证,但仅验证是否为数字 - SQL语句直接拼接用户输入,存在数字型SQL注入风险
- 防御不足:缺少参数化查询或严格的输入过滤
1.2 后台SQL注入
edit_team.asp文件:
<!--#include file="../xyconn.asp"-->
<!--#include file="seeion.asp"-->
<%
exec="select * from [xyteam] where id="& request.QueryString("id")
set rsa=server.createobject("adodb.recordset")
rsa.open exec,conn,1,1
%>
分析:
- 直接拼接
request.QueryString("id")到SQL语句中 - 鉴权文件
seeion.asp(拼写错误)可能存在绕过风险 - 典型的SQL注入漏洞,攻击者可构造恶意ID参数进行注入攻击
2. 代码执行漏洞
admin_setup.asp中的配置写入功能:
<%
if Request.QueryString("act")="ok" then
set fso=Server.CreateObject("Scripting.FileSystemObject")
set hf=fso.CreateTextFile(Server.mappath("../inc/config.asp"),true)
hf.write vbcrlf
hf.write "Const wzname=" & chr(34) & trim(request.form("wzname")) & chr(34) & "'网站名称" & vbcrlf
'...其他配置项写入...
hf.close
set hf=nothing
set fso=Nothing
response.Write("<script>alert('网站基本设置更新成功!');window.location.href='admin_setup.asp';</script>")
End If
%>
分析:
- 使用
Scripting.FileSystemObject对象直接写入配置文件 - 未对输入内容进行过滤,可能导致ASP代码注入
- 攻击者可构造恶意输入,在配置文件中插入可执行代码
3. CSRF漏洞
添加管理员功能的CSRF示例:
<html>
<body>
<form action="http://192.168.87.133:8080/admin/admin_manage.asp?act=add" method="POST">
<input type="hidden" name="admin" value="test" />
<input type="hidden" name="password" value="test" />
<input type="hidden" name="password3" value="test" />
<input type="hidden" name="button" value="Ìá½»Êý¾Ý" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
分析:
- 后台操作未使用CSRF Token防护
- 攻击者可构造恶意页面诱骗管理员点击,从而执行添加管理员等操作
- 整套系统多处存在此类问题
4. 文件上传漏洞
4.1 上传验证逻辑
upload.asp核心代码:
fileExt=lcase(right(file.filename,3))
const UpFileType="midi|mid|mpe|wma|avi|rm|mp3|gif|jpg|doc|xls|ppt|mp3|wma|asf|bmp|mid|aiff|arj|ram|rar|txt|wav|zip|png|psd|swf|flv|pdf"
arrUpFileType=split(UpFileType,"|")
for i=0 to ubound(arrUpFileType)
if fileEXT=trim(arrUpFileType(i)) then
EnableUpload=true
exit for
end if
next
if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" or fileEXT="js" or fileEXT="exe" or fileEXT="jsp" or fileEXT="php" then
EnableUpload=false
end if
if EnableUpload=false then
response.write "该文件类型不只允许上传 [ <a onclick=history.go(-1) style='cursor: hand'>重新上传</a> ]"
response.end
end if
分析:
- 获取文件扩展名:取文件名最后3个字符
- 白名单验证:检查扩展名是否在
UpFileType列表中 - 黑名单验证:额外禁止
asp、asa等危险扩展名 - 防御不足:
- 仅检查最后3个字符,可能被双扩展名绕过(如
test.asp.jpg) - 未验证文件内容,可能被图片马绕过
- 未限制上传目录的执行权限
- 仅检查最后3个字符,可能被双扩展名绕过(如
4.2 上传接口
uploadfile.asp:文件上传接口uploadpic.asp:图片上传接口(代码有错误需修复)- 两者都调用
upload.asp进行验证
4.3 编辑器上传
使用kindeditor编辑器,存在上传HTML文件的风险:
'定义允许上传的文件扩展名
imageExtStr = "gif|jpg|jpeg|png|bmp"
flashExtStr = "swf|flv"
mediaExtStr = "swf|flv|mp3|wav|wma|wmv|mid|avi|mpg|asf|rm|rmvb"
fileExtStr = "doc|docx|xls|xlsx|ppt|htm|html|txt|zip|rar|gz|bz2"
四、防御建议
1. SQL注入防御
- 使用参数化查询:
set cmd = Server.CreateObject("ADODB.Command") cmd.ActiveConnection = conn cmd.CommandText = "SELECT * FROM news WHERE id = ?" cmd.Parameters.Append cmd.CreateParameter("id", adInteger, adParamInput, , id) set rs = cmd.Execute - 严格验证输入类型和范围
- 使用存储过程
2. 代码执行防御
- 对写入配置文件的内容进行HTML编码或过滤特殊字符
- 限制配置文件的写入权限
- 使用专门的配置文件而非动态生成
3. CSRF防御
- 添加CSRF Token验证
- 检查Referer头
- 关键操作使用POST请求
4. 文件上传防御
- 使用完整的文件扩展名验证(而非最后3个字符)
- 结合MIME类型和文件头验证
- 上传文件重命名(如使用GUID)
- 限制上传目录的执行权限
- 设置文件内容大小限制
- 对图片文件进行二次渲染
5. 其他安全建议
- 修复拼写错误的文件名(
seeion.asp→session.asp) - 加强后台认证和授权检查
- 错误信息处理,避免泄露敏感信息
- 定期更新第三方组件(如kindeditor)
五、总结
通过本次ASP代码审计,我们发现了多种常见安全漏洞,包括SQL注入、代码执行、CSRF和文件上传漏洞等。ASP应用的安全防护需要特别注意以下几点:
- 所有用户输入都必须视为不可信的
- 数据库操作必须使用参数化查询
- 文件操作要严格控制权限和内容
- 敏感操作需要多重验证
- 保持第三方组件的更新
ASP虽然是一门较老的技术,但其安全原则与现代Web应用安全是一致的。理解这些漏洞原理和防御方法,有助于我们更好地保护Web应用安全。