Ctfshow - 萌新赛web_假赛生

假赛生

<?php
session_start();
include('config.php');
if(empty($_SESSION['name'])){
    show_source("index.php");
}else{
    $name=$_SESSION['name'];
    $sql='select pass from user where name="'.$name.'"';
    echo $sql."<br />";
    system('4rfvbgt56yhn.sh');
    $query=mysqli_query($conn,$sql);
    $result=mysqli_fetch_assoc($query);
    if($name==='admin'){
        echo "admin!!!!!"."<br />";
        if(isset($_GET['c'])){
            preg_replace_callback("/\w\W*/",function(){die("not allowed!");},$_GET['c'],1);
            echo $flag;
        }else{
            echo "you not admin";
        }
    }
}
?>

提示1是register.php,访问是注册页面

提示2是login.php,访问是登陆页面

从源码看,登陆用户名需要是admin,访问login.php,注册一个admin,密码随意,返回

 not register admin

注册的不是admin($name==='admin'),登陆会失败

select pass from user where name="admin2"

那么在admin后面加个空格如何,去登陆就能成功了,显示

admin!!!!!
you not admin

因为没有传参c,所以

echo "you not admin";

有关正则匹配的知识
\w:用于匹配字母,数字或下划线字符;
\W:用于匹配所有与\w不匹配的字符;
“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次;

因此乍看题目正则匹配过滤了一切字符,其实没有过滤空格

传参c为空格,就能返回flag

posted @ 2020-05-09 22:38  ch0bits  阅读(948)  评论(0编辑  收藏  举报