代码审计

[GDOUCTF 2023]受不了一点

0x00

这个就是代码审计

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
<?php
error_reporting(0);
header("Content-type:text/html;charset=utf-8");
if (isset($_POST['gdou']) && isset($_POST['ctf'])) {
$b = $_POST['ctf'];
$a = $_POST['gdou'];
if ($_POST['gdou'] != $_POST['ctf'] && md5($a) === md5($b)) {
if (isset($_COOKIE['cookie'])) {
if ($_COOKIE['cookie'] == 'j0k3r') {
if (isset($_GET['aaa']) && isset($_GET['bbb'])) {
$aaa = $_GET['aaa'];
$bbb = $_GET['bbb'];
if ($aaa == 114514 && $bbb == 114514 && $aaa != $bbb) {
$give = 'cancanwordflag';
$get = 'hacker!';
if (isset($_GET['flag']) && isset($_POST['flag'])) {
die($give);
}
if ($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag') {
die($get);
}
foreach ($_POST as $key => $value) {
$$key = $value;
}
foreach ($_GET as $key => $value) {
$$key = $$value;
}
echo $flag;
} else {
echo "洗洗睡吧";
}
} else {
echo "行不行啊细狗";
}
}
} else {
echo '菜菜';
}
} else {
echo "就这?";
}
} else {
echo "别来沾边";
}

0x01

image-20240125184501023

这个地方只需要进行数组绕过就可以了

image-20240125184614075

设置cookie

image-20240125184636644

image-20240125184707258

两个等号这个是弱比较

php比较绕过(强比较“===”/弱比较“==“)-CSDN博客

image-20240125184819978

这个地方只需要设置一个flag,而且这个部分并没有对其他的参数进行过滤,我们只需要将其他参数设置成flag然后Falg使用这个参数就可以了

image-20240125185033074

[鹤城杯 2021]Middle magic

0x00

运用的知识点

  1. 换行符的url编码为 %0a 空格的编码为 %20
  2. 正则匹配

0x01

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
<?php
highlight_file(__FILE__);
include "./flag.php";
include "./result.php";
if(isset($_GET['aaa']) && strlen($_GET['aaa']) < 20){

$aaa = preg_replace('/^(.*)level(.*)$/', '${1}<!-- filtered -->${2}', $_GET['aaa']);

if(preg_match('/pass_the_level_1#/', $aaa)){
echo "here is level 2";

if (isset($_POST['admin']) and isset($_POST['root_pwd'])) {
if ($_POST['admin'] == $_POST['root_pwd'])
echo '<p>The level 2 can not pass!</p>';
// START FORM PROCESSING
else if (sha1($_POST['admin']) === sha1($_POST['root_pwd'])){
echo "here is level 3,do you kown how to overcome it?";
if (isset($_POST['level_3'])) {
$level_3 = json_decode($_POST['level_3']);

if ($level_3->result == $result) {

echo "success:".$flag;
}
else {
echo "you never beat me!";
}
}
else{
echo "out";
}
}
else{

die("no");
}
// perform validations on the form data
}
else{
echo '<p>out!</p>';
}

}

else{
echo 'nonono!';
}

echo '<hr>';
}

?> nonono!

话不多说了我们来看看第一关说了个啥

image-20240127201514270

他的意思就是说aaa最后是字符串pass_the_level_1#

但是上面他又会以level为界限分为两个部分,但是请注意

image-20240127201649317

他只会匹配一行,这个函数我们如果没有的匹配的话就会直接使用get传入的aaa

来做一个实验

image-20240127201906463

发现可行,直接执行

最后还要将#编码一下,因为这个是url里锚点

image-20240127202055413

0x02

我们继续来看

image-20240127202331765

这个是一个弱比较

本身不一样,但是值一样

直接使用数组绕过

image-20240127202450133

0x03

image-20240127202519100

直接看这个的意思就是说

json解密之后,然后一个弱比较

PHP: PHP 类型比较表 - Manual

image-20240127203057708

就一个一个尝试

发现不需要填写就可以绕过了

也就是值为null

image-20240127203138249


代码审计
https://tsy244.github.io/2024/01/25/CTF刷题记录/WEB/代码审计/
Author
August Rosenberg
Posted on
January 25, 2024
Licensed under