본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 2-6.SQL 인젝션 [Login Form/Hero]

by Robert8478 2023. 12. 12.

이번 페이지는 'hero' 그룹에 속하는 사용자들이 로그인하면 로그인한 사용자의 비밀번호 힌트를 출력한다.

[난이도 하]

우선 login 폼이나 Password 폼 둘중 하나에 '를 넣고 Login 버튼을 누른다. 위처럼 SQL 에러가 나오면 SQL인젝션에 취약한 것이다.
오류 메시지를 통해 데이터베이스 서버 종류를 파악할 수 있다. 이번 페이지는 MySQL DB를 사용중인것 같다.
이제 아이디 폼에 ' or 1=1# 을 입력해보자.

그랬더니 비밀번호를 입력하지 않고도 로그인이 되었다. Neo라는 아이디로 접속이 되었다. 아래에는 비밀번호에 대한 힌트가 나왔다.
이는 변수를 따로 입력받지 않고 AND 연산자를 사용, 한줄로 DB의 아이디와 비밀번호를 출력하기 때문에 발생하는 취약점이다.

페이지에서 사용하는 소스코드
$sql = "SELECT * FROM heroes WHERE login='" . $login . "' AND password = '" . $password ."'";

위 소스코드에서 login 창에 쿼리를 입력시 $login에 값이 들어가게 되고 AND 연산자가 OR 연산자보다 우선순위가 높기 때문에
AND 연산을 먼저 수행하고 그 뒤 OR 연산을 수행할 때 항상 결과가 참이 되어서 비밀번호를 입력하지 않아도 heroes 테이블에 저장된 사용자로
로그인이 되는 것이다.
neo 이외의 사용자로 로그인하려면 아이디를 알면

alice ' or 'a'='a 
와 같은 쿼리로 항상 참인 쿼리를 만들면 다른 사용자로도 로그인이 가능해진다.

[난이도 중,상]
난이도 중,상은 ' 를 입력하여도 SQL 에러가 나오지 않는다.
중은 addslashes 함수, 상은 mysql_real_escape_string 함수를 이용해서 특수문자를 필터링 하기 때문이다.