ホームページ > バックエンド開発 > PHPチュートリアル > PHPの脆弱性徹底解説(5) ~SQLインジェクション攻撃~

PHPの脆弱性徹底解説(5) ~SQLインジェクション攻撃~

黄舟
リリース: 2023-03-03 20:54:02
オリジナル
1979 人が閲覧しました

SQL インジェクション攻撃 (SQL インジェクション) とは、攻撃者が慎重に作成した SQL ステートメントをフォームに送信し、Web プログラムが送信されたデータをチェックしない場合に、SQL インジェクション攻撃を引き起こします。

SQL インジェクション攻撃の一般的な手順:

1. 攻撃者は SQL インジェクションの脆弱性のあるサイトにアクセスし、インジェクション ポイントを探します

2. 攻撃者はインジェクション ステートメントを構築し、そのインジェクション ステートメントを SQL ステートメントと結合します。新しい SQL ステートメントを生成するプログラム

3. 新しい SQL ステートメントが処理のためにデータベースに送信されます

4. データベースが新しい SQL ステートメントを実行し、SQL インジェクション攻撃を引き起こします

PHPの脆弱性徹底解説(5) ~SQLインジェクション攻撃~

データベース

CREATE TABLE `postmessage` (  		
`id` int(11) NOT NULL auto_increment,  			
`subject` varchar(60) NOT NULL default ”,  				
`name` varchar(40) NOT NULL default ”,  					
`email` varchar(25) NOT NULL default ”,  						
`question` mediumtext NOT NULL,  							
`postdate` datetime NOT NULL default ’0000-00-00 00:00:00′,  								
PRIMARY KEY (`id`)  									
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COMMENT=’运用者的留言’ AUTO_INCREMENT=69 ;  										
	grant all privileges on ch3.* to ‘sectop’@localhost identified by ’123456′;  											
	//add.php 插入留言  												
	//list.php 留言列表  													
	//show.php 显示留言  													

														
ログイン後にコピー

ページ http://www.netsos.com.cn/show.php?id=71 注入ポイントがある可能性がありますので、テストしてみましょう

http://www.netsos.com.cn/show.php?id =71 と 1=1

PHPの脆弱性徹底解説(5) ~SQLインジェクション攻撃~

レコードは 1 回ではなく 1 回クエリされましたPHPの脆弱性徹底解説(5) ~SQLインジェクション攻撃~

//show.php 行 12-15

//mysql クエリを実行します。 state

$query = "select * from postmessage where id = " .$_GET["id"];

$result = mysql_query($query)

or die("ySQL クエリ ステートメントの実行に失敗しました:" . mysql_error ());

パラメータ ID とその前の文字が渡された後、結合された SQL ステートメントをデータベースに入れてクエリを実行します

送信して 1=1 を実行すると、ステートメントは select * from postmessage where id = 71 となり、 1=1. このステートメントの前後の値はすべて true であり、その後の と も true であるため、クエリされたデータ

が送信され、1=2 となり、ステートメントは select * from postmessage where id = 71 となります。 1=2。このステートメントの最初の値は true、最後の値は false、次の値は false であり、データをクエリすることはできません

通常の SQL クエリは、構築したステートメントを通過した後、SQL インジェクション攻撃を形成します。 。この注入ポイントを通じて、たとえば、union を使用して管理パスワードを読み取る、データベース情報を読み取る、または mysql のload_file を使用して outfile やその他の関数にさらに侵入する権限を取得できます。

防止方法

整数パラメータ:

intval関数を使用してデータを整数に変換

関数プロトタイプ

int intval (mixed var, int Base)

varは整数に変換される変数

baseを選択できます。これは基本的な数値で、デフォルトは 10 です

浮動小数点パラメータ:

floatval または doubleval 関数を使用して、それぞれ単精度と倍精度の浮動小数点パラメータを変換します

関数のプロトタイプ

int floatval (mixed var )

var は変換される変数です

int doubleval (混合 var)

var は変換される変数です

文字パラメータ:

addslashes 関数を使用して一重引用符 "'" を "'" と二重引用符に変換します引用符「"」は「"」に、バックスラッシュ「」は「\」に変換され、NULL文字とバックスラッシュ「"

関数プロトタイプ

文字列はラッシュを追加します(文字列str)

strはチェックされる文字列です

これで、次のようにコードの抜け穴を修正できます

// mysqlクエリステートメントを実行します

$query = "select * from postmessage where id = ".intval($_GET["id"]);

$result = mysql_query( $query)

or die("ySQL クエリ ステートメントの実行に失敗しました: " .mysql_error());

文字型の場合は、まず magic_quotes_gpc を On にできるかどうかを判断し、その場合は addslashes を使用してエスケープします。特殊文字


if(get_magic_quotes_gpc())
{
$var = $_GET["var"] }
else
{
$var =addslashes($_GET[ "var"]) ;
}






再度テストしたところ、脆弱性は修正されました


上記はPHP脆弱性解決策(5) - SQLインジェクション攻撃の内容です。 PHP 中国語 Web サイト (www.php.cn) に注意してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート