PHP China | 中国开源之路 's Archiver

剑心 发表于 2006-12-30 18:00

php中的协议注射

php中的协议注射

BY  剑心 http://www.loveshell.net

PHP本身很早就提供了对网络的支持,支持包括HTTP,FTP,MAIL在内的种种网络协议,其本身也提供了一大批能直接操作HTTP与FTP的函数,操作http的如header,操作ftp的如ftp_mkdir等等一些函数。但是由于php在控制这些函数的参数时存在漏洞,可能导致一些意外的事情发生。
大家知道'在SQL语句中可能截断前面的SQL语句,从而可能被人恶意控制整个整个语句,在http和ftp等协议中,一样存在这样的字符可能被人注入自己的命令。大家知道在HTTP中,一个HTTP头是\r\n分割的,而Header函数允许程序在具体的内容发送向用户前发送一个原始的http头,如果我们在参数里送入一个回车会怎么样呢?
Example:
<?
$charset=$_GET[$charset];
header('Content-Type: text/html; charset='.$charset);
.....
.....
?>

如果我们向$charset里注射\r\n也相当于注射了HTTP中的元字符,结果会怎么样呢?
Exp: [url=http://www.loveshell.net/test.php?charset=GBK%0D%0A%0D%0A<script]http://www.loveshell.net/test.php?charset=GBK%0D%0A%0D%0A<script>alert()</script[/url]>
这样就可以看到效果,我们是可以伪造输出的任何内容了,并且可以覆盖以前提交的HEADER头内容 :),但是从5.1.2版本开始,php已经意识到了这个问题,对于上面同样的操作,在高版本的PHP里PHP会阻止我们的第二个HTTP头,并且报告一个waring级别的错误,我们就只能看看路径了 :(
那么对于FTP呢?在FTP中一条命令的结束也是以\r\n(可能表述并不准确,\r一样可以造成同样的问题)结束的,如果我们能在参数里注入这样的命令分隔符会怎么样呢?

Example:
<?php
$ftp_server='www.loveshell.net';
$ftp_user_name='loveshell';
$ftp_user_pass='loveshell';
$command = $_GET['dir'];
$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
if($command) ftp_mkdir($conn_id, $command);
.......
Exp: [url=http://www.loveshell.net/test.php?dir=loveshell%0D%0AMKD]http://www.loveshell.net/test.php?dir=loveshell%0D%0AMKD[/url] jnc%0D%0ADELE jnc.txt%0D%0Armd test

最终的结果是loveshell目录被成功建立,顺便还建立了jnc目录,jnc.txt被删除,test目录被删除,我们注入的命令成功执行了!抓包看看结果吧,原来ftp_mkdir函数直接把我们提交的内容放到了MKD参数后面变成了:
MKD loveshell
MKD jnc
DELE jnc.txt
rmd test
然后ftp服务器处理这些命令,很明显,这些发送的内容最终被ftp解析成客户端的内容从而被执行了!最近很多的bbs和脚本程序都开始提供远程上传的功能,其本质都是利用ftp来将附件传到远程的服务器上,嘿嘿,如果我们能往文件名里注射我们的回车,结果会怎么样呢?貌似到现在,PHP都没有意识并且处理这个问题。
其他的函数如mail都有这样的问题,看来,在SQL注射被普遍利用并且重视的今天,寻找些其他方面的注射还是很有意思的哦!

lam 发表于 2006-12-31 03:31

剑心辛苦了,加精。。。

kenus 发表于 2006-12-31 23:28

;P ;P ;P

yuking 发表于 2007-1-8 18:42

变量初始化了不就没戏了?

ysixin 发表于 2007-1-16 11:47

楼主很奇怪,为什么所有的外部变量进来之前 都不检查??

xy7 发表于 2007-1-18 16:40

楼上的没看到是“Example”?
楼上的就那么确定所有的程序都对变量很好的检查了?

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.