介绍
本篇文章主要总结了我在写ctfshow题目中遇到的关于PHP的考点。因为只总结知识点和考点会比较空洞,也不容易理解,所以我都是通过题目来总结考点,这样的话比较容易理解。
PHP特性相关考点
一、
考点:php正则表达式的匹配模式差异。
例题:
show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){ #/i表示不区分大小写,/m表示多行匹配
if(preg_match('/^php$/i', $a)){
echo 'hacker';
}
else{
echo $flag;
}
}
else{
echo 'nonononono';
}
例题分析:
字符 ^ 和 $ 同时使用时,表示精确匹配,需要匹配到以php开头和以php结尾的字符串才会返回true,否则返回false
/m 多行匹配模式下,若存在换行\n并且有开始^或结束 符 的 情 况 下 , 将 以 换 行 为 分 隔 符 , 逐 行 进 行 匹 配 。 因 此 当 我 们 传 入 以 下 p a y l o a d 时 , 第 一 个 i f 正 则 匹 配 会 返 回 t r u e 。 但 是 当 不 是 多 行 匹 配 模 式 的 时 候 也 就 是 在 第 二 个 i f 正 则 匹 配 中 出 现 换 行 符 ‘ 符的情况下,将以换行为分隔符,逐行进行匹配。因此当我们传入以下payload时,第一个if正则匹配会返回true。但是当不是多行匹配模式的时候也就是在第二个if正则匹配中出现换行符`%0a`的时, 符的情况下,将以换行为分隔符,逐行进行匹配。因此当我们传入以下payload时,第一个if正则匹配会返回true。但是当不是多行匹配模式的时候也就是在第二个if正则匹配中出现换行符‘cmd的值会被当做两行处理,因此当我们传入以下payload时,第二个if正则表达式匹配到的是aaaphp,不符合以php开头和以php结尾会返回false,从而echo出flag。
payload如下:
?cmd=aaa%0aphp #%0a为换行符
二、
考点:php变量覆盖。
例题:
<?php
highlight_file(__FILE__);
includ