우선 현제까지 로그인 페이지를 만들었다. 이 로그인페이지의 취약점이 있는지 물론 현제 전부 알진 못하겠고 부실할게 뻔하지만, 그래도 한번 저번에 해봤던 쿠키 변조를 통해 찾아보도록 하겠다.
mysql> SELECT * FROM accounts;
+----+----------+--------------------------------------------------------------+---------------------+
| id | username | password | email |
+----+----------+--------------------------------------------------------------+---------------------+
| 1 | admin | $2y$10$/MTBRTeilt8KWlL66sWccOXmP6hZswRAS1UFpggBghVNePi7Z6UIG | dkslwlfhd@gmail.com |
| 6 | test | $2y$10$FJJHeCmX.3jHZ8RwrXB7qOaN/Hf.eP7yo1kC1lF9dnDWK.MstVKr2 | 1234@1234.1234 |
| 7 | test2 | $2y$10$xJOIbqEmOgTG3vF1.vDs2.HKSwkJBq3lEg0HTPb4vS5qgmfsZWjee | asdf@asldkf |
+----+----------+--------------------------------------------------------------+---------------------+
3 rows in set (0.00 sec)
다음과 같은 데이터가 있다. admin을 실제 admin권한은 없지만 처음에 만들었던 계정으로 권한이 있다고 가정을 하고, test와 test2는 user 즉, 공격자나 혹은 이미 탈취 된 계정이라고 하겟다. test의 비밀번호는 1234이다.
test로 로그인 해보겠다.
우선 쿠키에 아이디와 비밀번호를 저장하지 않고 세션 ID를 발급하는것을 확인 할 수 있다.
또한 이 쿠키의 경우 만료일자가 MAX-Age열에 나타나는데 burp swite의 경우 열 자체가 존재하지 않는다.
이경우는 쿠키가 세션(브라우저 종료시 삭제) 혹은 만료일자가 정해지지 않은 경우이다.
개발자도구를 통해서 확인해보고, 직접 껐다가 켜본 결과 쿠키는 세션쿠키였다.
내가 따로 설정하지 않았는데 이렇게 설정된것으로 보아 자동적으로 쿠키의 만료일자가 없다고 무한정 유지되지는 않는 것 같다.
그렇다면 우선 admin이라는 아이디만으로 쿠키값을 변조하기는힘들어보인다.
로그인 전페이지에서 로그인이 되었을 경우 특정 페이지로 리다이렉트 되고 그 페이지에서 세션을 확인하지 않는 경우는 없었다. 애초에 그렇게 되지 않도록 세션을 확인해서 로그인해야만 들어갈수있는 페이지는 바로 index,php 즉, 메인페이지로 리다이렉트 시키도록 하였으며, 메인페이지의 경우 세션확인을 통해 로그인 되었으면 볼수있는 페이지와 아닌 페이지 모습을 if문으로 바꾸어놓았다. WAS인 php로 if문을 작성해서 그런지 웹서버에서 클라이언트로 오는 html코드를 보면 php 코드로 작성한 조건을 충족시키지 못한 부분의 페이지는 코드가 보이지 않는다.
다음은 SSID자체를 탈취하는 방법 에 대한 문제이다.
test2의 SSID인 9cd7vvvr2cnq85pcgas0a39s7v를 얻었다고 가정하고 쿠키값을 변조해보자.
test2로 로그인된 것을 확인할 수 있다.
다시말해 이 SSID는 절대 탈취되어서는 안된단 것이다.
마지막으로 확인할것은 무차벌 대입 공격이 먹히는가이다.
현제 아이디 생성 및 비밀번호, 이메일 생성에서 제한 조건이 아이디, 이메일 중복여부를 제외하고 아무것도 없다.
극단적으로 말해서 아이디 1 비밀번호 1 이메일 1@1도 가능하다는 것이다.
이는 무차별 대입공격이나 다른 리소스를 잡아먹는 툴들의 리소스도 적게 사용하게 만들기 때문에 이에대한 최소한의 조건을 만들어야한다.
이는 다음에 추가적인 코드를 작성하도록 하겠다.
다음에는 SSID의 탈취 방법과 SQL injection으로 로그인 우회를 해보도록 하겠다.
뭔가 내가 아는게 많지 않다보니 내가 만든 페이지 로그인도 뚫지 못한다는게 살짝 자괴감이 든다.
근데, 내가 뭔가를 알게되면 그걸로는 내가만든 페이지가 뚫린다는게 마음이 아파 다른걸 더 찾아서라도 막고싶어진다..
그래가지고 괜히 DB도 root 계정이 아니라 일부 권한만 준 계정을 만들고, 비밀번호를 해시해서 password_varify()로 해시값 비교하고, SQL Injection 막는다고 string으로 바인딩 하고..그러다보니 뚫는 능력보다 막는능력이 더 높아지는거같다.
'study' 카테고리의 다른 글
정보공학 개발 방법론, Entity-Relationship Diagram(ERD) (0) | 2023.06.22 |
---|---|
Extreme Programming (XP. eXtreme Programming) (0) | 2023.06.22 |
메시지 지향 미들웨어(message-oriented middleware. MOM) (0) | 2023.06.22 |
UML 다이어그램 (0) | 2023.06.22 |
해시 기초 (0) | 2023.04.25 |