간단 한 이야기php://filter묘 용
4630 단어 phpphp://filter
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우리 에 대한 여러분 의 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.