ブウ・エズSQL
まずはsshに接続します。アカウントのパスワードを入力してください。
/var/www/html
ディレクトリに移動します。ソースコードはその中にあります。
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_match
ifを実行しないと正規表現と直接一致することはできません。そこでブラックリスト+文字置換を利用します。
方法 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 のブログより)
PDO の前処理(マスター amiaaaz のブログより)
修復が完了したら、確認アドレスへのルートにアクセスします/check
。
しばらく待ってから、/flag
確認アドレスのルートにアクセスします。フラグが返された場合は、修復が成功したことを意味します。