' and '1'='2

DATE : 2023/11/28

이번에는 항상 false가 되는 조건의 and 연산을 Query에 넣어볼까 한다.

[ case 4 ]

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

'1'='2'서로 다른 피연산자를 비교함으로써 항상 false가 되도록 하는 조건이고

더불어, and 연산자는 한 쪽만 false여도 결과가 false이기 때문에

false and false = false
true and fales = false

어떤 id가 입력되었든, 그 어떤 계정으로도 로그인을 하지 못할 것이라 예상할 수 있다.

[ Result 1 ]

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

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

위에서 살펴봤던 Query를 넣어 SQL injection을 실행하면

최종적으로 실행되는 Query에는 총 2개의 and 연산자가 들어있는 걸 알 수 있다.

Query의 조건이 어떻게 정리되는 지 확인해보면

(1) id = 'hanhxx' and '1'='2'

우선, 앞에 있는 and 연산자가 실행되어

(1) id = 'hanhxx' and false   =>   false

false가 나오게 된다.

이 결과를 넣어 where문을 다시 적어보면

false and pass='hanhxx1234'

(1)과 마찬가지로 false and 형태의 연산이 실행된다.

즉, where문의 내용이 결과적으로 false가 되기 때문에

그 어떤 계정으로도 로그인을 할 수 없게 되는 것이다.

실제로 ID & Password를 입력하면

Login Fail 문구가 나오는 걸 볼 수 있다.

[ Result 2 ]

ID : hanhxx' and '1'='2'#
PASS : hanhxx1234

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

이번에는 password 조건을 지우겠다!! 해서 주석을 사용해볼까 하는데

사실 and false가 주입 된 시점에서 뒷부분을 지운다 한들 결과가 크게 달라지진 않는다.

id = 'hanhxx' and '1'='2'

id에는 and '1'='2'가 주입 되기 때문에 결과는 false가 될 것이고

최종적으로 만들어지는 Query는

SELECT * FROM member WHERE false

그 어떤 ROW도 반환하지 않기 때문에 [ Result 2]와 마찬가지로 로그인을할 수가 없다!

이번에도 직접 값을 넣어보면~

역시! 예상한 대로 Login fail 문구가 출력 되는 걸 확인할 수 있다!! 🤗

Last updated