본문 바로가기

이런저런 소스코드들을 뜯어보다보니 잘못하면 대형사고 나게끔 만들어진게 여러개 있더라고요.

그래서 그냥 비정기 간행물 식으로 이런거 하지 마세요 하는거 보여줄거에요.

 

아무튼 여기에 평범한 어드민 로그인창이 있어요.

 

미리 준비해둔 유저권한 계정을 이용해서 로그인을 해보면

 

id는 평문, pw는 sha512 해시를 돌려서 JSON으로 묶어서 날리게 되요.

혹시나 해서 하는말이지만

PW를 해싱해서 request 보내니깐 중간에서 가로채도 원래 비밀번호가 뭔지 모르겠지!! 히히

하다가 혼나요.

저런식으로 보내면 DB에 들어있는건 해시일거니깐 평문을 몰라도 상관없거든요.

또, 해싱해서 보내니깐 pw에 a' or 1=1# 같은거 넣어도 해싱되니 작동 안하겠지!! 히히

하면서 SQLI 안막아놔도 혼나요.

 

아무튼 로그인을 시도하면

 

1. 클라이언트에서 ID/PW를 전송함.

2. 서버에서 ID/PW를 받고 쿼리를 돌림.

3. 결과를 클라로 전송.

4. 결과의 accessLevel 컬럼을 바탕으로 로그인 가능여부를 파악.

 

이 되도록 되어있는데

 

뭔가 이상하지 않아요?

이미 토큰 받았는데 클라이언트에서 못넘어가게 하는거잖아요.

 

그러니 그냥 결과의 accessLevel 을 변조해버리면

 

그대로 다음으로 넘어가면서

 

개인정보를 싹 빼돌린다든지 할 수 있는거죠.

 

그러면 저걸 어떻게 막아야 할까요?

Query OK 뜨고 accessLevel 이 admin 의 것일경우에만 결과를 클라로 보내준다든지 하면 되겠죠?

 

???? : 난 이렇게 안짜는데요?

아님 말고요.

댓글