前言
这是作者通过代码审计挖的第一个cve,目前已经在cve官网公开。本身没多少技术含量,主要是分享自己学习代码审计的过程。
复现
cve编号 :CVE-2024-39174.
环境
yzmcmsV7.2
过程
该cms有一个注册用户发表文章的功能
我们注意到这里使用的编辑器是富文本编辑器ueditor,去网上查询该组件的公开漏洞进行尝试,发现了一个存储型xss漏洞。
漏洞利用过程就是通过burpsuite抓包将原本要发送的文章内容替换为
%3Cp%3E1111111">
%3Cbr%2F%3E%3C%2Fp%3E
执行后发现失败
查看html源码发现onerror事件被过滤替换
知道存在函数来过滤注入,所以去源码里审计。发现一个专门用于过滤xss攻击的函数
函数主要部分如下
$string =
preg_replace
('/[-BCE-FF]+/S', '', $string);
$parm1 =
array
('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
$parm2 =
array
('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload', 'onpointerout', 'onfullscreenchange', 'onfullscreenerror', 'onhashchange', 'onanimationend', 'onanimationiteration', 'onanimationstart', 'onmessage', 'onloadstart', 'ondurationchange', 'onloadedmetadata', 'onloadeddata', 'onprogress', 'oncanplay', 'oncanplaythrough', 'onended', 'oninput', 'oninvalid', 'onoffline', 'ononline', 'onopen', 'onpagehide', 'onpageshow', 'onpause', 'onplay', 'onplaying', 'onpopstate', 'onratechange', 'onsearch', 'onseeked', 'onseeking', 'onshow', 'onstalled', 'onstorage', 'onsuspend', 'ontimeupdate', 'ontoggle', 'ontouchcancel', 'ontouchend', 'ontouchmove', 'ontouchstart', 'ontransitionend', 'onvolumechange', 'onwaiting', 'onwheel', 'onbegin');
函数会将所有大写字符替换为小写,所以不存在大小写绕过
于是开始思考能不能通过黑名单外的js事件来执行代码,通过查询比较发现了onpointerdown方法
简单来说该方法和onclick一样,都是当用户点击目标元素时触发。