Ctfshow

假赛生

<?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("/wW*/",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

[Sign]做不出ctf题的时候很痛苦,你只能眼睁睁看着其他人领先你
原文地址:https://www.cnblogs.com/echoDetected/p/12860548.html