무기는 끈기

[Web Hacking / 웹 해킹] SQL Injection 논리연산자 AND '1'='1' 항등원? 본문

Hacking/Web Hacking

[Web Hacking / 웹 해킹] SQL Injection 논리연산자 AND '1'='1' 항등원?

김유비야 2023. 12. 7. 11:46

SQL Injection 주입 루트를 이것저것 연구해보던 중 이건?저건?되나?왜 안되나? 하던 중
AND가 연달아 나오고, 항등원이 들어갈 경우 논리연산자의 우선순위로 인한 궁금증이 생겨 정리하려고 한다.

 

인증 우회(Authentication Bypass)

- 식별/인증 동시 케이스
SELECT * FROM member WHERE id='___' AND pass='___'

우선 기본적인 SQL 쿼리문이다.

해당 쿼리문에 만약에 이렇게 들어갔다면? 연산 우선순위가 어떻게 될까

적용했을 때의 쿼리 모습
: 빨간 부분이 입력한 내용이다.
SELECT * FROM member WHERE id='doldol' AND '1'='1' AND pass='asdfasdf(아무거나 친것)'

일단 논리 연산자 AND, OR의 우선순위는 곱셈과 덧셈과 비슷하다.
AND가 뒤에 있어도 무조건 먼저 연산된 후 OR가 연산된다. AND -> OR 순서대로 괄호가 묶인다고 생각하면 된다.

이런 상황에서 OR 없이 AND가 2번 나오고 항등원이 존재할 경우는 어떻게 될까?

결론은 로그인 되지 않는다.(즉, ID와 PASS 모두 실제 DB 값과 일치해야 한다.)

 

위 쿼리는 AND 밖에 없으니 앞에서부터 순서대로 연산될 것이다.
id='doldol' AND '1'='1'이 먼저 연산될 것이다.

이때 내가 납득되지 않아 한참을 막혀있던 개념이 나온다.
바로 항등원! 이라는 개념이다.

항등원 이란?
연산을 했을 때 늘 자기 자신이게 하는 개념을 말하는 것이다.

덧셈의 경우
0을 아무리 더해도, 어떤 상황에 더해도 자기 자신이기 때문에 덧셈에서의 항등원은 바로 0 이다.

곱셈의 경우
1을 아무리 곱해도, 어떤 상황에 곱해도 자기 자신이기 떄문에 곱셈에서의 항등원은 바로 1 이다.

그렇다면, 논리연산자 AND 에서의 항등원은 무엇일까?
바로 '1'='1', true, 1=1, 1 등등.. 정말 많다.
이 경우엔 참이 되게 하는 것들이 모두 AND의 항등원인 셈이다.

이렇다보니, 위의 쿼리 id='doldol' AND '1'='1' 은 id='doldol' 과 똑같은 것이다.
'1'='1'은 항등원이기 때문에 무시되기 때문이다.
= 없는거나 마찬가지!

그리하여 결국 서버가 받아들이는 쿼리는 이렇게 된다.

SELECT * FROM member WHERE id='doldol' AND pass='sdfasdf(아무거나 친 것)'

중간에 있던 AND '1'='1' 은 무시가 되어 일반적으로 그냥 아이디와 패스워드를 집어넣은 것과 동일한 결과가 되어,
올바른 아이디와 패스워드를 넣지 않는 이상 로그인이 되지 않게 되는 것이다.

 

항등원이라는 개념이 이해가 되지 않아 헤매다가 알아냈다.

알아내고 나니 너무 별거 없이 당연한거였지만,,, 혹시나 헤매고 있는 분들을 위해 글을 작성했다.