具体缘由乌云说的很清楚了
简单来说,就是portalcp_diy.php中,在进行上传模板文件的处理时,调用了import_diy进行操作,在import_diy把上传的xml文件进行一定的处理后,将blockdata这个xml标签中的内容传给block_import,block_import检测了一些xml标签后,将其中style标签下的hash标签作为id,将其中的值插入数据库。于是注入一个特定的xml就可以修改任意模板。
在上述漏洞上的补充:
block_import的xml处理有点晕,审计的时候应该记录一下每个变量的声明和值,
一开始其中的C::t('common_block_style')->fetch_all_by_hash($hashes) 不理解,发现C就是core类,core中的t方法return self::_make_obj($name, 'table', DISCUZ_TABLE_EXTENDABLE); 在_make_obj中,在本次调用中是用来生成表名的,在insert部分,传了一个common_block_style进去,然后再_make_obj中进行拼接成为table_common_block_style,并返回这个表名,在数据库中也能查得到,其中的值也确实是正确的。