对phpcms v9的那个评论一点解析
出差中,看见wooyun上说是评论的回复的时候出现问题,有错误大家 指出来,我好日后改正。
看代码文件
这个为评论页面 测试用的。
从url看可以看出来m 是module,c是头文件,a是初始化,后面不解释了。好像是这样。
下面是第一次评论的时候文件最后插入数据是这样的。回复评论的时候
下面测试开始:
第一次发表评论的时候
进入数据库后。
再次评论的时候,我们从数据库直接读取数据,没有过滤直接如下。
去掉echo 之这样
不对的地方给改正些,发了这么多一个金币都没有。。。
看代码文件
这个为评论页面 测试用的。
http://192.168.48.192/DEV1.5.0/gbk/install_package/index.php?m=comment&c=index&a=init&commentid=content_6-1-1&iframe=1&id=29
从url看可以看出来m 是module,c是头文件,a是初始化,后面不解释了。好像是这样。
下面是第一次评论的时候文件
comment.Class.php
public function add($commentid, $siteid, $data, $id = '', $title = '', $url = '') {
//开始查询评论这条评论是否存在。
//echo $data[userid],'|'.$data[username],'|',$data[content];
//echo $_SERVER[PHP_SELF];
//exit;
$title = new_addslashes($title);
if (!$comment = $this->comment_db->get_one(array('commentid'=>$commentid, 'siteid'=>$siteid), 'tableid, commentid')) { //评论不存在
//取得当前可以使用的内容数据表
$r = $this->comment_table_db->get_one('', 'tableid, total', 'tableid desc');
$tableid = $r['tableid'];
if ($r['total'] >= 1000000) {
//当上一张数据表存的数据已经达到1000000时,创建新的数据存储表,存储数据。
if (!$tableid = $this->comment_table_db->creat_table()) {
$this->msg_code = 4;
return false;
}
}
//新建评论到评论总表中。
$comment_data = array('commentid'=>$commentid, 'siteid'=>$siteid, 'tableid'=>$tableid, 'display_type'=>($data['direction']>0 ? 1 : 0));
if (!empty($title)) $comment_data['title'] = $title;
if (!empty($url)) $comment_data['url'] = $url;
if (!$this->comment_db->insert($comment_data)) {
$this->msg_code = 5;
return false;
}
} else {//评论存在时
$tableid = $comment['tableid'];
}
if (empty($tableid)) {
$this->msg_code = 1;
return false;
}
//为数据存储数据模型设置 数据表名。
$this->comment_data_db->table_name($tableid);
//检查数据存储表。
if (!$this->comment_data_db->table_exists('comment_data_'.$tableid)) {
//当存储数据表不存时,尝试创建数据表。
if (!$tableid = $this->comment_table_db->creat_table($tableid)) {
$this->msg_code = 2;
return false;
}
}
//向数据存储表中写入数据。
$data['commentid'] = $commentid;
$data['siteid'] = $siteid;
$data['ip'] = ip();
$data['status'] = 1;
$data['creat_at'] = SYS_TIME;
//对评论的内容进行关键词过滤。
$data['content'] = strip_tags($data['content']); //去掉html xml php标签
$badword = pc_base::load_model('badword_model');
$data['content'] = $badword->replace_badword($data['content']);
if ($id) {
$r = $this->comment_data_db->get_one(array('id'=>$id));
//直接读出内容了,没有过滤
if ($r) {
pc_base::load_sys_class('format', '', 0);
if ($r['reply']) {
$data['content'] = '<div class="content">'.str_replace('<span></span>', '<span class="blue f12">'.$r['username'].' '.L('chez').' '.format::date($r['creat_at'], 1).L('release').'</span>', $r['content']).'</div><span></span>'.$data['content'];
} else {
$data['content'] = '<div class="content"><span class="blue f12">'.$r['username'].' '.L('chez').' '.format::date($r['creat_at'], 1).L('release').'</span><pre>'.$r['content'].'</pre></div><span></span>'.$data['content'];
}
$data['reply'] = 1;
//echo $data[content];//直接读取数据,没有编码。炯。下面是图
// exit;
}
}
//判断当前站点是否需要审核
$site = $this->comment_setting_db->site($siteid);
if ($site['check']) {
$data['status'] = 0;
}
//echo $data[content];
if ($comment_data_id = $this->comment_data_db->insert($data, true)) { //插入数据库。
//需要审核,插入到审核表
//echo $comment_data_id;
//exit;
if ($data['status']==0) {
$this->comment_check_db->insert(array('comment_data_id'=>$comment_data_id, 'siteid'=>$siteid,'tableid'=>$tableid));
echo 1;
exit;
} elseif (!empty($data['userid']) && !empty($site['add_point']) && module_exists('pay')) { //不需要审核直接给用户添加积分
pc_base::load_app_class('receipts', 'pay', 0);
receipts::point($site['add_point'], $data['userid'], $data['username'], '', 'selfincome', 'Comment');
}
//开始更新数据存储表数据总条数
$this->comment_table_db->edit_total($tableid, '+=1');
//开始更新评论总表数据总数
$sql['lastupdate'] = SYS_TIME;
//只有在评论通过的时候才更新评论主表的评论数
if ($data['status'] == 1) {
$sql['total'] = '+=1';
switch ($data['direction']) {
case 1: //正方
$sql['square'] = '+=1';
break;
case 2://反方
$sql['anti'] = '+=1';
break;
case 3://中立方
$sql['neutral'] = '+=1';
break;
}
}
$this->comment_db->update($sql, array('commentid'=>$commentid));
if ($site['check']) {
$this->msg_code = 7;
} else {
$this->msg_code = 0;
}
return true;
} else {
$this->msg_code = 3;
return false;
}
}
mysql.class.php文件
public function insert($data, $table, $return_insert_id = false, $replace = false) {
if(!is_array( $data ) || $table == '' || count($data) == 0) {
return false;
}
$fielddata = array_keys($data);
$valuedata = array_values($data);
array_walk($fielddata, array($this, 'add_special_char'));
array_walk($valuedata, array($this, 'escape_string')); //取valuae
$field = implode (',', $fielddata);
$value = implode (',', $valuedata);//每条进行分割
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
//echo $sql;
//exit;
$return = $this->execute($sql);
return $return_insert_id ? $this->insert_id() : $return;
}
下面测试开始:
第一次发表评论的时候
进入数据库后。
再次评论的时候,我们从数据库直接读取数据,没有过滤直接如下。
去掉echo 之这样
不对的地方给改正些,发了这么多一个金币都没有。。。
评论5次
感谢分享
cookies欺骗 补充一下:有验证码么?
phpcms的漏洞不少,乌云上9-10月份就提交了15个,只是密码加密方式比较操蛋
phpcms出洞不容易
这才是百密一疏啊 看来挖洞还是得仔细才行 尤其对于折中经过N多黑客洗礼的程序...................