일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 리버싱 워게임
- 머신러닝
- 리버싱
- webhacking.kr
- html
- 어셈블리어
- 회귀 수식
- 인공지능
- 해킹
- abex crackme
- 보안
- 백준 알고리즘
- 리눅스
- writeup
- 컴퓨터 구조
- sql injection
- webhacking
- 백준
- 넘파이
- CodeEngn
- 워게임
- C언어
- 리버싱 문제
- MySQL
- 리액트
- php
- 웹해킹
- 웹
- 알고리즘
- 자바스크립트
- Today
- Total
인공지능 개발일지
[Wehacking.kr] old 41번 Writeup 본문
※제일 아래는 문제 푸는데는 결정적이지 않지만 이해 안 가시는 분들을 위해
코드 설명을 첨부하였습니다.※
안녕하세요. 두 번째 포스팅은 Webhacknig.kr old 41번 풀이입니다.
아래는 41번의 초기화면입니다.
흥미롭게도 파일을 업로드 할 수 있는 창이 있습니다.
이 문제는 url을 보니 GET방식은 아니군요.
우선 아무 파일을 업로드 해보았습니다.
뭐지 싶군요.
바로 소스 코드를 보겠습니다.
if문 마지막에 "Done~"을 출력하는 것을 보니 파일을 업로드 함으로서 if문 안에 들어오긴 했나 봅니다.
그럼 if문 가운데 코드들은 어떤 역할을 하는 것일까요?
위에서부터 차례로 알아보겠습니다.
여기서 주목해야할 부분은 아래 코드인데요.
error_reporting()은 PHP의 오류처리 함수로
두 가지의 옵션이 있습니다.
//오류출력 끄기
error_reporting(0);
//모든 오류 보기
error_reporting(E_ALL);
이 중 여기선 모든 오류 보기 옵션을 썼다.
ini_set()와 같이써서 위 두 줄은
php의 에러메세지를 화면에 출력하는 역할을 한다.
에러메세지에 정보가 담겨 있기 때문에 가급적 사용하지 않는 것이 좋다고 한다.
그러나 우리는 디렉터리 구조에 대한 정보가 필요하기 때문에
일부러 에러가 나도록 할 것이다.
이때 파일명을 길게해서 에러를 낼 것이다.
하지만 그냥 이름 바꾸기로는 에러낼 정도로 길게 안 되기 때문에
버프슈트로 에러를 낼 것이다.
따라서 일단 버프슈트를 깔았다.
버프슈트는 프록시의 툴이다.
프록시 서버는 클라이언트가 웹 서버에 접속하기 전에 거쳐가는 곳으로
중간에 변조할 수 있는데 지금 이것을 이용하려는 것이다.
먼저 설정에서 프록시 값을 변경해준다.
그리고 Burp Suite툴로 webhacking.kr의 41번 문제 링크로 들어가서 중간에 패킷을 탈취했다.
이 문제를 풀면서 프록시에 대해 알게 되었는데 사용법은 아래와 같다.
Intercept is on을 켜놓고 웹사이트에 들어가면 바로 안 들어가지고 Burp suite아이콘이 작업표시줄에서
깜빡거리는데 이것은 중간에 세션을 탈취해서 그런 것이다.
위의 화면은 프록시 서버에서 인터셉트 한 것이다.
다시 본론으로 돌아와서 파일명을 길게 해서 에러를 내려면 아래 화면에서 filename을
길게 수정해서 Forward로 수정된 내역을 전송해주면 된다.
그런데 여기서 filename이 보이지 않아 한참 헤멨다.
나는 프록시 서버로 41번의 링크로 들어가서 Forward만 계속 눌렀는데
알고보니 업로드한 다음 Forward를 눌러야 아래와 같이 filename이 나오는 것이었다.
그럼 이제 filename값을 길게 변경하고
다시 Forward를 눌러보면
아래화면과 같이 원하던 Warning이 뜬다.
위에서 디렉터리 경로는
/4b0e87fef7b5e8ba83894970c9806042e5d6ec9a/
로 나왔으므로 빈파일을 생성한 후 다시 업로드 해야한다.
빈파일을 먼저 생성해준다.
그런다음 위의 화면에 빈파일을 업로드하고 url에
확장자를 빼고 아래와 같이 입력하면 된다.
https://webhacking.kr/challenge/web-19/4b0e87fef7b5e8ba83894970c9806042e5d6ec9a/ex
그러면 flag값이 나오므로 이것을 Auth에 업로드하면 풀린다.
-----------------------------------------------------------------------------------------------------------------------------------
1. 먼저 isset()은 변수에 값이 존재하는지 확인해주는 함수입니다.
값이 존재하면 참을 존재하지 않으면 NULL값을 돌려줍니다.
이것을 바탕으로 아래 코드를 보면
if(isset($_FILES['up']) && $_FILES['up'])
'up'이라는 이름의 파일이 업로드되고 또 비어있지 않다면,
으로 해석할 수 있겠네요.
2. 다음으로는 $_FILES[파일명]["tmp_name"]입니다.
이는 간단히 $_FILES[a][b]으로 나타낼 수 있는데요.
입력 받은 [a]파일을 [b]라는 이름으로 저장하는 것인데 이때 [b]에 "tmp_name"이라는 옵션을
설정하게 되면 "tmp_name"으로 업로드된 파일을 임시저장하는 것입니다.
마찬가지로 아래 코드를 다시 보면
$fn = $_FILES['up']['name'];
'up'이라는 이름의 파일이 업로드 되면 'name'으로 저장한 것을 fn변수에 담고
$cp = $_FILES['up']['tmp_name'];
'up'으로 업로드된 파일을 임시이름('tmp_name')으로 cp에 저장한다.
로 해석할 수 있겠네요.
3. 마지막으로 str_replace(인자1,인자2,대상 문자열)은 대상 문자열의 파일에서
인자1 부분을 인자2로 바꿔주는 php함수입니다.
이를 바탕으로 위 코드의 str_replace()부분을 다시보면
$fn = str_replace(".","",$fn);
$fn = str_replace("<","",$fn);
$fn = str_replace(">","",$fn);
$fn = str_replace("/","",$fn);
fn이라는 변수에
. | < | > | / |
위 네 문자가 입력되면 없애는 코드군요.한마디로 네 문자를 필터링하는 것이죠.
4.copy($cp,"./{$upload_dir}/{$fn}");
copy()함수는 보이는 그대로
cp파일을 {$upload_dir}에 복사하여 저장하는 것이다.
'보안 > 해킹 워게임' 카테고리의 다른 글
[Wehacking.kr] old 24번 Writeup (0) | 2021.05.24 |
---|---|
[Wehacking.kr] old 23번 Writeup (0) | 2021.05.23 |
[Wehacking.kr] old 18번 Writeup (0) | 2021.05.22 |
[Xss-game]Level 1~6번 Writeup (0) | 2021.05.21 |
[Wehacking.kr]old 25번 Writeup (1) | 2021.05.17 |