' and '1'='1

DATE : 2023/11/26

이번에 고민해볼 구문은 and 연산자가 들어간 형태이다.

[ case 2 ] : ' and '1'='1

' and '1'='1

and 논리 연산자의 연산 방식을 살펴보면 :

false and false = false
true and false = false
false and true = false
true and true = true

and 연산자에게 주어진 피연산자 값이 모두 참인 경우에만 결과가 true임을 알 수 있다.

그렇다 보니 and true 형태의 논리 연산은 :

[rule]
false and true = false
true and true = true

ex) 
'A' and true = 'A'
9 and true = 9

자신과 연산에 사용한 값(ex -> 'A' or 9와 같이)이 곧 결과가 된다.

다른 말로 하면 and 연산에서 true는 있으나 마나인, 항등원으로 동작한다는 것이다.

이런 특성을 SQL injection에서는 어떻게 활용할 수 있을까??

사실 어떤 시스템에서 SQL Injection을 실행하기 전에 우리는

SQL Injection 취약점이 있는 지부터 확인해봐야 한다. 💡

바로 이 타이밍에! and 연산자의 특성을 활용해볼 수 있다.

[ Result 1 ]

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


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

만약 사용자가 이와 같이 id & pass를 입력한다면, 실행되는 query는 최종적으로

아래와 같이 정리할 수 있다.

> id='hanhxx' and '1'='1' and pass='hanhxx1234'
> id='hanhxx' and pass='hanhxx1234'

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

query만 봐서는 이게 무슨 쓸모인가 싶을 수 있지만, 이 query의 결과가 정상적으로 나온다면

' and '1'='1

우리가 작성한 SQL이 주입 되었음에도 실행에 문제가 없었기 때문에

SQL Injection을 실행할 수 있음을 확인할 수 있게 되는 것이다.

실제로 ID에 위와 같이 값을 입력하면

정상적으로 hanhxx의 계정 정보가 제공되고 이는 곧,

우리가 주입한 SQL이 실제 DB에 영향을 줄 수 있음을 확인한 셈이 된다.

다만 이때 password 값을 틀리게 되면

ID : hanhxx' and '1'='1
PASS : jumpjump!!

> SELECT * FROM member WHERE id = 'hanhxx' and '1'='1' and pass='jumpjump!!'
> SELECT * FROM member WHERE id = 'hanhxx' and pass='jumpjump!!'

말 그대로 틀린 비밀번호를 입력한 경우와 같기 때문에

로그인에 실패했다는 문구가 나온다.

[ Result 2 ]

ID : hanhxx' and '1'='1' #
PASS : idk

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

이번에는 Query를 간단하게 만들기 위해서 주석을 사용해보자!!

주석을 사용하게 되면 비밀번호에는 어떤 값을 입력했는지 고려할 필요가 없어지는 동시에

> id = 'hanhxx' and '1'='1'
> id = 'hanhxx'

항등원은 없는 셈 치면 되기 때문에 결국 id가 hanhxx인 ROW에만 True인 결과가 나오게 된다.

다만 Result 1과 차이가 있다면 password를 확인하는 부분은 주석 처리되기 때문에

비밀번호를 모르더라도(= 입력하지 않아도)

성공적으로 로그인을..! 즉, 인증 우회를 할 수 있게 된다. 🙀

이렇게 해서 ' and '1'='1과 관련된 내용을 살펴보았다!!

(1) SQL INJECTION을 수행할 수 있을 지 여부 확인을 위해 사용할 수 있다.

(2) or 연산자를 실행한 경우, 모든 User의 정보를 얻기에 적합했다면

and 연산자는 특정 User를 가리키기에 적합하다.

Last updated