来源:自学PHP网 时间:2015-04-17 11:59 作者: 阅读:次
[导读] 这个漏洞是一个后台注射,影响不大,本身我是不想发的,漏洞本身可能造成影响不大,但是整个漏洞分析的过程应该在自己还有兴趣的时候记录下来,因为以后我会知道当时还有兴趣...
这个漏洞是一个后台注射,影响不大,本身我是不想发的,漏洞本身可能造成影响不大,但是整个漏洞分析的过程应该在自己还有兴趣的时候记录下来,因为以后我会知道当时还有兴趣分析了它。
PHPWIND是我一直以来觉得为了实现安全无所不用其极的一款产品,我是喜欢这样小聪明解决问题的产品的。
该产品使用checkVar函数全局将GP(GET,POST)中的.. ) < = 都替换成了HTML实体,所以即使你找到了一个SQL注射,你也会被限制在不允许使用函数及子查询中,即使你找到了一个代码执行漏洞,也被限制在函数和php标签的开始中。
以上这一段也是为什么我还是写了这个漏洞的原因之一,我觉得一个产品做的这样的事情应当被人所知。
首先,我找到了一个函数。
deleteMessagesByMessageIds
在lib/message/db/ms_messagesdb.class.php中
function deleteMessagesByMessageIds($messageIds){
$messageIds = is_array($messageIds) ? S::sqlImplode($messageIds) : $messageIds;
$query = $this->_db->query ( "DELETE FROM " . $this->_tableName. " WHERE mid in (".$messageIds.") " );
return $this->_db->affected_rows ();
}
所以我知道如果没有什么东西限制messageIds必须是数组的话,它如果是一个字符串的话,将会导致SQL注射,而接下来我就需要找到到底在哪里它不被要求是一个数组。
然后我找到了manageMessageWithMessageIds函数,在lib/message/message/search.ms.php。
接下来我就发现它在后台被调用了。
在admin/superdel.php中
S::gp(array('delid'),'P');
empty($delid) && adminmsg("请选择要删除的消息");
$messageServer->manageMessageWithMessageIds($delid);
adminmsg('operate_success',"$url");
前面我提到了checkVar,对做这个事情的人我发自内心的钦佩。
之所以在这里我们能注入是因为这个函数对后台放了一马。
function checkVar(&$var) {
if (is_array($var)) {
foreach ($var as $key => $value) {
S::checkVar($var[$key]);
}
} elseif (P_W != 'admincp') {
$var = str_replace(array('..',')','<','='), array('..',')','<','='), $var);
} elseif (str_replace(array('<iframe','<meta','<script'), '', $var) != $var) {
global $basename;
$basename = 'javascript:history.go(-1);';
adminmsg('word_error');
}
}
中的
} elseif (P_W != 'admincp') {
修复方案:
S::gp(array('delid'),'P',2);
: )
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com