[Webhacking.kr] Old - 35 Write Up
작성자 - LRTK
전화번호를 입력하는 페이지가 나왔다.
카페에서 여자가 내 번호를 물어봤을 때, 내가 여자의 폰에 전화번호를 입력하는 설레는 마음으로 입력하여, 서버로 보내니 no hack이 출력되었다.
왜 까였는지 확인하기 위해, 코드를 분석하였다.
$db = dbconnect();
if($_GET[‘phone’] && $_GET[‘id’]){
if(preg_match(“/\*|\/|=|select|-|#|;/i”,$_GET[‘phone’])) exit(“no hack”);
if(strlen($_GET[‘id’]) > 5) exit(“no hack”);
if(preg_match(“/admin/i”,$_GET[‘id’])) exit(“you are not admin”);
mysqli_query($db,”insert into chall35(id,ip,phone) values(‘{$_GET[‘id’]}’,’{$_SERVER[‘REMOTE_ADDR’]}’,{$_GET[‘phone’]})”) or die(“query error”);
echo “Done<br>”;
}
phone과 id가 파라미터로 받는다.
phone에 *, /, =, selcet, -, #, ;
문자가 포함되어 있으면, “no hack”이 출력된다.
id의 길이가 5 초과이면, “no hack”이 출력된다. 또한 id이 admin
의 문자가 포함되어 있으면 “you are not admin”이 출력된다.
위 조건을 모두 통과를 하면, insert into chall35(id,ip,phone) values(‘{$_GET[‘id’]}’,’{$_SERVER[‘REMOTE_ADDR’]}’,{$_GET[‘phone’]})
의 쿼리를 통해 값이 저장이 된다.
$isAdmin = mysqli_fetch_array(mysqli_query($db,”select ip from chall35 where id=‘admin’ and ip=‘{$_SERVER[‘REMOTE_ADDR’]}’”));
if($isAdmin[‘ip’] == $_SERVER[‘REMOTE_ADDR’]){
solve(35);
mysqli_query($db,”delete from chall35”);
}
select ip from chall35 where id=‘admin’ and ip=‘{$_SERVER[‘REMOTE_ADDR’]}’
의 결과가 나의 공인 IP와 일치한다면, Flag를 출력한다.
$phone_list = mysqli_query($db,”select * from chall35 where ip=‘{$_SERVER[‘REMOTE_ADDR’]}’”);
echo “<!--\n”;
while($r = mysqli_fetch_array($phone_list)){
echo htmlentities($r[‘id’]).” - “.$r[‘phone’].”\n”;
}
echo “-->\n”;
select * from chall35 where ip=‘{$_SERVER[‘REMOTE_ADDR’]}’
의 결과를 HTML 주석으로 출력한다.
나는 코드를 보고 일단 chall35 테이블에 내 IP로 저장된 데이터들을 출력하였다.
주석으로 데이터가 출력되었다.
나의 IP으로 저장된 admin 계정이 없고, guest 계정만 있다는 것을 알 수 있었다.
나는 insert into chall35(id,ip,phone) values(‘{$_GET[‘id’]}’,’{$_SERVER[‘REMOTE_ADDR’]}’,{$_GET[‘phone’]})
를 통해 admin을 삽입하고자 하였다.
Id 파라미터에서 Hex을 검증을 안하여, hex를 이용하여 admin를 삽입하고자 하였다.
시도를 하였지만 no hack이 출력이 되었고 그 이유를 보니, id의 길이가 5를 초과하여 no hack이 출력된 것이였다.
시도할 수 있는 공격백터는 id와 phone으로 진행해야하는데, id는 길이 때문에 공격에 사용할 수 없다.
phone로 공격해야한다는 것을 생각을 하였고, 혹시 내가 모르는 insert 쿼리 사용법이 있는지 알아보기로 하였다.
공부해서 남 주자
위 블로그에서 방법을 찾을 수 있었다.
테스트를 해보니, admin이 잘 삽입된 것을 볼 수 있다.
2'), ('admin', '223.38.91.158', '3
으로 계속 시도하였는데 query error가 나와서 당황했는데, 문제의 코드를 자세히 보니 phone의 타입은 int형이였다.2), ('admin', '223.38.91.158', 3
으로 시도하니, 정상 작동하였다.
내가 생각한 이론이라면, Flag가 바로 출력되어야 하는데 출력이 되지 않아서 주석을 확인해보니 admin이 저장되지 않았다.
Query문이 잘못되었다면, Error를 출력했을텐데 출력이 되지 않았으니 IP주소가 틀린 것인데 IP주소는 틀림없이 맞는 주소였다.
집에서 한번 더 시도하고, 안되면 다른 사람의 풀이를 참고해야겠다……
집에서 시도하였더니, flag를 획득할 수 있었다.
밖에선 아이폰의 핫스팟으로 시도하였는데, 왜 안됬는지 의문이다. 일단 문의 넣어봤다.
'Season 1 > 워게임' 카테고리의 다른 글
suninatas/웹/4번 문제풀이 (0) | 2021.05.30 |
---|---|
[Webhakcing.kr] Old - 48 Write Up (0) | 2021.05.29 |
[dreamhack] command-injection-1 문제풀이 (0) | 2021.05.28 |
[dreamhack] simple_sqli 문제풀이 (0) | 2021.05.28 |
[Webhacking.kr] Old - 8 Write Up (0) | 2021.05.28 |