当前位置: 首页 > article >正文

ctfshow(91,96,97)--PHP特性

Web91

源代码:

show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
    if(preg_match('/^php$/i', $a)){
        echo 'hacker';
    }
    else{
        echo $flag;
    }
}
else{
    echo 'nonononono';
}

Notice: Undefined index: cmd in /var/www/html/index.php on line 15
nonononono

审计

GET传参cmd,保存到变量a.
preg_match()函数查询变量a中的php字符串。

preg_match(str $pattern,str $var)
第一个参数是字符串类型的搜索模式。
第二个参数是输入的字符串。
该函数的作用就是匹配输入的字符串中的目标字符,且只匹配一次,匹配成功一次后将不再向后继续匹配。
如果成功匹配,则返回1;匹配失败,则返回0.

分析本题中的函数:

preg_match('/^php$/im', $a)

^php$表示匹配以php开头且以php结尾的字符串,其实就是匹配字符串php。
后面的i和m是模式修饰符,i表示匹配不区分大小写,m表示将含有换行符字符串视为多行,每行分别匹配。

思路

payload如下:

?cmd=p%0aphp //%0a是ASCII编码的换行符

第一个匹配函数preg_match('/^php$/im', $a),是多行模式匹配,第一行的p没有成功匹配,就会去第二行匹配,在第二行成功匹配到php,返回值为1.
第二个匹配函数preg_match('/^php$/i', $a),不是多行匹配,在第一行没有匹配到php,返回值0.
因此我们成功执行到 echo $flag; ,得到flag.

Web96

源代码:

highlight_file(__FILE__);

if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    }
} 

审计

GET传参u。
条件判断,如果u==‘flag.php’,结束程序执行。如果结果为false,显示u所指向的界面的源代码。

思路

flag显然在flag.php文件中,但是我们不能直接传参?u=flag.php
这里介绍一个网页目录的知识点:

假如网页根目录下有flag.php文件,查找文件使用 /flag.php 这里的 / 就是指根目录
同理, ./代表的是当前目录, …/ 代表的是上一级目录

这里的flag.php是在当前目录下,所以可以令:

?u=./flag.php

得到flag.

还有如下解法:

?u=/var/www/html/flag.php  //使用了flag.php的绝对路径查询。一般情况下我们访问的网页目录都是/var/www/html目录
?u=php://filter/read=convert.base64-encode/resource=flag.php //使用php伪协议读取

Web97

源代码:

include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
	if ($_POST['a'] != $_POST['b']){
		if (md5($_POST['a']) === md5($_POST['b']))
		echo $flag;
	}else{
		print 'Wrong.';
	}
} 

审计

POST 传参a,b
第一处条件判断:a != b ,返回值为true进入下一步。
第二次条件判断:md5($_POST['a']) === md5($_POST['b']),返回值为true,得到flag。

MD5是一种加密方式
由于MD5不能加密数组,如果输入数组,将会返回NULL

所以我们可以POST a,b为数组:

a[]=1&b[]=2

这样a!=b,但是在md5加密后的结果都为null,成功得到flag。


http://www.kler.cn/a/383651.html

相关文章:

  • ‌5G SSB(同步信号块)位于物理层‌
  • docker镜像仓库常用命令
  • 三周精通FastAPI:33 在编辑器中调试
  • Uniapp安装Pinia并持久化(Vue3)
  • Linux操作系统开机引导
  • pytest高版本兼容test_data[“log“] = _handle_ansi(“\n“.join(logs))错误
  • Spring Boot 中Nacos的用法及流程
  • lua入门教程 :模块和包
  • 【C++】vector 类深度解析:探索动态数组的奥秘
  • Hive面试题-- hive中查询用户连续三天登录记录的实现与解析
  • 【码农日常】Vscode Clangd初始化失败(Win10)
  • M1M2 MAC安装windows11 虚拟机的全过程
  • CSS中常见的两列布局、三列布局、百分比和多行多列布局!
  • 13.React useTimeout
  • 服务器虚拟化:现代IT基础设施的基石
  • 【660】基于SSM+Vue的在线学习系统设计与实现
  • 数据库_SQLite3
  • 防止事件冒泡和防止触发子元素
  • Oracle视频基础1.4.4练习
  • python数据结构基础(6)
  • elementui中的新增弹窗在新增数据成功后再新增 发现数据无法清除解决方法
  • 一元二次函数的最值公式
  • EV录屏好用吗?盘点2024年10款专业好用的录屏软件。
  • 【wxWidgets GUI设计教程 - 高级布局与窗口管理】
  • 【大模型系列】Video-XL(2024.10)
  • php rides限制访问频率