从前端JS逆向到发现后端越权漏洞的渗透测试之旅

这篇具有很好参考价值的文章主要介绍了从前端JS逆向到发现后端越权漏洞的渗透测试之旅。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本篇文章首发先知社区,作者为本公众号。
怎么通过js文件查看越权漏洞,后端

前端分析

首先搜索请求接口,未发现关键加密点

怎么通过js文件查看越权漏洞,后端

根据请求参数进行搜索

怎么通过js文件查看越权漏洞,后端

在js文件中找到aes加密key、iv

怎么通过js文件查看越权漏洞,后端

eval(function(p, a, c, k, e, r) {
    e = function(c) {
        return c.toString(36)
    }
    ;
    if ('0'.replace(0, e) == 0) {
        while (c--)
            r[e(c)] = k[c];
        k = [function(e) {
            return r[e] || e
        }
        ];
        e = function() {
            return '[0-9a-x]'
        }
        ;
        c = 1
    }
    ;while (c--)
        if (k[c])
            p = p.replace(new RegExp('\\b' + e(c) + '\\b','g'), k[c]);
    return p
}('(3($){e();2 j=$.f;$.f=3(1){5(1.0!=\'\'&&1.0!=g){2 h=9 k();2 a=9 k();5(1.contentType=="application/json"){a=1.0}l{for(2 m in 1.0){2 4=m;5(1.0[4]!=g&&1.0[4].length>460){a[4]=1.0[4]}l{h[4]=1.0[4]}}}1.0=a;1.0.keyScript=n(o(JSON.stringify(h)))}2 p=$.extend(1,{beforeSend:3(jqXHR,settings){}});i j(p)}})(jQuery);3 e(){5(6.7==g||6.7==null||6.7==\'\'){$.f({type:\'GET\',async:false,url:Globals.ctx+"/e/generate",0:{nowDate:9 Date()},q:3(0){5(0.q){6.7=0.body}}})}}3 o(b){2 c=9 JSEncrypt();c.setPublicKey(6.7);2 d=c.encryptLong(b);i d.r()}3 n(b){2 s=8.t.u.v("xxxxx");2 w=8.t.u.v(b);2 d=8.AES.c(w,s,{x:8.x.ECB,padding:8.pad.Pkcs7});i d.r()}', [], 34, 'data|opt|var|function|arrayName|if|window|publicKey|CryptoJS|new|noEncrypt|message|encrypt|encrypted|dynamicKey|ajax|undefined|isEncrypt|return|_ajax|Object|else|index|AesEncrypt|RsaEncrypt|_opt|success|toString|key|enc|Utf8|parse|srcs|mode'.split('|'), 0, {}))

继续跟进,发现了两个加密函数:RsaEncrypt、AesEncrypt

怎么通过js文件查看越权漏洞,后端

搜索这两个函数没有太多信息。我们继续阅读混淆的js代码。

('(3($){e();2 j=$.f;$.f=3(1){5(1.0!=\'\'&&1.0!=g){2 h=9 k();2 a=9 k();5(1.contentType=="application/json"){a=1.0}l{for(2 m in 1.0){2 4=m;5(1.0[4]!=g&&1.0[4].length>460){a[4]=1.0[4]}l{h[4]=1.0[4]}}}1.0=a;1.0.keyScript=n(o(JSON.stringify(h)))}2 p=$.extend(1,{beforeSend:3(jqXHR,settings){}});i j(p)}})(jQuery);3 e(){5(6.7==g||6.7==null||6.7==\'\'){$.f({type:\'GET\',async:false,url:Globals.ctx+"/e/generate",0:{nowDate:9 Date()},q:3(0){5(0.q){6.7=0.body}}})}}3 o(b){2 c=9 JSEncrypt();c.setPublicKey(6.7);2 d=c.encryptLong(b);i d.r()}3 n(b){2 s=8.t.u.v("xxxxx");2 w=8.t.u.v(b);2 d=8.AES.c(w,s,{x:8.x.ECB,padding:8.pad.Pkcs7});i d.r()}', [], 34, 'data|opt|var|function|arrayName|if|window|publicKey|CryptoJS|new|noEncrypt|message|encrypt|encrypted|dynamicKey|ajax|undefined|isEncrypt|return|_ajax|Object|else|index|AesEncrypt|RsaEncrypt|_opt|success|toString|key|enc|Utf8|parse|srcs|mode'.split('|'), 0, {}))

