' and '1'='1
DATE : 2023/11/26
이번에 고민해볼 구문은 and 연산자가 들어간 형태이다.
[ case 2 ] : ' and '1'='1
and 논리 연산자의 연산 방식을 살펴보면 :
and 연산자에게 주어진 피연산자 값이 모두 참인 경우에만 결과가 true임을 알 수 있다.
그렇다 보니 and true 형태의 논리 연산은 :
자신과 연산에 사용한 값(ex -> 'A' or 9와 같이)이 곧 결과가 된다.
다른 말로 하면 and 연산에서 true는 있으나 마나인, 항등원으로 동작한다는 것이다.
이런 특성을 SQL injection에서는 어떻게 활용할 수 있을까??
사실 어떤 시스템에서 SQL Injection을 실행하기 전에 우리는
SQL Injection 취약점이 있는 지부터 확인해봐야 한다. 💡
바로 이 타이밍에! and 연산자의 특성을 활용해볼 수 있다.
[ Result 1 ]
만약 사용자가 이와 같이 id & pass를 입력한다면, 실행되는 query는 최종적으로
아래와 같이 정리할 수 있다.
query만 봐서는 이게 무슨 쓸모인가 싶을 수 있지만, 이 query의 결과가 정상적으로 나온다면
우리가 작성한 SQL이 주입 되었음에도 실행에 문제가 없었기 때문에
SQL Injection을 실행할 수 있음을 확인할 수 있게 되는 것이다.
실제로 ID에 위와 같이 값을 입력하면
정상적으로 hanhxx의 계정 정보가 제공되고 이는 곧,
우리가 주입한 SQL이 실제 DB에 영향을 줄 수 있음을 확인한 셈이 된다.
다만 이때 password 값을 틀리게 되면
말 그대로 틀린 비밀번호를 입력한 경우와 같기 때문에
로그인에 실패했다는 문구가 나온다.
[ Result 2 ]
이번에는 Query를 간단하게 만들기 위해서 주석을 사용해보자!!
주석을 사용하게 되면 비밀번호에는 어떤 값을 입력했는지 고려할 필요가 없어지는 동시에
항등원은 없는 셈 치면 되기 때문에 결국 id가 hanhxx인 ROW에만 True인 결과가 나오게 된다.
다만 Result 1과 차이가 있다면 password를 확인하는 부분은 주석 처리되기 때문에
비밀번호를 모르더라도(= 입력하지 않아도)
성공적으로 로그인을..! 즉, 인증 우회를 할 수 있게 된다. 🙀
이렇게 해서 ' and '1'='1과 관련된 내용을 살펴보았다!!
(1) SQL INJECTION을 수행할 수 있을 지 여부 확인을 위해 사용할 수 있다.
(2) or 연산자를 실행한 경우, 모든 User의 정보를 얻기에 적합했다면
and 연산자는 특정 User를 가리키기에 적합하다.
Last updated