初探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="Ìá&#189;&#187;Êý&#190;Ý" />
    <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

分析

  1. 获取文件扩展名:取文件名最后3个字符
  2. 白名单验证:检查扩展名是否在UpFileType列表中
  3. 黑名单验证:额外禁止aspasa等危险扩展名
  4. 防御不足:
    • 仅检查最后3个字符,可能被双扩展名绕过(如test.asp.jpg)
    • 未验证文件内容,可能被图片马绕过
    • 未限制上传目录的执行权限

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.aspsession.asp)
  • 加强后台认证和授权检查
  • 错误信息处理,避免泄露敏感信息
  • 定期更新第三方组件(如kindeditor)

五、总结

通过本次ASP代码审计,我们发现了多种常见安全漏洞,包括SQL注入、代码执行、CSRF和文件上传漏洞等。ASP应用的安全防护需要特别注意以下几点:

  1. 所有用户输入都必须视为不可信的
  2. 数据库操作必须使用参数化查询
  3. 文件操作要严格控制权限和内容
  4. 敏感操作需要多重验证
  5. 保持第三方组件的更新

ASP虽然是一门较老的技术,但其安全原则与现代Web应用安全是一致的。理解这些漏洞原理和防御方法,有助于我们更好地保护Web应用安全。

ASP代码审计实战教学文档 一、前言 ASP(Active Server Pages)是一种经典的服务器端脚本环境,虽然技术较老,但在某些遗留系统中仍有使用。本文将通过一个实际的ASP代码审计案例,详细介绍ASP代码审计的方法、常见漏洞类型及利用方式。 二、环境与项目结构 1. 环境配置 操作系统:Windows 7 Web服务器:IIS 数据库:Access 源码类型:ASP + Access 2. 重要目录结构 三、漏洞审计与分析 1. SQL注入漏洞 1.1 前台SQL注入 分析 : 虽然使用了 isnumeric() 函数对ID进行了验证,但仅验证是否为数字 SQL语句直接拼接用户输入,存在数字型SQL注入风险 防御不足:缺少参数化查询或严格的输入过滤 1.2 后台SQL注入 edit_team.asp 文件: 分析 : 直接拼接 request.QueryString("id") 到SQL语句中 鉴权文件 seeion.asp (拼写错误)可能存在绕过风险 典型的SQL注入漏洞,攻击者可构造恶意ID参数进行注入攻击 2. 代码执行漏洞 admin_setup.asp 中的配置写入功能: 分析 : 使用 Scripting.FileSystemObject 对象直接写入配置文件 未对输入内容进行过滤,可能导致ASP代码注入 攻击者可构造恶意输入,在配置文件中插入可执行代码 3. CSRF漏洞 添加管理员功能的CSRF示例: 分析 : 后台操作未使用CSRF Token防护 攻击者可构造恶意页面诱骗管理员点击,从而执行添加管理员等操作 整套系统多处存在此类问题 4. 文件上传漏洞 4.1 上传验证逻辑 upload.asp 核心代码: 分析 : 获取文件扩展名:取文件名最后3个字符 白名单验证:检查扩展名是否在 UpFileType 列表中 黑名单验证:额外禁止 asp 、 asa 等危险扩展名 防御不足: 仅检查最后3个字符,可能被双扩展名绕过(如 test.asp.jpg ) 未验证文件内容,可能被图片马绕过 未限制上传目录的执行权限 4.2 上传接口 uploadfile.asp :文件上传接口 uploadpic.asp :图片上传接口(代码有错误需修复) 两者都调用 upload.asp 进行验证 4.3 编辑器上传 使用 kindeditor 编辑器,存在上传HTML文件的风险: 四、防御建议 1. SQL注入防御 使用参数化查询: 严格验证输入类型和范围 使用存储过程 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应用安全。