Discuz!x xss反弹后台无防御sql注入getshell

Discuz!x xss反弹后台无防御sql注入getshell,这里的xss只是做一个药引子,因为xss来自日志功能,然而这个日志功能却又默认关闭的,为了测试我们开启它。这个漏洞应该是所有dz通杀的,我下载了最新版本的所以测试通过......

首先我们开启日志功能,然后存储一个xss看看:

测试一个xss页面:


我们调到文章页面看看,是否被执行了:

下来我们看看怎样把这个发给管理员呢,底下有一个举报页面:

我们以管理员的身份看看这个后台的举报请求:

这个过程我们分析完毕了,下来我们看看后台一处,无防御的sql注入:

我们这里就不分析代码了,这里代码好曲折啊,大致思路我们给一张图,就可以看清楚
1.设置表前缀,抓包重放如下:

 

2.然后我们改一下表前缀的注入:

 

3.我们来监控一下,sql语句的执行过程,我们就明白了,这个漏洞产生的原因

a.当你第一次点击的时候,这个sql语句不会执行,然后你多提交几次,就可以了

b.数据第一次流进了这个表:

看以看出来,做了过滤
c.但是当数据取出来的时候,这个就没有在进行转义,直接从数据库获取,所以造成漏洞:

那么我们去这个目录看看是否生成了我们想要的shell:

 
这么一来所有的来龙去买我们都搞清楚了,那么怎么样把这两个组合起来,因为有表单hash的存在我们怎么通过xss搞定,思路如下:

1.我们通过ajax 首先对表单页面进行一次get访问,大家都知道dz会隐藏的形式写进表单的一个字段为formhash

2.有了这个formhash的话我们就可以,再次发送ajax请求,直接发送五次然后geshell

3.有人要问为什么要发送五次,这三次分别是什么

a.第一次是get请求获取formhash

b.第二,三次是发送构造的包,因为这第一次发送,是不会成功的,它要利用上次的发包,再二次构造,所以这里面发两次才能产生shell

c.第四,五次请求就是还原人家本来的面目,这里原理是相同的

接下来看我们的代码:

我们在远端的服务器放置的js内容如下:

 

然后依照刚才的解法,我们应该在那个目录下生成了一个shell.php

最后我们的站点还是可以正常访问,不留痕迹