2.漏洞分析

我们先随便下载一个主题:

然后对illdy/style.css进行如下更改:

接着更改文件夹名字再打包:

构造好之后我们登录后台上传该主题文件,同时开始动态调试。

首先进入wp-admin/includes/class-theme-installer-skin.php中第55-82行:

其中$theme_info的值如下:

Alt text

其中stylesheettemplate的值为我们更改的文件夹名,headers.Name为更改的style.css中的Name$theme_info中有我们可控的payload,其调用display函数后赋值给$name$name直接与html拼接,所以关键点在display函数上,动态调试跟进到wp-includes/class-wp-theme.php中第630-646行:

由之前的调用可知,这里的$header的值为Name。首先看$this-get($header),在wp-includes/class-wp-theme.php中第594-617行:

这里省略了与漏洞无关的部分,程序进入了$this->sanitize_header,在wp-includes/class-wp-theme.php第661-705行:

这里执行了Name这个分支,可以看到程序使用wp_kses$value的值进行了过滤,仅允许$header_tags中的html符号,所以我们headers.Name的值<svg onload=alert(1234)>是不合法的,$value值被赋为空。

然后程序回到了display函数,根据动态调试可以知道程序执行了$value = $this->markup_header( $header, $value, $translate );这个条件分支,再跟进,在wp-includes/class-wp-theme.php中第720-748行: