webhacking.kr 34번, 35번, 48번 풀이

julia·2021년 5월 5일
0
post-thumbnail

💡 34번 문제 풀이

문제를 들어가자마자 debug me라는 alert가 뜬다. 그 후 까만 화면이 보이는데, 우선 개발자 도구를 열어 스크립트를 확인해보았다.
https://beautifier.io/
에서 코드를 보기 좋게 다듬으면... 다듬어도.... 코드가 너무 길다.
그래서 문제에서 가장 중요할 것 같은 부분인 alert 부분만 우선 보기로 했다.

if (location[b('0x19', 'iUmC')][b('0x1a', '6]r1')](0x1) == b('0x1b', 'RLUb')) location[b('0x1c', '4c%d')] = b('0x1d', 'llaF');
else alert(b('0x1e', '14cN'));

alert문을 보기 싫으니, else문이 아니라 if문의 결과값인
location[b('0x1c', '4c%d')] = b('0x1d', 'llaF');
를 콘솔창에 입력해 보았다. 그랬더니 "./?Passw0RRdd=1" 가 결과값으로 떴고 문제가 바로 해결되었다.
이렇게 푸는게 맞나 싶긴 하지만,, 중요해보이는 부분부터 코드를 우선적으로 분석해보는 방법이 좋은 것 같다는 생각이 들었다.

💡 35번 문제 풀이

<?php
$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>";
}

$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");
}

$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";
?>

우선 테이블에 admin 값을 넣어주어야 한다. 따라서 phone값을 통해 인젝션을 시도하여 admin의 값까지 전달해주면 될 것이다.
values('{_GET['id']}','{_SERVER['REMOTE_ADDR']}',{_GET['phone']})" 중 {_GET['phone']} 이 위치에 쿼리를 조작해 삽입한다.

values('guest', 'myip', 1),('admin', 'ip주소', '010')"

따라서 위의 볼드체 부분을 input시키면 문제가 해결된다!

💡 48번 문제 풀이

48번은 OS 커맨드 인젝션 공격이라는 것을 사용했다. 이는 웹 어플리케이션을 통해 운영체제(OS) 명령을 실행하는 취약점으로, 이를 실행할 경우 실행되는 시스템에 의해서 내부 데이터가 출력되거나 임의의 명령을 실행할 수 있을 뿐만 아니라 악용되면 서버를 장악하고 다양한 정보를 탈취할 수 있는 위협이다. (출처-이글루시큐리티)

이 문제에서 파일 업로드 자체는 정상적으로 이루어지는 것을 알 수 있다. 파일을 업로드하면 "upload_file" 과 "delete" 두 개의 하이퍼링크가 뜨는데, 업로드 파일은 누르면 그냥 파일을 보여주기 때문에, 딜리트를 이용해야 한다는 생각이 든다.
버프스위트로 인터셉트를 해보면 다음과 같은 결과가 나온다.

-----WebKitFormBoundaryLfZG5RIQijGfj0Qw
Content-Disposition: form-data; name="upfile"; filename="img.png"
Content-Type: image/png

여기서 filename을 ;ls로 수정해주면, OS 커맨드 인젝션을 사용하게 되는 것이고 ls라는 명령어를 통해 내부 데이터를 볼 수 있게 되는 것이다. 값을 변경한 뒤에 포워딩시켜주면 결국 플래그 값이 노출되어 문제가 해결된다.

😎 느낀점

48번을 풀면서 새로운 인젝션을 알게 되었다. 현재 학교 수업에서 리눅스를 배우고 있지만 사실 이런 명령어들을 직접 어디다가 어떻게 써먹어야할 지 몰랐는데, 이번 기회로 경험해보게 되어 좋았다.

profile
Move Forward

0개의 댓글