[WEB] DVWA 사이트를 이용한 Form SQL Injection
1. Form SQL Injection
Form은 검색하려는 데이터를 입력하는 HTML의 구조이다.
User ID에 1을 입력하면고 Submit을 누르면 http://서버IP/vulnerabilities/sqli/?id=1&Submit=Submit URL로 요청을 하게된다.
이후 id라는 키값에 1이라는 값이 입력되어 $id라는 변수에 할당되고 아래와 같이 쿼리의 where절에 있는 $id에 1이 입력이 되는 구조이다.
$id = $_REQUEST[ 'id' ]; |
Form SQL Injection은 쿼리 문의 where 절을 무력화 시키는 방법이다. 아래와 같이 쿼리를 작성하면 user_id가 공백 또는 1=1의 조건을 만족하는 유저가 나오기 때문에 결과적으로 SELECT first_name, last_name FROM users 가 실행된다. 이후 #은 뒤에오는 '를 주석처리(mysql 기준)하는 기호이다.
SELECT first_name, last_name FROM users WHERE user_id = '' or 1=1 #'; |
이렇게 되면 아래와 같이 모든 유저가 나오는 것을 알 수 있다.
이를 막기위한 방법에는 여러 함수를 적용할 수 있다.
1. mysql_real_escape_string() 함수 사용
$id = mysql_real_escape_string($GLOBALS["___mysqli_ston"], $id); |
2. prepared statement() 함수 사용
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' ); |
위의 두가지 방법을 사용하면 SELECT first_name, last_name FROM users WHERE user_id = '' or 1=1 #'; 쿼리문의 빨간색 부분을 단순히 문자로 취급하여 id 값이 ' or 1=1 # 인 것을 찾게 된다.