hacking study/SQL Injection

정보보안 스터디 - 2주차 1일 - SQL인젝션 로그인 구조

wonder12 2022. 10. 21. 01:21

 

 

쿠키 VS 세션 VS 세션아이디

 

일단 A B C라는 컴퓨터가 HTTP에서 서버로 로그인한다고 할 떄, 누가 A B C인지 구별을 못합니다.

왜냐하면 비연결성 때문입니다. 한번만 처리하고 끝이라 사이트의 다른 페이지를 들어갔을 때 유지가 안됩니다.

 

하지만 우리가 사용하는 로그인 방식은 A컴퓨터가 로그인을 했다고 할 때

서버는 유저를 기억해서 로그인을 유지시켜줍니다.

 

이런부분에서 http와 로그인은 확실히 다릅니다.

 

세션의 탄생 배경

 

자세하게 보면

로그인 할 때는 쿠키를 사용합니다. 사용자가 A라는 것을 알려주기 위해서 

클라이언트 측에서 쿠키를 저장하게되죠. 하지만 공격자가 '내가 A다' 면서 쿠키를 배껴쓰면 도용이 됩니다.

그리고 쿠키의 단점이 클라이언트 측에서 주는 정보이기 때문에 변조가 가능하다는 점입니다.

 

그래서 기본적으로 클라이언트에서 오는 정보는 불신하자.

라고 해서 서버측에서 유저 정보를 저장하게 되는 세션을 만듭니다.

서버에 저장된 세션을 찾아서 A라는 유저를 확신합니다.

 

하지만 세션도 공격자가 스니핑을 해서 알아내기만하면

충분히 A유저의 신분으로 접속 가능하기 때문에 암호화를 잘 해야합니다.

 

참고로 세션은 로그인할 때마다 세션아이디가바뀌는것을 원칙으로 하고있습니다.

로그아웃하기 전까지는 사이트 내에서 유지됩니다.

 

 

 

암호화의 종류에는

1. 인코딩

2. 암호화

3.해쉬 가 있습니다.

인코딩과 암호화는 쉽게 복구가 가능합니다.

 

나머지와 해쉬의 다른점은 일방향 함수라는 점입니다.

DB를 뒤져 비밀번호를 손에 넣는다고 해도, 원래대로 복구 작업할 수 없는거죠.

입력한 비밀번호를 해시 처리한 값과 실제 비밀번호의 해시 처리 값을 비교해보고 맞으면 통과시켜줍니다.

 

 

 

 

식별&인증

식별이란 많은 데이터 중 그사람을 알아보는 작업입니다. 예를들어 ID가 있습니다.

인증이란 식별을 했다면 그 사람이 맞는지 인증정보를 확인하는 작업입니다. 예를들어 비밀번호가 있습니다.

식별정보를 인증정보로 사용할 수는 없죠. 그러면 누가 ID만 있어도 그 사용자로 접근 가능하다는 말과 같기 때문입니다.

 

 

가능한 로그인 방식

 

1) 식별&인증 동시에

select [column정보] from [table] where id=' ' and pwd=' '

둘 다 성립하면 정보를 가져옵니다.

 

2) 분리해서

select pwd from [table] where id=' '

id를 입력하면 DB서버에 있는 pwd와 입력된 pwd를 비교해서 맞으면 통과 시켜줍니다.

 

3) 동시에 하면서 hash값으로

select [column정보] from [table] where id=' ' and pwd=md5(' ')

비밀번호를 해쉬처리를 합니다.

 

4) 분리해서 하면서 hash값으로

 

5) 동시에 하면서 개행 

and \n pwd

등 SQL 코드 조율을 해서 쿼리 처리가 빨라지게 할 수도 있습니다.

 

 

 

 

SQL 취약점 분석 방법

 

우리는 무지성으로 SQL 페이로드를 대입해보는 것이 아니라.

분석을 먼저해야됩니다.

 

1) 어떻게 작동 되는지 Burp Suite를 이용해 헤더를 봅니다. 어떤식으로 작동되는지 확인할 수 있습니다.

ex)

 

 

 

Burp suite에서 http history를 보면 POST방식으로 sign in 된 것이 있을겁니다.

헤더 쿠키값에 ID PWD가 적혀져있는걸 보니 맞습니다.

 

Repeater로 보내주시구요.

 

이상태에서 mario 라는 계정을 접속해 로그인 되었을 때 어떻게 작동하는지 봅니다.

로그인 실패되었을 떄는 200 OK

로그인 되었을 때는 302 redirection 이 뜨는 걸 확인할 수 있습니다.

location을 보면 index.php로 이동이 되는것을 follow redirection 해주면

로그인 되는것을 Render에서 확인 할 수 있습니다.

 

 

 

 

2) 로그인 구조들을 염두해두고 아 이렇게 움직일 것이다. 하고 가정해봅니다.

ex)

식별 인증을 동시에 할 것이야. 가정해보면

 

 

 

 

3)가정한 SQL구문을 만들어 보고

페이로드 할 구문을 떼어내서 실행해보는 겁니다.

 

ex) 

사용한 쿼리 가정 : select [column정보] from [table] where id=' ' and pwd=' '

즉 select [column정보] from [table] where id='normaltic1 ' and pwd=' ' 로 작동 됩니다.

 

자연스럽게 SQL 인젝션을 해보고

select [column정보] from [table] where id='normaltic1' or 1=1 # ' and pwd=' '

적용할 페이로드 : normaltic1' or 1=1 #

가 됩니다. 

비밀번호는 아무거나 입력하면 바로 Flag가 뜨네요!

 

 

4) 해보고 안되면 남은 가정들을 시도해보면 됩니다.

 

 

안된다면

1) 과연 이 구조가 맞을까? 다른구조가 아닐까?

2) 필터링된 구문이 있지는 않을까?

 

라고 생각해봐야합니다.