BUU強化問題AWDP Fix継続更新中

ブウ・エズSQL

まずはsshに接続します。アカウントのパスワードを入力してください。

画像-20230904154404206

/var/www/htmlディレクトリに移動します。ソースコードはその中にあります。

画像-20230904154500902

index.php主に書類を見てください。

<?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 "用户名或密码错误";
    }
}
?>

"SELECT * FROM users WHERE username = '$username' AND password = '$password'"明らかにSQLインジェクションです。修復するには2つの方法があります。

方法 1:addslashes() 関数を使用してフィルタリングする

addslashes() 関数は、事前定義された文字の前にバックスラッシュが追加された文字列を返します。
事前定義された文字は次のとおりです。

  • アポストロフィ(')
  • 二重引用符(")
  • バックスラッシュ(\)
  • ヌル

この関数は、データベースに格納されている文字列およびデータベース クエリ ステートメントの文字列を準備するために使用できます。

コードの変更された部分:

$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'";

方法 2: WAF に移動する

WAF ソースコード:

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

コードの変更された部分:

$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'";

ここには関数検出もあるようで、preg_matchifを実行しないと正規表現と直接一致することはできません。そこでブラックリスト+文字置換を利用します。

方法 3: 前処理

前処理は SQL における一般的な防御手段とみなされます。

元のソースコード:

<?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 "用户名或密码错误";
    }
}
?>

mysql の前処理(マスター amiaaaz のブログより)

画像-20230904170602985

PDO の前処理(マスター amiaaaz のブログより)

画像-20230904170623933


修復が完了したら、確認アドレスへのルートにアクセスします/check

画像-20230904155134840

しばらく待ってから、/flag確認アドレスのルートにアクセスします。フラグが返された場合は、修復が成功したことを意味します。

画像-20230904170514324

おすすめ

転載: blog.csdn.net/Jayjay___/article/details/132922302