从index.php看起,首先就包含了两个文件:/inc/conn.php和/inc/common/360_safe3.php
/inc/conn.php包含了六个文件:
config.php是数据库db、ftp等等的配置信息;
cache.php是缓存文件;
class.php一共有三个类:AppDb、AppFtp和AppZip,都定义了各自的操作函数;
function.php都是一些功能函数;
template.php中有一个AppTpl类,并且新建了一个模板对象
1 |
|
index.php包含的第二个文件/inc/common/360_safe3.php主要作用就是防止SQL注入和XSS:
回到index.php中,接下来的代码就是定义路由规则
第14行调用了be函数,对提交的参数$m
进行addslashes函数处理:
再对提交的参数使用连接符-
进行分割存到$par
数组中,其中第一个元素是module,第二个元素是method,例如url:http://127.0.0.1/?m=vod-type-id-2.html
表示的就是/inc/module/vod.php,并且method=type,$tpl->P['id']=2
。
漏洞发生在/inc/common/template.php
文件类方法ifex()
中的eval语句:
首先给出paylaod:
1 | http://127.0.0.1/index.php?m=vod-search&wd={if-A:phpinfo()}{endif-A} |
根据之前的分析,找到/inc/common/vod.php文件的search处:
1 | # /inc/module/vod.php |
也就是说$tpl->P["wod"]='{if-A:phpinfo()}{endif-A}'
,而且$tpl->H
等于"/template/paody/html/vod_search.html"
的内容,$tpl->P["key"]
等于$tpl->P["wod"]
。接着$tpl->H
的内容还做了替换,把{type:key}
替换成{if-A:phpinfo()}{endif-A}'
继续看index.php页面,找到相应模块后,会调用template.php文件中的ifex()函数:
开头的$this->H
在/inc/module/vod.php
文件中已经定义。$labelRule
等于/{if-([\s\S]*?):([\s\S]+?)}([\s\S]*?){endif-\1}/is
,然后在$this->H
中用这个pattern匹配,结果是一个二维数组,存储在$iar
中。而payload中的phpinfo()将存储在$iar[2]
中。
上面我们已经提到过苹果CMS使用be函数来获取参数
其中arr情况没有过滤,因此可以寻找一个arr的点。在/admin/tpl/module/art.php文件中存在:
1 | elseif($method=='typesaveall') |
$t_id参数使用了arr方法,并且代入了SQL语句中,但是POST存在如下过滤:
1 | $postfilter="^\\+\/v(8|9)|\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|<\\s*img\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; |
可以使用布尔盲注,另外不能使用逗号。substring方法的from…for…可以绕过逗号 的限制:SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
。payload:
1 | POST /admin/index.php?m=art-typesaveall HTTP/1.1 |
此为正确查询,会把所有的条目都修改掉: