• BUU 加固题 AWDP Fix 持续更新中


    BUU Ezsql

    首先连接上ssh。输入账号密码。

    image-20230904154404206

    /var/www/html目录下,源码在里面。

    image-20230904154500902

    主要是看index.php文件。

    
    error_reporting(0);
    include 'dbConnect.php';
    $username = $_GET['username'];
    $password = $_GET['password'];
    if (isset($_GET['username']) && isset($_GET['password'])) {
        $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
        $result = $mysqli->query($sql);
        if (!$result)
            die(mysqli_error($mysqli));
        $data = $result->fetch_all(); // 从结果集中获取所有数据
        if (!empty($data)) {
            echo '登录成功!';
        } else {
            echo "用户名或密码错误";
        }
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    "SELECT * FROM users WHERE username = '$username' AND password = '$password'"很明显的sql注入。修复方式有两种。

    方法一:用addslashes() 函数过滤

    addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
    预定义字符是:

    • 单引号(')
    • 双引号(")
    • 反斜杠(\)
    • NULL

    该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。

    代码中修改部分:

    $username = $_GET['username'];
    $password = $_GET['password'];
    
    $username = addslashes($username);
    $password = addslashes($password);
    
    if (isset($_GET['username']) && isset($_GET['password'])) {
        $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    方法二:上WAF

    WAF源码:

    $blacklist=['-','+','#','\"','\'','select','sleep',' '];
    
    • 1

    代码中修改部分:

    $username = $_GET['username'];
    $password = $_GET['password'];
    
    $blacklist=['-','+','#','\"','\'','select','sleep',' '];
    $username = str_replace($blacklist,'',$username);
    $password = str_replace($blacklist,'',$password);
    
    if (isset($_GET['username']) && isset($_GET['password'])) {
        $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里貌似还有功能检测,不能直接preg_match正则匹配不执行if。所以采用了黑名单+字符替换。

    方法三:预处理

    预处理算是sql里面的通防了。

    原来源码:

    
    error_reporting(0);
    include 'dbConnect.php';
    $username = $_GET['username'];
    $password = $_GET['password'];
    if (isset($_GET['username']) && isset($_GET['password'])) {
        $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
        $result = $mysqli->query($sql);
        if (!$result)
            die(mysqli_error($mysqli));
        $data = $result->fetch_all(); // 从结果集中获取所有数据
        if (!empty($data)) {
            echo '登录成功!';
        } else {
            echo "用户名或密码错误";
        }
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    mysql 预处理(来自amiaaaz师傅的博客)

    image-20230904170602985

    PDO 预处理(来自amiaaaz师傅的博客)

    image-20230904170623933


    修复完成后访问check地址的/check路由。

    image-20230904155134840

    稍微等一会后访问check地址的/flag路由。返回flag就是修复成功。

    image-20230904170514324

  • 相关阅读:
    sql:SQL优化知识点记录(十五)
    大厂10年经验,我对Java高并发问题方案的总结,堪称教科书级
    世界首款Lightning接口安卓手机诞生
    优化|优化处理可再生希尔伯特核空间的非参数回归中的协变量偏移
    改良海量数据存储的若干的手段-转变数据垃圾为黄金
    机器学习评价指标(分类、目标检测)
    专科出身,2年进苏宁,5年跳阿里,论我是怎么快速晋升的?
    Spring的BeanDefinition的作用和使用方法
    6.10-变长子网掩码 6.11-子网个数计算 6.12-子网中可用IP地址地址数
    网络练习题带答案
  • 原文地址:https://blog.csdn.net/Jayjay___/article/details/132922302