【问题标题】:Script attack on classic ASP对经典 ASP 的脚本攻击
【发布时间】:2013-06-11 07:06:22
【问题描述】:

我有作为前端的经典 ASP 和作为后端的 SQL Server 2005 的网站。

但是我的后端面临着一个非常奇怪的 SQL 注入。

带有垃圾邮件站点的 HTML 的某些类型的 CSS 将它们的代码附加到我的网站数据库中,其中包含每个表和每个 varchar 类型的列。

例如

</title><style>.am1y{position:absolute;clip:rect(405px,auto,auto,405px);}</style><div class=am1y>same day <a href=http://mazzpaydayloans.com >payday loans</a></div>

我检查了我的 IIS 日志它向我显示这样的

2013-06-09 19:15:54 获取 /mypage.asp%3C/title%3E%3Cstyle%3E.axo5{position:absolute;clip:rect(404px,auto,auto,404px);}%3C/style%3E%3Cdiv%20class=axo5%3Eapproval% 20%3Ca%20href=http://mazzpaydayloans.com%20%3Epayday%20loans%3C/a%3E%3C/div%3E - - 204.13.205.99 HTTP/1.1 Mozilla/4.0+(兼容;+MSIE+6.0;+Windows+NT+5.1;+SV1) 登录失败=机会=0&bantime=;+ASPSESSIONIDSSDRRCQQ=EDPHPJGCGLMKOADICKHODKBM - www.mysite.com 404 0 281 543 78

在我选择的这个 ASP 页面上,所有 SQL 查询都已参数化。

但这个问题仍然存在。

MyPage.asp 代码

new_prot = "http" 
new_https = lcase(request.ServerVariables("HTTPS")) 
if new_https <> "off" then new_prot = "https" 
new_domainname = Request.ServerVariables("SERVER_NAME") 
new_filename = Request.ServerVariables("SCRIPT_NAME") 

set cm1 = Server.CreateObject("ADODB.Command")
cm1.ActiveConnection = conn
cm1.commandtype=1
cm1.CommandText ="select * from Table1 where Web=?"

cm1.prepared=true
dim weburl

set weburl=cm1.createparameter(Web_URL,200,,5000)
weburl.value= Server.HtmlEncode(ltrim(rtrim(new_filename)))
cm1.parameters.append weburl


set Mobile = cm1.execute(RecordsAffected,,adCmdText)


do until Mobile.EOF
response.redirect(Mobile.fields("mob"))
loop

【问题讨论】:

  • 请在此处发布/mypage.asp 的代码。还要确认(检查您的所有网站)注入仅在此页面上。
  • 在传递给 SELECT 语句之前如何解析收到的 GET 查询?
  • 请检查我在上面编辑的代码。
  • 注入没有超过这个代码。如您所见,IIS 日志记录有 404 状态(未找到)。尝试在 IIS 日志字符串中搜索 'SELECT--
  • 感染已经发生后,日志中的那个东西会不会只是一个断开的链接?它没有任何 SQL。未编码为/mypage.asp&lt;/title&gt;&lt;style&gt;.axo5{position:absolute;clip:rect(404px,auto,auto,404px);}&lt;/style&gt;&lt;div class=axo5&gt;approval &lt;a href=http:/mazzpaydayloans.com &gt;payday loans&lt;/a&gt;&lt;/div&gt; -

标签: sql-server asp-classic


【解决方案1】:

首先,您的查询可能是参数化的,但您需要隐含一个存储过程,而不是直接的 SQL 命令。

set cm1 = Server.CreateObject("ADODB.Command")
cm1.ActiveConnection = conn
cm1.commandtype=1
cm1.CommandText ="select * from Table1 where Web=?"

命令文本是不可以的

你需要实现一个存储过程:

CREATE ProcTable 
@ParamWeb INT
as 

SELECT * FROM Table WHERE PAgeID = @ParamWeb

然后执行 proc。这可以防止注入,因为页面只能接受 proc 的数值,并且只会返回相关的数据集(空或带有行)

你的命令文本可以有

"; any injection script you want" 

附加

任何注入脚本都可以包含 sqlcmdShell,因此一旦注入,坏人就可以返回一个表列表、它们的内容、用户、用户数据等

【讨论】:

  • 你说得对——在一般情况下应该使用这个规则。但他的代码(公开部分)也很安全:据我所知,不可能伪造Request.ServerVariables 值,因为它创建了 ASP 引擎。
  • 自从我使用经典 ASP 以来的年代,但至少在 .NET 中,正确参数化的查询并不比存储过程更容易受到 SQL 注入的影响。您是否有任何详细信息说明为什么它们会不那么安全?考虑到 OP 显然确实存在 SQL 注入问题,存储过程的一个优点是他们可以只授予 exec 权限并删除基表上的所有直接权限。
  • @Ian P:你怎么能把它附加到命令文本中?对我来说,这看起来像是一个参数化查询。你能举个例子吗?
猜你喜欢
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多