본문 바로가기
드림핵

[드림핵] [wargame.kr] tmitter

by jwcs 2023. 7. 6.
728x90

https://dreamhack.io/wargame/challenges/343/

 

[wargame.kr] tmitter

Description text you need login with "admin"s id! create table tmitter_user( idx int auto_increment primary key, id char(32), ps char(32) );

dreamhack.io

mysql의 취약점을 이용한 문제이다.

 

you need login with "admin"s id!

===========================
create table tmitter_user(
    idx int auto_increment primary key,
    id char(32),
    ps char(32)
);

문제 설명에 나와있는 내용이다 풀이에 참고하자.

 

/

초기화면이다. 로그인 화면 페이지와 회원가입 페이지로 나뉘는것이 보인다.

회원가입 화면이다. ID는 적어도 4글자 이상 패스워드는 적어도 7글자 이상 필요하다고 한다.

<head>
 <style>
  body {background-color:#eef;}
  table td {text-align:center; background-color:#dde;}
  .ex {text-align:left; color:#99a; font-size:9pt;}
 </style>
 <script>
  function chk(f){
   if(f.id.value.length<4){alert("chk id"); return false;}
   if(f.ps.value.length<7){alert("chk ps"); return false;}
   return true;
  }
 </script>
</head>
<body>
<center>
 <img src="./tmitter.png">
 <form onsubmit="return chk(this);" method="post">
  <table>
   <tr><td>ID</td><td><input type="text" name="id" maxlength="32"></td><td class="ex">at least 4char</td></tr>
   <tr><td>PS</td><td><input type="password" name="ps" maxlength="32"></td><td class="ex">at least 7char</td></tr>
   <tr><td colspan=2><input type="submit" value="join"></td></tr>
  </table>
 </form>
</body>
<!-- hint : you need join with admin -->

이와 관련된 스크립트가 작성되어있는 것이 보인다. 마지막에 admin으로 가입하라는 힌트가 보인다.

 

admin으로 가입해보자.

 

admin이 이미 존재한다고 한다. 어떻게 우회해야 할까?

 

mysql에서 id의 데이터 타입은 고정 문자형이다. 이보다 큰 문자열을 입력하면 뒤에 문자열은 짤려서 입력이된다.

즉, admin + 공백 27글자와 아무 문자 1개를 넣어주면 아무 문자 1개는 짤려서 admin이 저장된다.

 

그러나 32글자 제한이 걸려있는데 이를 어떻게 우회해야할까?

필터링이 걸려있는 것은 스크립트에 걸려있다. 이는 관리자 도구를 통해 코드를 지우고 쉽게 우회가 가능하다. 물론 버프스위트로도 우회할 수 있다.

 

maxlength를 33으로 수정해주고 id에 아무 문자나 넣어준 모습이다.

 

가입이 완료됐다. 마찬가지로 maxlength를 늘려주고 로그인을 해주자.

 

 

짜잔....원래 flag가 있었는데...Tmeet 눌렀더니 사라졌어요..

 

요약

-id는 고정 문자형이며 기본키가 아니어서 중복이 가능하므로 취약하다. "admin + 공백문자 27글자 + 아무 문자"로 뚫을 수 있다.

-스크립트로 구성된 필터링은 관리자 도구 혹은 버프스위트로 우회가 가능하다.

 

궁금한 점이 생길 수 있다. admin과 admin+공백 27글자는 같은 문자열인가? 여기선 같은 문자열이다. 왜냐하면 고정 길이 문자열 타입은 빈 부분에 공백 문자로 패딩한다. 즉 char(32)인 id에 저장되는 admin과 admin+공백 27글자는 모두 admin + 공백 27글자로 저장된다. 관련 자료 첨부하겠다.

https://techblog.woowahan.com/2559/

 

MySQL에서 ‘a’ = ‘a ‘가 true로 평가된다? | 우아한형제들 기술블로그

{{item.name}} DB 알못의 어떤 리서치 개요 안녕하세요 기계인간 이종립입니다. FC플랫폼개발팀에서 배민찬 백엔드를 개발하고 있습니다. DB알못인 저는 업무 중에 우연히 MySQL에서 'a' = 'a '의 결과가

techblog.woowahan.com

 

그렇다면 어떻게 같은 문자열인데 우리가 입력하는 admin이 저장될 수 있을까?

문제에서 id는 primary key가 아니다. 즉 기본키가 아니기 때문에 중복될 수 있다.

 

 

728x90
반응형

'드림핵' 카테고리의 다른 글

[드림핵] simple-web-request 풀이  (0) 2023.07.09
[드림핵] Command Injection Advanced 풀이  (0) 2023.07.09
[드림핵] phpreg 풀이  (0) 2023.06.30
[드림핵] Flying Chars 풀이  (0) 2023.05.30
[드림핵] pathtraversal 풀이  (0) 2023.05.30