syurhia 님의 블로그

PortSwigger SQL Injection allowing login bypass 본문

보안관련/PortSwigger

PortSwigger SQL Injection allowing login bypass

syurhia 2026. 4. 17. 21:43

이번에는 비밀번호를 몰라도 로그인이 가능하게 해주는 SQL Injection allowing login bypass라는 것을 배워보았다.

아무거나 로그인 시도를 해보자

기본적으로는 바로 위의 그림과 같이 로그인을 시도할 때, DB에 아이디와 패스워드가 존재하지 않으면 로그인에 실패한다.

아이디와 비밀번호에 아무거나 써보고 로그인을 시도한 결과가 바로 아래 그림과 같다.

존재하지 않는 아이디로 로그인 시도 시, 유효하지 않은 아이디라고 뜬다.

 

그런데 쿼리에서 특수문자 입력이 가능할때 바로 아래 그림과 같이 입력하면 로그인이 가능하다고 한다.

비밀번호를 적당히 치고 관리자 계정으로 로그인을 시도하는데 SQL Injection을 수행하면..?

 

 

로그인 성공이다.

 

이게 왜 가능할까에 대해 좀 생각을 해봤다.

나는 로그인의 과정은 기본적으로 서버가 DB에 아이디를 사용한 쿼리를 보내서 비밀번호를 가져온 후, 유저에게 입력받은 비밀번호와 같은지를 확인하는게 당연하다고 여기고 있었다.

예를 들면 아래의 코드처럼. 아래 코드대로라면 이번에 사용된 login bypass SQL Injection이 안 통할 것 같다.

DB비밀번호 = SELECT * FROM userdata WHERE id = 'administrator'
if(입력 비밀번호 == DB비밀번호):
	로그인 성공

 

그래서 login bypass SQL Injection이 왜 통하는건가 의아했는데, DB내에서 로그인 과정을 수행하는 경우가 있다는 문장을 발견했다. 

SELECT * FROM userdata where id = 'administrator' AND pass = 'administrator'

그냥 위의 쿼리만 수행해서 통과를 한다면 로그인을 시켜준다는 얘기다. 그렇기 때문에 id쪽에 '--를 추가하는 것 만으로도 쿼리가 다음과 같이 변형돼서 자동으로 로그인이 되어버린 것이고, 그 결과가 이번 학습의 내용인 것이다.

SELECT * FROM userdata WHERE id = 'administrator'-- 'AND password = 'apple'

 

막는 방법으로는...

그냥 내가 생각한 방식처럼 DB에서 로그인이 되는지 확인하는 방식이 아닌, DB에는 그저 비밀번호만 요청하고 로그인 과정은 다른 코드로 확인하면 login bypass에서는 가장 간편하게 방어할 수 있을 것 같다는 생각이 든다.

 

아니면 ' 같은 특수문자들을 그대로 입력으로 넣어주는 게 아니라, %20처럼 다른 걸로 바꿔준다면 문제를 막을 수 있지 않을까? 싶다. 라고 생각해서 찾아봤더니 특수문자를 필터링해서 넣는 기법이라는데, 이 방식으로는 모든 공격 패턴을 다 막아야 한다고 한다. 굉장히 별로인 듯 하다.