一次任意文件下载和全站信息泄露的漏洞挖掘经历

noob
2022-03-10 / 4 评论 / 310 阅读 / 正在检测是否收录...
0x00

考研人考研魂,本该考研的我还赖在这里挖洞...不过多亏这次挖洞,有了我下面的经历。早上背完英语单词,瞥到浏览器上某项目的标签,又没忍住,开搞。

0x01

首先进入该系统,可以看到注册口中有一个上传营业执照的位置
图1.png
于是尝试上传,都可以成功,但是不能获取路径,无法利用,先记下。
图2.png
注册成功后,进入该系统,在httphistory中发现一个可以返回系统中模板文件目录的包,可以看到系统中作为模板文件以及对应的参数
图3.png
于是尝试将图2中上传文件的参数进行拼接,然后惊喜的发现可以获取当前用户的上传文件目录
图4.png
那么说明参数fileType01代表的是用户id,于是尝试找到带有模板文件的用户,成功找到:
图5.png
现在可以拿到文件各种参数,那么下一步就是要找到如何读取或者下载文件,在系统中下载模板位置找到:
图6.png
但是此时获取的参数是加密的,抱着尝试的想法,第一次尝试解密,然后F12,在某一js文件中找到fileRelatId参数,发现这是一处aes加密,且密钥在前端泄露
图7.png
图8.png
然后编写js脚本,加密的参数同样为filrRelatId,尝试解密,成功:
图9.png
图10.png
图11.png

poc
const CryptoJS = require('crypto-js'); //引用AES源码js

const key = CryptoJS.enc.Utf8.parse('104a45db14f4ffde')

//解密方法
function Decrypt(word) {
    let decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
    return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}

//加密方法
function Encrypt(word) {
    let srcs = CryptoJS.enc.Utf8.parse(word);
    let encrypted = CryptoJS.AES.encrypt(srcs, key, {  mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
    return encrypted.toString();
}

到此实现了全站任意文件下载。

0x02

然后我又把目光放到了获取用户信息的包上,该包同样是加密的参数
l0kn9hb6.png
对他也进行解密,成功,可以读取到大量用户信息(商家姓名、商家名、法人姓名、手机号、邮箱、开户银行及卡号、地址、营业执照号等等敏感信息),且可以直接遍历读取
l0knb9l7.png

0x03

这次挖掘,我对加解密做出了首次尝试,虽然脚本不是我写的,甚至不是我跑的(此处感谢风溯大佬),但是这次经历让我学到了更多的越权姿势

4

评论 (4)

取消
  1. 头像
    akihi
    Android · Google Chrome

    带带

    回复
  2. 头像
    mind
    Windows 10 · Google Chrome

    好文,由浅入深,节奏便于理解。ps(大佬带带)

    回复
  3. 头像
    Ambition
    Windows 10 · FireFox

    可以转载到公众号吗会附上原创作者

    回复
  4. 头像
    1
    iPhone · Safari

    我只想知道你考研啥专业

    回复