간단 한 이야기php://filter묘 용

4630 단어 phpphp://filter
php://filterPHP 에 만 있 는 협의 입 니 다.이 협 의 를 이용 하면 많은'묘 용'을 창조 할 수 있 습 니 다.본 고 는 몇 가지 재 미 있 는 점 을 말 하고 나머지 는 여러분 스스로 체험 하 겠 습 니 다.원래 본 논문 의 사고 방향 은 제 가 상반기 에 XDCTF 2016 문 제 를 풀 려 고 했 는데 세 개의 흰 모자 문제 에 앞 당 겨 쓸 줄 몰 랐 습 니 다.저도 미리 공유 할 수 밖 에 없 었 습 니 다.
XXE 에서 의 사용
php://filter그동안 가장 많이 나 왔 던 곳 은 XXE 였 다.XXE 구멍 의 특수성 때문에 HTML,PHP 등 파일 을 읽 을 때 오류 가 발생 할 수 있 습 니 다.parser error:StartTag:invalid element name.그 이 유 는 PHP 가 태그 기반 스 크 립 트 언어 이기 때 문 입 니 다.이 문법 도 XML 과 일치 하기 때문에 XML 을 해석 할 때 XML 로 오 해 될 수 있 으 며,그 중 내용(예 를 들 어 특수 문자)은 표준 XML 과 충돌 할 수 있어 오류 가 발생 했다.
그러면 민감 한 정보 가 포 함 된 PHP 등 원본 파일 을 읽 기 위해 서 는'충돌 을 일 으 킬 수 있 는 PHP 코드'를 먼저 인 코딩 해 야 합 니 다.php://filter。
php://filterPHP 언어 에서 특유 한 프로 토 콜 흐름 으로'중간 흐름'으로 다른 흐름 을 처리 하 는 역할 을 합 니 다.예 를 들 어,POST 내용 을 base 64 인 코딩 으로 변환 하고 출력 할 수 있 습 니 다.
readfile("php://filter/read=convert.base64-encode/resource=php://input");
다음 과 같다.

따라서 XXE 에서 도 PHP 등 충돌 하기 쉬 운 파일 을 흐 르 게 할 수 있 습 니 다.php://filter프로 토 콜 흐름 을 한 번 처리 하면 특수 문자 가 혼란 을 초래 하 는 것 을 효과적으로 피 할 수 있다.
아래 와 같이 우리 가 사용 하 는 것 은?php://filter/read=convert.base64-encode/resource=./xxe.php

인 코딩 과 디 코딩 을 교묘 하 게 사용 하 다.
인 코딩 을 사용 하면 파일 을 가 져 오 는 데 도움 이 될 뿐만 아니 라'불필요 한 번 거 로 움'도 제거 할 수 있 습 니 다.
얼마 전에 세 개의 흰 모자 에 경기 가 있 었 는데 그 중 일 부 는 다음 과 비슷 했다.

