' 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가 되는 조건을 사용하게 되면

> id = 'hanhxx' or '1'='2'
> id = 'hanhxx' or false

결과적으로 입력한 USER ID가 아닌 경우에는 모두 false에 해당하게 된다.

즉, 사용자가 입력한 USER ID와 일치하는 ROW를 조회하는 순간에만

> id = 'hanhxx' or false
> true or false = true 

id = 'hanhxx' 라는 조건이 참이 되면서 로그인에 성공할 수 있게 되는 것이다.

만약 사용자가 입력한 값이 hanhxx인데, mario 정보가 들어있는 ROW를 조회하는 시점에서는

> id = 'hanhxx' or false
> false or false = false 

id = 'hanhxx'라는 조건이 false가 되기 때문에, 이런 경우 로그인에 실패하게 된다.

이는 결국 ' and '1'='1과 비슷한 맥락으로,

특정 ID에 대해서 결과가 참이 되도록 만드는 구문이라 할 수 있다.

[ Result 1 ]

이제 위에서 살펴본 구문을 직접 넣어보도록 하자!

ID : hanhxx' or '1'='2
PASS : hanhxx1234


> SELECT * FROM member WHERE id='hanhxx' or '1'='2' and pass='hanhxx1234'

결과적으로 수행되는 query를 보면, password에 대한 and 연산이 포함되기 때문에

위에서 살펴본 내용처럼

'1'='2'

이 query는 password와 and 연산을 우선적으로 실행하게 된다.

(1) '1' = '2' and password = 'hanhxx1234'

'1'='2'는 false이고 and 연산에서는 false가 있으면 무조건 결과는 false이기 때문에

password에 어떤 값을 입력하든 (1)의 결과는 false가 된다.

(2) SELECT * FROM member WHERE id='hanhxx' or false

따라서 실행되는 Query는 (2)와 같이

id가 'hanhxx'인 경우에만 로그인할 수 있는 형태가 된다.

[ Result 2 ]

이번엔 Password 조건을 무효화 시키기 위해 주석을 사용해보자!

ID = 'hanhxx' or '1'='2'#
PASS = 'hanhxx1234

> SELECT * FROM member WHERE id = 'hanhxx' or '1'='2'# and pass='hanhxx1234'
> SELECT * FROM member WHERE id = 'hanhxx' or '1'='2'

' or '1'='1과는 달리 주석을 사용하더라도 최종적으로 실행되는 query는 [ result 1 ]과 동일하기 때문에

[ result 2 ]에서도 입력한 id로만 로그인 되는 결과를 확인할 수 있을 것이다.

Last updated