本帖最后由 chock 于 2017-8-21 10:00 编辑
ideacms 官网地址: http://www.ideacms.net 需要的朋友可以自行下载 Ideacms有两个大产品,一个是建站系统,一个是商城系统,这里两个漏洞都存在代码执行,因为核心代码都大同小异,所以,这里以商城系统的代码来做分析。
其实这个漏洞也可以说是服务端模板注入攻击 即SSTI
Ideacms的模板解析是通过正则匹配将一系列模板标签进行解析替换的,但在模板解析类里,有一个parseif()函数,里面调用了危险函数Execute(),导致了代码执行,那我们来看看这个函数:inc\Template_class.asp
调用parseif方法时,会传给它一个content值,这个content值就是即将输出页面的conten值,如果里面含有符合正则{if:([\s\S]+?)}([\s\S]*?){end\s+if} 的标签,那么就会进入下面的逻辑,使用Execute进行代码执行, 这个{if:([\s\S]+?)}([\s\S]*?){end\s+if} 其实就是模板标签里的条件判断标签,比如 {if:1==1}you can see me{end if} 那1==1,这个条件就会进入execute函数 所以,我们的攻击payload可以这样: {if:response.write(233)}1{end if} 或者 {if:eval(request(1))}1{end if} 那我们要怎么才可以控制content的值成功触发这个parseif呢?
在源码里直接搜索parseif,就会发现搜索页面search/index.asp有调用到这个方法:
这里就是把infostr传值给parseif,而infostr已经经过上面一系列 变量标签的替换,把搜索的key值输入到infostr里了, 也就是说,在到达parseif之前,我们可以通过搜索的key值,把我们的攻击payload注入到infostr里,再传给parseif进行if标签的解析,这样就可以产生我们要的效果,那我们到官网的demo试试看:
成功执行response.write(233) 那换成一句话就是keys={if:eval(request(1))}1{end if},然后菜刀密码为 1
以上讲的是商城系统的搜索页面,其他页面如果也有调用parseif,而且在content值进入其之前可控,就可以构造攻击。 建站系统的搜索页面虽然也调用了parseif,因为key值没有输出到content值里,所以没办法利用,但是它的留言板那里是存在的。
|