' or '1'='2
DATE : 2023/11/27
앞에서 살펴본 내용을 보았을 때,
(1) ' or '1'='1은 DB에 있는 모든 정보를 조회할 때
(2) ' and '1'='1은 DB에 있는 특정 정보를 조회할 때
사용하기 적합하다고 정리한 바 있다.
이때 (1)과 (2)는 모두 항상 true가 되는 조건을 사용한다는 공통점이 있는 데,
만약 정반대인 Query를 작성한다면 어떻게 활용할 수 있을 지 궁금해졌다.
그래서 항상 false인 조건을 사용해, query의 결과가 어떻게 나오는 지 알아볼까 한다.
[ case 3 ] : ' or '1'='2
만약 USER ID에 항상 false가 되는 조건을 사용하게 되면
결과적으로 입력한 USER ID가 아닌 경우에는 모두 false에 해당하게 된다.
즉, 사용자가 입력한 USER ID와 일치하는 ROW를 조회하는 순간에만
id = 'hanhxx' 라는 조건이 참이 되면서 로그인에 성공할 수 있게 되는 것이다.
만약 사용자가 입력한 값이 hanhxx인데, mario 정보가 들어있는 ROW를 조회하는 시점에서는
id = 'hanhxx'라는 조건이 false가 되기 때문에, 이런 경우 로그인에 실패하게 된다.
이는 결국 ' and '1'='1과 비슷한 맥락으로,
특정 ID에 대해서 결과가 참이 되도록 만드는 구문이라 할 수 있다.
[ Result 1 ]
이제 위에서 살펴본 구문을 직접 넣어보도록 하자!
결과적으로 수행되는 query를 보면, password에 대한 and 연산이 포함되기 때문에
위에서 살펴본 내용처럼
이 query는 password와 and 연산을 우선적으로 실행하게 된다.
'1'='2'는 false이고 and 연산에서는 false가 있으면 무조건 결과는 false이기 때문에
password에 어떤 값을 입력하든 (1)의 결과는 false가 된다.
따라서 실행되는 Query는 (2)와 같이
id가 'hanhxx'인 경우에만 로그인할 수 있는 형태가 된다.
[ Result 2 ]
이번엔 Password 조건을 무효화 시키기 위해 주석을 사용해보자!
' or '1'='1과는 달리 주석을 사용하더라도 최종적으로 실행되는 query는 [ result 1 ]과 동일하기 때문에
[ result 2 ]에서도 입력한 id로만 로그인 되는 결과를 확인할 수 있을 것이다.
Last updated