二次urldecodeインジェクションの原理と防御

セカンダリurldecodeインジェクションの原理


現在のほとんどのWebプログラムは、通常、addslashes()、mysql_real_escape_string()、mysql_escape_string()を使用するか、または注入を防ぐためにGPCをオンにして、パラメーターフィルタリングを実行します。urldecodeまたはrawurldecode関数がどこかで使用されると、セカンダリデコードが発生します。インジェクションをトリガーする単一引用符を生成します。

用下面的代码我们简单的了解一下。
<?php

$w = addslashes($_GET['id']);
$p = urldecode($w);
echo '$w = '.$w.'<br / >';
echo '$p = '.$p;

?>

/1.php?id=1%2527を送信します。これは、送信したパラメーターに単一引用符がないため、最初のデコード後の結果はw = 1 w = 1%27であり、%25は%としてデコードされます。プログラムがurldecodeまたはrawurldecode関数を使用してidパラメータをデコードします。デコード後の結果はw=1 p = 1 '単一引用符が正常に注入をトリガーしました。ここに画像の説明を挿入
原理が理解できたので、使い方はとても簡単です。

セカンダリurldecodeインジェクションの利用

二次urldecode注入的利用
<?php

$conn = mysqli_connect('127.0.0.1','root','root','qingfeng');

$uid = addslashes($_GET['id']);

$a = urldecode($uid);

$sql = "select * from news where id = '$a'";

$result = mysqli_query($conn,"$sql");

@$row = mysqli_fetch_row($result);

echo ('当前SQL语句:'.$sql.'<br />结果:');

print_r($row);

?>

Webページを開いてコンテンツを確認します(下の画像)。
ここに画像の説明を挿入
以前の原則を見ると、単一引用符を%2527で置き換えると注入がトリガーされる可能性があることはすでにわかっているので、ここでは直接使用します。
ここに画像の説明を挿入
クローズとコメントが正常に実行され、通常のSQLインジェクションのように結合クエリを使用できます。
id = 1%2527および1 = 2 union selectユーザー名、adminからのパスワード、ここに画像の説明を挿入
正常に挿入されたデータ、管理者のアカウントパスワード。

セカンダリurldecodeインジェクションに対する防御

  1. 実行のために渡されるパラメーターを決定するために循環し、外部から送信されたデータに注意することができます。
  2. データベースからデータをフェッチする場合、クエリしたデータを簡単に信頼することはできません。同じエスケープまたは差別を行う場合
    は、グループに参加して一緒に学習できます
    ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/p_utao/article/details/107189435