• 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

  • 相关阅读:
    【Linux】——基操指令(二)
    vue中watch和computed的使用案例:
    软件研发的十大浪费:研发效能的另一面
    【好书推荐】Web 3.0(具有颠覆性与重大机遇的第三代互联网)
    定制ASP.NET Core的身份认证
    移动端测试
    Flutter - 图片/视频选择器(支持拍照及录制视频)
    气膜球幕影院:娱乐体验的新高度—轻空间
    在云服务器上打开ftp服务-踩坑及心得
    liunx安装docker
  • 原文地址:https://blog.csdn.net/Jayjay___/article/details/132922302