这里在进行RSA加密的时候,调用了JSEncrypt()类。

怎么通过js文件查看越权漏洞,后端

该js为vue的加密库。在该js文件中搜索Publickey、encode字段,发现了几个函数。

怎么通过js文件查看越权漏洞,后端

但是我们在相关函数下断点并不会经过。最后我们在JSEncrypt.prototype.encryptLong函数中下断点,跟进关键加密流程。

JSEncrypt.prototype.encryptLong = function(string) {
            var k = this.getKey();
            try {
                var ct = "";
                var bytes = new Array();
                bytes.push(0);
                var byteNo = 0;
                var len, c;
                len = string.length;
                var temp = 0;
                for (var i = 0; i < len; i++) {
                    c = string.charCodeAt(i);
                    if (c >= 0x010000 && c <= 0x10FFFF) {
                        byteNo += 4;
                    } else if (c >= 0x000800 && c <= 0x00FFFF) {
                        byteNo += 3;
                    } else if (c >= 0x000080 && c <= 0x0007FF) {
                        byteNo += 2;
                    } else {
                        byteNo += 1;
                    }
                    if ((byteNo % 117) >= 114 || (byteNo % 117) == 0) {
                        if (byteNo - temp >= 114) {
                            bytes.push(i);
                            temp = byteNo;
                        }
                    }
                }
                if (bytes.length > 1) {
                    for (var i = 0; i < bytes.length - 1; i++) {
                        var str;
                        if (i == 0) {
                            str = string.substring(0, bytes[i + 1] + 1);
                        } else {
                            str = string.substring(bytes[i] + 1, bytes[i + 1] + 1);
                        }
                        var t1 = k.encrypt(str);
                        ct += t1;
                    }
                    ;if (bytes[bytes.length - 1] != string.length - 1) {
                        var lastStr = string.substring(bytes[bytes.length - 1] + 1);
                        ct += k.encrypt(lastStr);
                    }
                    return hex2b64(ct);
                }
                var t = k.encrypt(string);
                var y = hex2b64(t);
                return y;
            } catch (ex) {
                return false;
            }
        }
        ;
        JSEncrypt.version = "3.0.0-rc.1";
        return JSEncrypt;
    }());

在这里下断点

断点跟进,可以发现先进行了RSA加密,得到十六进制进行base64编码。

怎么通过js文件查看越权漏洞,后端

继续跟进断点,发现跳转到VM虚拟机中。

怎么通过js文件查看越权漏洞,后端

两个加密函数一目了然

