LOADING

电院_Backend

网络安全

电院_Backend

题目提供了login.zip,打开是login.php文件

<?php
error_reporting(0);
session_start();

if($_POST){
    $verify_code = $_POST['verify_code'];

    // 验证验证码
    if (empty($verify_code) || $verify_code !== $_SESSION['captcha_code']) {
        echo json_encode(array('status' => 0,'info' => '验证码错误啦,再输入吧'));
        unset($_SESSION['captcha_code']);
        exit;
    }

    $email = $_POST['email'];
    if(!preg_match("/[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+/", $email)||preg_match("/or/i", $email)){
        echo json_encode(array('status' => 0,'info' => '不存在邮箱为: '.$email.' 的管理员账号!'));
        unset($_SESSION['captcha_code']);
        exit;
    }

    $pwd = $_POST['pwd'];
    $pwd = md5($pwd);
    $conn = mysqli_connect("localhost","root","123456","xdsec",3306);


    $sql = "SELECT * FROM admin WHERE email='$email' AND pwd='$pwd'";
    $result = mysqli_query($conn,$sql);
    $row = mysqli_fetch_array($result);

    if($row){
        $_SESSION['admin_id'] = $row['id'];
        $_SESSION['admin_email'] = $row['email'];
        echo json_encode(array('status' => 1,'info' => '登陆成功,moectf{testflag}'));
    } else{
        echo json_encode(array('status' => 0,'info' => '管理员邮箱或密码错误'));
        unset($_SESSION['captcha_code']);
    }
}


?>

分析代码,可以看到,首先会验证验证码,然后会验证邮箱的格式是否正确,然后会将邮箱和密码进行查询 查询通过,得到flag 题目直接给出了sql查询语句,很可能是在考察sql注入

打开网页只显示where is flag? 访问/robots.txt

User-agent: *
Disallow: /admin/

访问/admin/,发现后台登录页面 需要输入邮箱、密码、验证码

验证码没想到绕过的方法 手动进行sql注入 分析sql查询语句

SELECT * FROM admin WHERE email='$email' AND pwd='$pwd'

查询email和pwd email在前,pwd在后

对email进行注入,可以用注释符号将后面的pwd注释掉 如果对pwd进行注入,则无法保证email查询结果正确 所以选择注入email

邮箱的格式

if(!preg_match("/[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+/", $email)||preg_match("/or/i", $email))

or进行过滤,用||替代

密码随意,验证码别输错了

构造payload

邮箱:
abc@abc.com'|| 1=1#

密码:
123456

验证码:
****

flag弹窗很快,F12建议打开网络记录查询响应