NSSCTF做题(3)

这篇具有很好参考价值的文章主要介绍了NSSCTF做题(3)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[鹤城杯 2021]EasyP

代码审计

NSSCTF做题(3),NSSCTF,java,服务器,数据库

<?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

NSSCTF做题(3),NSSCTF,java,服务器,数据库

[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里面显示根目录)

NSSCTF做题(3),NSSCTF,java,服务器,数据库

找到了flag文件

 接着构造:

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

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

NSSCTF做题(3),NSSCTF,java,服务器,数据库

找到了flag

[LitCTF 2023]1zjs

NSSCTF做题(3),NSSCTF,java,服务器,数据库 在js代码里边找到这个页面,应该是一个加密,破解一下 最后是jsfuck加密

NSSCTF做题(3),NSSCTF,java,服务器,数据库

破解后去掉[]就可以了

[LitCTF 2023]Ping

NSSCTF做题(3),NSSCTF,java,服务器,数据库 输入命令有回显,应该是js前端的,看看给他禁用掉

NSSCTF做题(3),NSSCTF,java,服务器,数据库

 输入命令:

NSSCTF做题(3),NSSCTF,java,服务器,数据库

还是用通配符绕过

NSSCTF做题(3),NSSCTF,java,服务器,数据库

找到了flag

 127.0.0.1 | cat /flagNSSCTF做题(3),NSSCTF,java,服务器,数据库

[LitCTF 2023]Follow me and hack me

直接get,post传参

NSSCTF做题(3),NSSCTF,java,服务器,数据库

[鹏城杯 2022]简单包含 

NSSCTF做题(3),NSSCTF,java,服务器,数据库 

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

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

NSSCTF做题(3),NSSCTF,java,服务器,数据库

<?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读取就完事了

NSSCTF做题(3),NSSCTF,java,服务器,数据库

 解码得到flag

NSSCTF做题(3),NSSCTF,java,服务器,数据库

[SWPUCTF 2022 新生赛]ez_ez_php 

NSSCTF做题(3),NSSCTF,java,服务器,数据库 

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

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


语法

substr(string,start,length)

NSSCTF做题(3),NSSCTF,java,服务器,数据库 这是函数substr()的用法

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

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

NSSCTF做题(3),NSSCTF,java,服务器,数据库

没绕过去

NSSCTF做题(3),NSSCTF,java,服务器,数据库 

去掉php,审题不仔细了

NSSCTF做题(3),NSSCTF,java,服务器,数据库 ?file=php://filter/read=convert.base64-encode/resource=flag

NSSCTF做题(3),NSSCTF,java,服务器,数据库 

 文章来源地址https://www.toymoban.com/news/detail-730775.html

 

到了这里,关于NSSCTF做题(3)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 本地数据库迁移到云端服务器

    工具迁移xtrabackup 创建云服务器——通过云服务器提供的公网地址远程连接XShell——利用迁移工具将数据库从本地迁移到云服务器 ①本地数据库安装xtrabackup --target-dir表示备份文件存放的目录 ②备份本地数据库 ③桌面作为中介接收、上传数据库 ①将数据库文件上传到云服务

    2024年04月25日
    浏览(33)
  • Mysql数据库迁移|如何把一台服务器的mysql数据库迁移到另一台服务器上的myql中

      那么这里博主先安利一下一些干货满满的专栏啦! Linux专栏 https://blog.csdn.net/yu_cblog/category_11786077.html?spm=1001.2014.3001.5482 操作系统专栏 https://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482 手撕数据结构 https://blog.csdn.net/yu_cblog/category_11490888.html?spm=1001.2014.3001.5482 一、在

    2024年02月06日
    浏览(61)
  • 【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库

    🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长! 没有找到合适的参考链接,在gpt的协作下一步完成了这份指南。欢迎交流 ~ 在Python项目中,如果你的目标是通过JDBC连接到位于Linux远程服务器上

    2024年04月28日
    浏览(41)
  • 如何限定IP访问服务器端口(只允许指定IP访问数据库服务器的1433端口)

    1、找到“控制面板”-“Windows防火墙”-“高级设置”-“入站规则” 2、选中左侧的\\\"入站规则\\\",并点击右侧的\\\"新建规则\\\"   3、选择\\\"端口\\\",点击\\\"下一步\\\" 4、输入要限定访问的端口,这里是要限定访问数据库1433端口的IP,点击\\\"下一步\\\"    5、选择\\\"只允许连接(A)\\\"-“下一步”-“

    2024年02月12日
    浏览(34)
  • 当前服务器版本不支持该功能,请联系经销商升级服务器 - - 达梦数据库报错

    某项目使用标准版数据库中,使用insert into 正常操作表,插入数据时报错,表为普通表。 -539:当前服务器版本不支持该功能,请联系经销商升级服务器

    2024年02月13日
    浏览(42)
  • GBASE南大通用 访问其他数据库服务器

    通过限定数据库对象(表、视图、同义词或例程)的名称,您可访问外部数据库中的任何 表或例程。 当外部表与当前数据库位于同一数据库服务器上时,您必须以数据库名称和冒号限定对象 名称。例如,要引用不是本地数据库的数据库中的表,下列 SELECT 语句访问来自外部

    2024年01月23日
    浏览(36)
  • MongoDB常用的操作(服务器、数据库、集合)

    前面两篇已经介绍了MongoDB系统架构及其BSON数据类型。本文将讲解基本的MongoDB操作。 一、MongoDB启动命令 启动MongoDB 查看是否启动成功 重启MongoDB 关闭MongoDB 二、使用init命令操作MongoDB 启动MongoDB 查看是否启动成功 重启MongoDB 关闭MongoDB 三、启动mongodb客户端 查看该服务是否启动

    2024年02月07日
    浏览(46)
  • 服务器管理平台开发(2)- 设计数据库表

    本篇文章主要对数据管理平台数据库表设计进行介绍,包括单库多表设计、SQL语句、视图构造等 设备品牌、序列号、型号等使用业务主表进行记录,逻辑磁盘、PCI设备可能出现1对N的情况,分别使用PCI设备表、Mac地址表、逻辑磁盘表、应用程序表、登录日志表进行记录 构建虚

    2024年01月22日
    浏览(51)
  • unity 3d与服务器以及数据库进行数据交互!!!(UnityWebRequest)

    数字孪生最重要的一步便是数据的通信,这里的数据通信包含了,数字模型和物理模型之间的通信。而对于数字模型在前面的介绍(跳转前面介绍的),我们采用的是unity3d来完成的,当然这里介绍的数据交互,重要也是以unity3d来介绍,但是大致的思想和原理都是一样的。下

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包