Web Hakcing

Old revenge 43 | webhacking.kr

burrri 2024. 3. 28. 20:46

문제의 서버에 접속하면 아래와 같이 파일업로드란과 함께 소스코드가 주어진다. 

https://webhacking.kr/chall.php

- 소스코드 분석

<html>
<head>
<title>Challenge 43 RevengE</title>
</head>
<body>
<hr>
You must upload webshell and cat <b>/flag</b>
<hr>
<?php
  if(isset($_FILES['file'])){
    $type = $_FILES['file']['type'];
    $name = $_FILES['file']['name'];
    
    // filtering ----
    if(!$type) { exit("type not detected"); }
    // name을 통한 flag도출 방지
    if(preg_match("/\.\.|\/|\\\|\.htaccess/",$name)) exit("dont do that");
    // type가 text, application/octet-stream이면 wrong 도출 
    if(preg_match("/text\/|application\/octet-stream/i",$type)) exit("wrong type");
    
    $image = new Imagick();
    $image->readImage($_FILES['file']['tmp_name']);
    $image->resizeImage(500, 500, imagick::FILTER_GAUSSIAN, 10);
    $image->writeImage("./upload/".$name);
    echo "Done!<br><br><a href=./upload/{$name}>./upload/{$name}</a>";
  }
?>
<form method=post enctype="multipart/form-data" action=index.php>
<input name=file type=file><input type=submit>
</form>
<hr><?php highlight_file(__FILE__); ?>
</body>
</html>

 

text파일을 넣으니 wrong type이 뜨는 것을 확인할 수 있다.

 

아무개 jpg파일을 업로드하니 done!이 뜬다. 

패킷을 잡아보니 content-type이 image/jpeg임을 확인



webshell_ php파일을 업로드하니 wrong type이라고 뜬다. 여기서도 패킷을 잡아보니 소스코드에서 막는 application/octet-stream임을 확인하였다.

 

- exploit 

 

webshell php 파일의 content-type을 image/jpeg로 변경한 후, forward를 통해 패킷을 날려보자.

안된댄ㄷㅏ

 

그래서 아예 파일 업로드 취약점을 활용하여 jpeg파일을 업로드하면 웹셸이 실행되도록 해보았다.

코드를 보면 이미지를 받아서 resize한다. 파일자체가 수정되므로 파일에 대한 정보가 저장되어있는 메타데이터에 넣으면 변경되지않는 형태로 삽입할 수 있다. 

 

메타데이터를 hxd로 읽어서 어찌저찌 추가해볼려고 했는데 도저히 안돼서 그냥 tool썼다ㅎㅎ최고 최고

$apt install exiftool 명령어를 통해서 ubuntu 에서 바로 다운받아서 사용하였다. 

ExifTool은 이미지와 오디오 파일 등의 디지털 미디어에 대한 메타데이터를 읽고 쓸 수 있는 강력한 도구이다. 
이를 통해 메타데이터 편집, 메타데이터 읽기, 배치 처리 변경 등을 할 수 있다.

$exiftool -[입력할 속성 위치]="[입력할 코드]" [output file]

 

jpeg의 다양한 메타 데이터 속성 중에서 copyright 속성에 실행 코드를 넣어보자

이때, 주의할 점은 삽입할 코드 내의 "를 그냥 쓰면 앞에서 끝나버릴 수 있으므로

특수문자를 그대로 입력하기 위해 이스케이프 슬래쉬, 백슬래쉬(\)를 넣어주어야한다.

 

hxd를 통해 코드가 잘 들어있는 것을 확인

 

 

이제 셸이 삽입된 jpg파일을 업로드하자. burp suite으로 패킷을 잡아서 jpg파일을 php로 인식하도록 확장자를 변경해주자

jpg -> php // type 유지 >>필터링 우회

 

그리고 forward를 통해 패킷을 날리고 intercept를 꺼주면 다음과 같이 system("cat /flag")명령어가 실행된 것을 확인할 수 있다

오른쪽 상단에 플래그 도출