function RsaEncrypt(message) {
    var encrypt = new JSEncrypt();
    encrypt.setPublicKey(window.publicKey);
    var encrypted = encrypt.encryptLong(message);
    return encrypted.toString()
}
function AesEncrypt(message) {
    var key = CryptoJS.enc.Utf8.parse("xxxxx");
    var srcs = CryptoJS.enc.Utf8.parse(message);
    var encrypted = CryptoJS.AES.encrypt(srcs, key, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString()
}

核心代码为

(function($) {
    dynamicKey();
    var _ajax = $.ajax;
    $.ajax = function(opt) {
        if (opt.data != '' && opt.data != undefined) {
            var isEncrypt = new Object();
            var noEncrypt = new Object();
            if (opt.contentType == "application/json") {
                noEncrypt = opt.data
            } else {
                for (var index in opt.data) {
                    var arrayName = index;
                    if (opt.data[arrayName] != undefined && opt.data[arrayName].length > 460) {
                        noEncrypt[arrayName] = opt.data[arrayName]
                    } else {
                        isEncrypt[arrayName] = opt.data[arrayName]
                    }
                }
            }
            opt.data = noEncrypt;
            opt.data.keyScript = AesEncrypt(RsaEncrypt(JSON.stringify(isEncrypt)))
        }
        var _opt = $.extend(opt, {
            beforeSend: function(jqXHR, settings) {}
        });
        return _ajax(_opt)
    }
}
)(jQuery);

1、dynamicKey();动态生成key。

2、将keyScript赋值为aes、rsa加密的结果。

opt.data.keyScript = AesEncrypt(RsaEncrypt(JSON.stringify(isEncrypt)))

3、dynamicKey函数如下

function dynamicKey() {
    if (window.publicKey == undefined || window.publicKey == null || window.publicKey == '') {
        $.ajax({
            type: 'GET',
            async: false,
            url: Globals.ctx + "/xxx/xxxx",
            data: {
                nowDate: new Date()
            },
            success: function(data) {
                if (data.success) {
                    window.publicKey = data.body
                }
            }
        })
    }
}

一开始的key是通过动态调试获取的

怎么通过js文件查看越权漏洞,后端

但是后续渗透发现,每次获取一个key都会发起一个请求包。

怎么通过js文件查看越权漏洞,后端

致此加密方式已经分析完毕。

原始数据获取

因为是通过RSA加密,我们无法拿到私钥无法进行解密。因为我们不知道请求发送的原始数据。只能根据公钥来加密数据,因此接下来就是获取原始数据。

之前我们发现一个函数JSEncrypt.prototype.encryptLong,接受一个字符串,然后对该字符串进行加密,最后跳转到了VM虚拟机中的代码。

所以我们打印该strings,查看是否是原始数据。

怎么通过js文件查看越权漏洞,后端

在burp中使用插件,将var k=this.getKey();替换为var k = this.getKey();console.log(string);。最终的效果是可以在控制台中打印出原始数据。

怎么通过js文件查看越权漏洞,后端

数据加密

接下来就是对数据进行加密,加密逻辑很简单:获取公钥-RSA加密-AES加密。AES知道iv、加密方式、key比较简单。比较难得就是RSA加密。

首先网站使用了vue的JSEncrypt库。我们将整个JSEncrypt文件拷贝下来,使用工具对数据进行加密。

window = this;
navigator = this;
//以上两行主要是防止代码报错
(JSEncrypt文件内容)
//加密函数直接使用网站自带的,然后自己把公钥贴上去就行。也可以引用网站的公钥获取函数,自动获取公钥匙。
function RsaEncrypt(message) {
    var encrypt = new JSEncrypt();
    encrypt.setPublicKey("-----BEGIN PUBLIC KEY-----\nxxxxxx\n-----END PUBLIC KEY-----");
    var encrypted = encrypt.encryptLong(message);
    return encrypted.toString()
}

console.log(RsaEncrypt("{\"id\":\"138652\"}"))

效果如图

怎么通过js文件查看越权漏洞,后端

自动化加密

在自动化加密的时候,需要调用python与js。这里使用execjs库。最终代码如下

怎么通过js文件查看越权漏洞,后端

本文由mdnice多平台发布文章来源地址https://www.toymoban.com/news/detail-844426.html

到了这里,关于从前端JS逆向到发现后端越权漏洞的渗透测试之旅的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 渗透测试-漏洞探测

    浅谈一下web漏洞榜Top10! 1. SQL注入漏洞:通过在Web应用程序中注入恶意SQL语句,攻击者可以获取或修改敏感数据、控制Web应用程序等。 2. XSS攻击:跨站脚本攻击漏洞是一种利用Web应用程序中的漏洞,在用户的浏览器中注入恶意代码,例如JavaScript代码,从而攻击用户的计算机

    2024年02月15日
    浏览(43)
  • 渗透测试之逻辑漏洞

    那么这个修改价格具体是修改哪一步时的价格呢?在我看来,你可以在这三个步骤当中的随便一个步骤进行修改价格测试,如果前面两步有验证机制,那么你可在最后一步付款时进行抓包尝试修改金额,如果没有在最后一步做好检验 存在可修改订单状态的接口,比如确认收货

    2024年02月12日
    浏览(41)
  • 简单漏洞复现_网络渗透测试

    一、漏洞渗透测试 1、靶机(Windows)安装easy file sharing server(efssetup_2018.zip),该服务存在漏洞。 2、利用Nmap扫描发现靶机(Windows)运行了该服务。 3、利用该漏洞,使得靶机运行计算器。 获取easy file sharing server 链接:https://pan.baidu.com/s/1WRasVlAb_st--7ZeOkwNVQ  提取码:1vx1 主要步骤 1

    2024年02月05日
    浏览(59)
  • 渗透测试漏洞原理之---【组件安全】

    A9:2017-Using Components with Known Vulnerabilities A06:2021 – Vulnerable and Outdated Components 组件(例如:库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用,可能会造成严重的数据 丢失或服务器接管。同时,使用含有已知漏洞的组件

    2024年02月09日
    浏览(46)
  • 渗透测试漏洞原理之---【业务安全】

    1.1业务安全现状 1.1.1、业务逻辑漏洞 近年来,随着信息化技术的迅速发展和全球一体化进程的不断加快,计算机和⽹络已经成为与所有⼈都息息相关的⼯具和媒介,个⼈的⼯作、⽣活和娱乐,企业的管理,乃⾄国家的发展和改⾰都⽆处其外。信息和互联⽹带来的不仅仅是便利

    2024年02月09日
    浏览(41)
  • [渗透测试]—5.2 网络协议漏洞

    在这一章节中,我们将学习网络协议漏洞,如ARP欺骗、DNS欺骗等,并通过实例来讲解如何利用这些漏洞进行网络渗透测试。请放心,我们会尽量讲得详细、通俗易懂,并提供尽可能多的实例。 网络协议是计算机网络中设备之间通信的规则。然而,许多网络协议在设计时并未充

    2024年02月11日
    浏览(50)
  • 渗透测试--2.漏洞探测和利用

    目录 一.漏洞分类 二.漏洞探测 三.漏洞利用 四.漏洞扫描 1.Nessus 2.Web应用漏洞扫描器——DVWA 五.Metasploit漏洞利用 网络漏洞 系统漏洞 应用漏洞  人为不当配置 渗透测试是一种测试网络、应用程序和系统安全性的方法,旨在发现并利用漏洞和安全漏洞,以评估系统的安全性。

    2024年02月05日
    浏览(59)
  • 前端安全——最新:lodash原型漏洞从发现到修复全过程

    人生的精彩就在于你永远不知道惊喜和意外谁先来,又是一个平平无奇的早晨,我收到了一份意外的惊喜——前端某项目出现lodash依赖原型污染漏洞。咋一听,很新奇。再仔细一看,呕吼,更加好奇了~然后就是了解和修补漏洞之旅。 最后的最后,却发现其实这个漏洞修复起

    2024年04月10日
    浏览(61)
  • web渗透测试漏洞复现:Elasticsearch未授权漏洞复现

    Elasticsearch 是一款 Java 编写的企业级搜索服务,它以分布式多用户能力和全文搜索引擎为特点,采用 RESTful web 接口。这款搜索引擎由 Java 开发,作为 Apache 许可下的开源软件发布,是流行的企业级搜索引擎之一。Elasticsearch 的增删改查操作都通过 http 接口完成。开源的版本可能

    2024年04月10日
    浏览(48)
  • 【渗透测试】Struts2系列漏洞

    🌷S2-001 🌼1、漏洞原理 🌼2、影响版本 🌼3、验证方法 🌷S2-005 🌼1、漏洞原理 🌼2、影响版本 🌼3、验证方法(无回显) 🌼4、验证方法(有回显) 🌷S2-007 🌼1、漏洞原理 🌼2、影响版本 🌼3、漏洞验证 🌷S2-008 🌼1、漏洞原理 🌼2、影响版本 🌼3、漏洞验证 🌷S2-009 🌼

    2023年04月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包