background

之前的一次打过这个系统 然后发现与之前打的系统是一样的 之前怎么打进去的呢?是别人iis短文件名泄露拿的源码审的洞。至于poc啊,我也没有啊,报告里也没写全这个poc。但是好在有路径,但是数据包我是真看不懂,一堆啥玩意啊,他报告里也没写,就标了个漏洞点的函数。那只能我自己试试了,然后我才知道,虽然能直接上aspx的木马,是解释型语言,但是这玩意同样要编码,直接是看不到源码的,得反编译一下。从来没接触过,只能试试,用的ilspy。

路由追踪

web页面的触发点和路径已经有了 现在就是不知道需要提交什么样的参数

image-20240903200243567

打开对应的asmx页面

image-20240903201017556

发现啥也没有 东西都在app_code里面去了 然后类名也有了 直接反编译这个dll 找到对应的类

image-20240903200955274

点开这个箭头里面有一大堆类

image-20240903201159190

找到了 然后发现这里是走了DESDeCode

image-20240903201327818

直接进到CsSubDes里去看 这里就是常规的DES解密 秘钥都有了 然后就手扣报告里的数据拿去解密

image-20240903201528867

需要解密出来的结果是900 因为最终要走SubUpLoadImage实现文件上传

image-20240903202055322

死活解不出来 其实是我只放了key却忽略了iv 这里的key和iv是一样的 我上面代码里标出来了 然后就解决了数据加密的问题

image-20240903202625169

image-20240903202714575

然后就是上shell

image-20240903202750410

很明显了 内容base64编码一下 然后路径 文件名称 路径就是./

image-20240904081754376

结果洞修了 废了 试了下解析漏洞 畸形文件名啥的都不行 开发还有有点东西啊 文件名过滤了?这些字符 这个点八成是打不了了

image-20240904082100089

洞肯定还有 只不过我懒得看了 主要是也看不懂 这是关键 本来是懒得看的 但是写到这里有感觉还是可以再看看的 于是有了下面的内容

找上传

找到了一个上传的

image-20240904112140036

构造数据的时候发现不行 仔细一看他跟上面的不是一个口子 就是?op=的值不一样

这边的数据采用了新的算法 挂不得说之前方法构造的数据不一样了

image-20240904112306664

跟一下算法 又是个AES但是这里的keys是字节啊 不是字符串啊 怎么办?

image-20240904112354255

我哪懂这个啊 直接和GPT斗智斗勇 说实话 感觉GPT真的是越来越蠢了 真的改了好久才整出来 一下子keys没用上 一下子IV没用上

from Crypto.Cipher import DES
from Crypto.Util.Padding import pad
import base64

# 定义密钥和 IV
PVAR_KEY = "xxxxxxxx" # 密钥字符串
KEYS = PVAR_KEY.encode('utf-8') # 使用给定的密钥
IV = bytes([0, 0, 0, 0, 0, 0, 0, 0]) # 示例 IV,通常应随机生成

def encrypt_des(plaintext):
if len(KEYS) != 8:
raise ValueError("密钥长度必须为8字节")

# 创建 DES 加密器
cipher = DES.new(KEYS, DES.MODE_CBC, IV)

# 填充明文以适应 DES 块大小(8字节)
padded_plaintext = pad(plaintext.encode(), DES.block_size)

# 执行加密
ciphertext = cipher.encrypt(padded_plaintext)

# 将密文编码为 Base64 以便于传输和存储
return base64.b64encode(ciphertext).decode()

# 示例用法
plaintext = "要加密的数据"
ciphertext = encrypt_des(plaintext)
print(f"密文: {ciphertext}")

构造数据之后发现还不行 仔细一看这里还过了个函数 并且需要结果为ok

image-20240904112708329

跟进去 啥也看不懂啊 数据库?查询?我这里还要指定库名。

image-20240904112749855

我试着放一下sql语句 压根不行啊 他这里有限制 老早就过滤了 在最外层 就算能够执行语句了 怎么办我也没思路 于是放弃

image-20240904112853779

峰回路转

还是之前的接口 发现另一个口子 其实跟上面的是一样的 不用管下面数据库 文件能写入不就完事了吗 于是写文件 然后发现base64解码错误 后面感觉应该是+的原因 把base64整体url编码一下再AES 就OK了 出货

image-20240904113021060