<?php
$content = '<?php exit; ?>';
$content .= $_POST['txt'];
file_put_contents($_POST['filename'], $content);
 $content 는 처음에 exit 과정 을 추 가 했 기 때문에 우리 가 한 마디 를 성공 적 으로 쓰 더 라 도 실행 할 수 없습니다.(이 과정 은 실전 에서 흔히 볼 수 있 습 니 다.캐 시,프로필 등에 나타 나 고 사용자 가 직접 접근 할 수 없 는 파일 은 if(!defined(xxx))exit;따위 의 제한.그렇다면 이런 상황 에서 어떻게 이'사망 exit'를 돌아 갑 니까?
다행히도,이곳 의$POST['filename']는 프로 토 콜 을 제어 할 수 있 습 니 다.사용 할 수 있 습 니 다.php://filter프로 토 콜 로 마법 시전:사용php://filter흐 르 는 base 64-decode 방법,$content 디 코딩,php base 64 이용decode 함수 특성"사망 exit"제거.
base 64 인 코딩 에는 인쇄 가능 한 64 개의 문자 만 포함 되 어 있 으 며,PHP 는 base 64 를 디 코딩 할 때 그 안에 없 는 문 자 를 만 났 을 때 이 문 자 를 건 너 뛰 고 합 법 적 인 문자 만 새로운 문자열 로 디 코딩 합 니 다.
그래서 정상 적 인 base 64decode 는 실제로 다음 과 같은 두 단계 로 이해 할 수 있다.

<?php
$_GET['txt'] = preg_replace('|[^a-z0-9A-Z+/]|s', '', $_GET['txt']);
base64_decode($_GET['txt']);
그래서$content 에앞으로 우 리 는 사용 할 수 있다.php://filter/write=convert.base64-decode 를 먼저 디 코딩 합 니 다.디 코딩 과정 에서 문자<,?,;,>,빈 칸 등 모두 7 개의 문자 가 base 64 인 코딩 에 부합 되 지 않 는 문자 범 위 는 무시 되 기 때문에 최종 적 으로 디 코딩 된 문 자 는'phpexit'와 우리 가 들 어 온 다른 문자 만 있 습 니 다.
"phpexit"는 모두 7 글자 입 니 다.base 64 알고리즘 디 코딩 시 4 개의 byte 한 그룹 이기 때문에 그 에 게"a"총 8 개의 문 자 를 추가 합 니 다.이렇게 해서'phpexita'는 정상적으로 디 코딩 되 었 고,뒤에 우리 가 들 어 온 웹 셸 의 base 64 내용 도 정상적으로 디 코딩 되 었 다.결 과 는없어.
마지막 효 과 는:

문자열 조작 방법
어떤 학우 들 은 base 64 의 알고리즘 을 나 는 모른다 고 말한다.위의 방법 은 너무 복잡 하 다.
사실 base 64 특성 을 사용 하 는 방법 외 에 도 우 리 는 이용 할 수 있다.php://filter문자열 처리 방법 으로'사망 exit'를 제거 합 니 다.이것 괜찮아요?php exit; ?>실제로 무엇 입 니까?
실제로 XML 태그 입 니 다.XML 태그 인 이상 strip 을 이용 할 수 있 습 니 다.tags 함수 제거php://filter마침 이 방법 을 지지 하 는 것 이다.
다음 테스트 코드 를 작성 하면 볼 수 있 습 니 다.php://filter/read=string.strip_tags/resource=php://input 의 효과:
echo readfile('php://filter/read=string.strip_tags/resource=php://input');

보다php exit; ?>제 거 됐 습 니 다.그러나 위의 제목 으로 돌아 가면,우리 의 최종 목적 은 웹 셸 을 쓰 는 것 이 고,웹 셸 도 php 코드 입 니 다.strip 를 사용 하면tags 역시 제 거 됩 니 다.
다행히php://filter여러 필 터 를 사용 할 수 있 습 니 다.웹 셸 을 base 64 로 인 코딩 할 수 있 습 니 다.호출 완료 striptags 후 base 64-decode 를 진행 합 니 다."죽음 exit 는 첫 번 째 단계 에서 제거 되 었 고,웹 셸 은 두 번 째 단계 에서 복원 되 었 다.
최종 패 킷 은 다음 과 같 습 니 다.

그 밖 에 우 리 는 rot 13 인 코딩 을 이용 하여 독립 적 으로 임 무 를 완성 할 수 있다.원 리 는 위 와 유사 하 며,핵심 은"사망 exit"를 제거 하 는 것 입 니 다.rot 13 인 코딩 을 거 친 후에,PHP 에서 short 오픈 하지 않 음open_tag 시 php 는 이 문자열 을 모 릅 니 다.물론 실행 하지 않 습 니 다.

물론 이 방법의 조건 은 짧 은 라벨 을 열지 않 는 것 이다.
이상php://filter우리 에 대한 여러분 의 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기