【CTF】10个经典的CTF-web题目学习

对CTF不是很感兴趣,但是从中一些php的安全知识还是不错的,从这个项目中找了10个案例,自己本地搭建环境尝试分析,这篇文章记录一下

extract

<?php
$flag=‘xxx‘; 
extract($_GET);
 if(isset($shiyan))
 { 
    $content=trim(file_get_contents($flag));
    if($shiyan==$content)
    { 
        echo‘ctf{xxx}‘; 
    }
   else
   { 
    echo‘Oh.no‘;
   } 
   }
?>

extract函数是把数组里面的键、值映射为变量、值。

该题条件是$shiyan==$content

$shiyan是可控的,而$content为读取一个文件名为$flag的文件内容。

尝试网上的payload:?shiyan=&flag=1

这个思路是覆盖$flag为1,file_get_contents读取1这个不存在的文件内容为空,然后满足条件,读出了flag:

【CTF】10个经典的CTF-web题目学习

 

我想到一个加强版:

<?php
$flag=‘xxx‘; 
extract($_GET);
 if(isset($shiyan))
 { 
    $content=trim(file_get_contents($flag));
    if($shiyan==$content && $shiyan==‘mkdd‘)
    { 
        echo‘ctf{xxx}‘; 
    }
   else
   { 
    echo‘Oh.no‘;
   } 
   }
?>

我在条件里面加了一个 $shiyan==‘mkdd‘,这个时候上面的方法就不可用了,因为问题在于怎么让file_get_contents读取一个文件,内容为mkdd?这时候需要用到php://input伪协议,直接把post的内容传给$content即可

【CTF】10个经典的CTF-web题目学习

 

strcmp

 

<?php
$flag = "flag{xxx}";
if (isset($_GET[‘a‘])) {  
    if (strcmp($_GET[‘a‘], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。 

    //比较两个字符串(区分大小写) 
        die(‘Flag: ‘.$flag);  
    else  
        print ‘No‘;  
}

?>

strcmp是对两个变量进行比较,完全相同才返回0,题目的意思就是你传入一个和flag完全相同的值,我就告诉你flag...这不扯淡吗

那肯定还有某些情况下也能返回0?是的,strcmp传入数组的话,会返回null , 而null==0 是true

【CTF】10个经典的CTF-web题目学习

绕过过滤的空白字符

<?php
 
$info = ""; 
$req = [];
$flag="flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}";
 
ini_set("display_error", false); //为一个配置选项设置值
error_reporting(0); //关闭所有PHP错误报告
# 条件一,要设置number参数
if(!isset($_GET[‘number‘])){
   header("hint:26966dc52e85af40f59b4fe73d8c323a.txt"); //HTTP头显示hint 26966dc52e85af40f59b4fe73d8c323a.txt
 
   die("have a fun!!"); //die — 等同于 exit()
 
}

foreach([$_GET, $_POST] as $global_var) {  //foreach 语法结构提供了遍历数组的简单方式 
    foreach($global_var as $key => $value) { 
        $value = trim($value);  //trim — 去除字符串首尾处的空白字符(或者其他字符)
        is_string($value) && $req[$key] = addslashes($value); // is_string — 检测变量是否是字符串,addslashes — 使用反斜线引用字符串
    } 
} 
 
 
function is_palindrome_number($number) { 
    $number = strval($number); //strval — 获取变量的字符串值
    $i = 0; 
    $j = strlen($number) - 1; //strlen — 获取字符串长度
    while($i < $j) { 
        if($number[$i] !== $number[$j]) { 
            return false; 
        } 
        $i++; 
        $j--; 
    } 
    return true; 
} 
 
# 条件二 number的值不能是数字
if(is_numeric($_REQUEST[‘number‘])) //is_numeric — 检测变量是否为数字或数字字符串 
{
 
   $info="sorry, you cann‘t input a number!";
 
}

上一篇:IfcNullStyle


下一篇:源码包安装apache