[GXYCTF2019]StrongestMind

打开页面,提示我们计算1000次答案给flag

我们直接上脚本

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

import requests
import re
import time

url = 'http://1ab3c450-eac5-4e70-930f-c0e7bd6c577c.node5.buuoj.cn:81'
session = requests.session()
req = session.get(url).text
flag = ""

for i in range(1010):
try:
result = re.findall("\<br\>\<br\>(\d.*?)\<br\>\<br\>",req)#获取[数字]
result = "".join(result)#提取字符串
result = eval(result)#运算
print("time: "+ str(i) +" "+"result: "+ str(result))

data = {"answer":result}
req = session.post(url,data=data).text
if "flag{" in req:
print(re.search("flag{.*}", req).group(0)[:50])
break
time.sleep(0.1)#防止访问太快断开连接
except:
print("[-]")

得到flag.

题解

[GKCTF 2021]easycms

url+admin.php,我们能够进入登录页面

image-20240621194103359

题目提示了密码是五位数弱密码

我们考虑admin/admin,admin/12345,实在不行再去fuzz

但admin/12345成功登录了进去

题解cms

[BJDCTF2020]EzPHP(代码审计&create_function的使用)

我们查看源码,发现一串base32加密的字符串

image-20240620210847610

我们解码,得到一个文件

php特性

[CISCN2019 华东南赛区]Double Secret(RC4加密)

我们打开页面,同时要我们寻找secret,

这就很明显了吧,我们访问secret页面

image-20240619210204964

然后页面提示要我们输入secret的值,那不就是传参嘛,我们随便传一个值

RC4加密

[SUCTF 2019]EasyWeb(异或rce,.htaccess文件上传)

我们打开页面,发现好大一串代码,我们进行代码审计

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
<?php
function get_the_flag(){
// webadmin will remove your upload file every 20 min!!!!
$userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);
if(!file_exists($userdir)){
mkdir($userdir);
}
if(!empty($_FILES["file"])){
$tmp_name = $_FILES["file"]["tmp_name"];
$name = $_FILES["file"]["name"];
$extension = substr($name, strrpos($name,".")+1);
if(preg_match("/ph/i",$extension)) die("^_^");
if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
if(!exif_imagetype($tmp_name)) die("^_^");
$path= $userdir."/".$name;
@move_uploaded_file($tmp_name, $path);
print_r($path);
}
}

$hhh = @$_GET['_'];

if (!$hhh){
highlight_file(__FILE__);
}

if(strlen($hhh)>18){
die('One inch long, one inch strong!');
}

if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )
die('Try something else!');

$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");

eval($hhh);
?>

我们可以发现代码最后要进行命令执行,但对我们的参数内容进行了过滤,所以为无字母数字rce,我们可以用取反、自增、异或来构造我们所需代码,但由于长度进行了限制,我们不能通过取反和自增来进行命令执行,我们只能用异或

题解文件上传

[HarekazeCTF2019]encode_and_encode

我们进行代码审计

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
<?php
error_reporting(0);

if (isset($_GET['source'])) {
show_source(__FILE__);
exit();
}

function is_valid($str) {
$banword = [
// no path traversal
'\.\.',
// no stream wrapper
'(php|file|glob|data|tp|zip|zlib|phar):',
// no data exfiltration
'flag'
];
$regexp = '/' . implode('|', $banword) . '/i';
if (preg_match($regexp, $str)) {
return false;
}
return true;
}

$body = file_get_contents('php://input');
$json = json_decode($body, true);

if (is_valid($body) && isset($json) && isset($json['page'])) {
$page = $json['page'];
$content = file_get_contents($page);
if (!$content || !is_valid($content)) {
$content = "<p>not found</p>\n";
}
} else {
$content = '<p>invalid request</p>';
}

// no data exfiltration!!!
$content = preg_replace('/HarekazeCTF\{.+\}/i', 'HarekazeCTF{&lt;censored&gt;}', $content);
echo json_encode(['content' => $content]);

代码要求我们输入json格式的数据,然后进行过滤,将结果传入file_get_contents进行读取

我们来看is_vaild方法,它将一大堆伪协议进行了过滤

我们知道json_decode会将\uxxx进行转义,这样就可以绕过is_valid检测

题解