并不是所有Web平台问题都会导致直接的攻击。对于不建立闯入Web服务器的直接途径,而是模糊对攻击者的检测的Web平台来说,日志逃避是典型的例子。接下来,我们将介绍这种问题的两个示例,可以使攻击者绕开正确的请求记录。
使用长URL的日志逃避
有些Web服务器软件不能记录超过特定字符数的URI数据。例如,Sun-One应用服务器只能记录请求URI的前4042个字符。Microsoft IIS在查询字符串或者首部值超过4097个字符时也有同样的问题。这种限制用于避免攻击者利用日志洪泛进行DoS攻击,但是攻击者现在已经利用这一功能获得好处。让我们看看IIS的例子,更详细地阐述这个功能如何被攻击者利用从而在Web日志中掩盖他们的存在。
在写入Web日志时,IIS在查询串长度超过4097个字符时自动地用省略号“...”截断。这使得攻击者可以创建一个填充到4097字符的虚假查询,并在最后附加攻击。Web服务器仍然正确地处理该请求并抛弃虚假的参数,使得攻击成功,但是将不会记录该请求。
我们来看一个使用日志逃避掩盖对IIS的SQL注入攻击的具体示例。这种攻击如果通过查询串进行(如下面的示例),很容易在Web日志中发现。
GET /article.asp?id=convert(int,(select+top+1+name+from+sysobjects+ where+xtype='u')) HTTP/1.0 Connection: Close Host: www.site.com User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Web服务器正常响应,日志项如下:
2005-10-04 22:10:24 127.0.0.1 - 127.0.0.1 80 GET /product_detail.asp id=convert(int,(select+top+1+name+from+sysobjects+where+xtype='u'))| 170|80040e07 |[Microsoft][ODBC_SQL_Server_Driver][SQL_Server]Syntax_error_converting_the_nvar char_value_'tbl_Globals'_to_a_column_of_data_type_int. 500 4910 561 Mozilla/5.0+(Windows;+U;+Windows+NT+5.1;+enUS;+rv:1.7.10)+Gecko/ 20050716+Firefox/1.0.6
你可以清楚地从示例中的粗体文本看到,发生了SQL注入攻击,响应中返回数据库错误。这时,很容易通过解析IIS日志中返回给用户的SQL数据库错误或者请求中使用的SQL关键字,发现某人试图对应用进行SQL注入。
现在我们来看看隐藏在用于逃避IIS日志检测的长URI中的相同请求。我们使用同样的攻击请求,带上用于填充日志缓冲的虚假参数foo:
GET /product_detail.asp?id=convert(int,(select+top+1+name+from+sysobjects+where+xtyp e='u'))&foo=<4097 a's> HTTP/1.0 Host: localhost User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
因为foo参数是虚假的,Web应用忽略它,攻击成功执行。日志文件记录如下的请求:
2005-10-04 22:31:01 127.0.0.1 - 127.0.0.1 80 GET /product_detail.asp ... 500 4965 4287 Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+NT+5.0) - -
注意,查询字符串现在被替换为“...”,没有记录响应中的任何错误文本。攻击者可以继续进行相似的参数欺骗而不会被记录。
用TRACK掩盖请求
TRACK是仅由IIS支持的HTTP方法,作用与TRACE方法完全相同。对TRACK请求的响应是重复所发送的请求。
下面是一个示例:
TRACK / HTTP/1.1 Host: www.site.com User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) HTTP/1.1 200 OK Server: Microsoft-IIS/5.x Date: Tue, 04 Oct 2005 23:07:12 GMT X-Powered-By: ASP.NET Content-Type: message/http Content-Length: 102 TRACK / HTTP/1.1 Host: www.site.com User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
在Microsoft IIS 5.x中,Web服务器对所有TRACK请求都不予记录。这个请求本身不是非常危险,也不能用于读取页面或者提交攻击,但是可以用于DoS攻击。
我们在调查一位客户的Web服务器的异常表现时体验了TRACK的使用。这台服务器的CPU占用率很高,机器反应迟钝。在网络上投放嗅探器之后,我们注意到尽管HTTP流量极高,但是Web日志中不包含嗅探器发现的许多请求的记录。在更详细地使用嗅探器观察Web请求之后,我们注意到许多危害该服务器的TRACK/<long URL>HTTP/1.0请求在日志中没有记录。
注意 TRACK请求也是对Web服务器进行DoS攻击而又不填充日志的狡诈手段。
IIS日志逃避对策
好的解决方案之一是使用UrlScan避免这些问题。默认情况下,安装UrlScan时,MaxQueryString=2048设置将有效阻止长URL逃避方法。在UrlScan 2.5中有一个LogLongUrls选项。开启这个选项,UrlScan将记录长达128K的请求,这能在日志中看到任何攻击。UrlScan也用于拒绝TRACK或TRACE方法。好的经验法则是拒绝除了HEAD、GET和POST之外的任何请求方法。