PHP 반 직렬 화 에서 필터 함수 의 부적 절 한 사용 으로 인 한 대상 주입 문 제 를 분석 합 니 다.

1.구멍 이 생 긴 원인
\#\#\#정상 적 인 반 직렬 화 문 구 는 이렇다.
$a='a:2:{s:8:"username";s:7:"dimpl3s";s:8:"password";s:6:"abcdef";}';
근 데 이렇게 쓰 면
$b='a:2:{s:8:"username";s:7:"dimpl3s";s:8:"password";s:6:"123456";}s:8:"password";s:6:"abcde";}';
정상적으로 컴 파일 할 수 있 고 다음 문장의 결 과 는 password="123456"이지 abcde 가 아 닙 니 다.

결실

이것 은 한 가지 문 제 를 설명 한다.반 직렬 화 할 때 첫 번 째 직렬 화 문자열 만 합 법 적 으로 요구 하면 된다.내 가 이해 하 는 바 와 같이 반 서열 화 할 때 그 는 가서 읽 고 첫 번 째 합 법 적 인 직렬 화 문자열 을 읽 을 때 반 직렬 화 된다.
\#\##사용자 가 인 자 를 입력 할 때 직렬 화 된 다음 직렬 화 된 문자열 을 걸 러 내 고 걸 러 내 는 과정 에서 원래 의 길이 가 바 뀌 면 직렬 화 대상 에 구멍 이 생 길 수 있 습 니 다.
다른 사람의 코드 를 참고 하 십시오:


이 를 통 해 알 수 있 듯 이 필터 함 수 는 원래 의 x 를 zz 로 바 꾸 었 으 나 길 이 는 원래 의 길 이 를 초과 하 였 으 나 원래 의 길이 의 숫자 는 변 하지 않 았 기 때문에 오 류 를 초래 하 였 다.하지만 여기 비밀번호 가 제어 가능 하 다 면 문 자 를 입력 해 보 세 요.
따옴표 와}를 가 져 오 면 어떻게 되 나 요?코드

결실

첫 번 째 줄 은 우리 가 만 든 것 이 서열 화 된 후의 값 이다.
두 번 째 줄 은 직렬 화 된 후의 값 을 여과 한 후의 값 으로 볼 수 있 습 니 다.이때 x 가 z 로 바 뀌 었 기 때문에 앞에서 40 을 읽 을 때 마지막 x 까지 읽 어서 우리 가 입력 한 새로운 대상 을 주입 시 키 고 정상 적 인 반 직렬 화 를 얻 을 수 있 습 니 다.
세 번 째 줄 은 반 직렬 화 된 값 입 니 다.이때 원래 aaaa 의 값 은 우리 에 게 덮어 씌 워 졌 습 니 다.
2.사례 분석
위의 원인 을 통 해 알 수 있 듯 이 구멍 이 생 긴 가장 직접적인 원인 은 직렬 화 된 문자열 이 걸 러 질 때 길이 가 달라 지기 때 문 입 니 다.이 원인 에 따라 구멍 을 길이 가 길 어 지고 길이 가 짧 아 지 는 두 가지 상황 으로 나 눌 수 있 습 니 다.주의 하 세 요!길이 가 변 하지 않 으 면 구멍 이 생기 지 않 는 다.
(1)길이 가 짧 아진 다.
제목:안 순 배 2019 easyserialize_phop//https://buuoj.cn/ 이 사격장 에서 재현
원본 코드:

힌트 에 따라 phopinfo 에서 받 습 니 다.

분명히 답 은 d0g3f1 ag.phop 에서 관건 은 우리 가 그의 소스 코드 를 어떻게 읽 느 냐 하 는 것 입 니 다.마지막 줄 에서[img]의 소스 코드 를 얻 을 수 있 습 니 다.우 리 는 img 의 값 만 덮어 서 그 를 d0g 3 로 만 들 수 있 습 니 다.f1ag.php 면 됩 니 다.
이 필터 함수 보고 있어 요.

그 는 입력 한 해당 문 자 를 비 울 것 이다.즉,직렬 화 된 문자열 을 짧게 만 들 면 우 리 는 이 를 이용 하여 원래 의 변수 이름 을 삼 키 고 우리 가 주입 하고 싶 은 코드 를 주입 할 수 있다.
첫 번 째 해법:탈출 값
d0g3_f1 ag.php 의 base 64 인 코딩 ZDBnM19mMWFnLnBocA==길이 20
로 컬 테스트 에서 정상 적 인 직렬 화 문 자 를 얻 는 것 은 이 렇 습 니 다.
a:3:{s:4:"user";s:5:"guest";s:8:"function";s:3:"123";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}
전자 user 와 function 의 값 은 모두 우리 가 제어 할 수 있 는 것 이다.
우리 가 구축 하고 자 하 는 것 은 s:3:"img"이다.s:20:"ZDBnM19mMWFnLnBocA=="; 만약 에 우리 가 그것 을 function 의 값 을 설정 하고 앞의 user 의 값 을 필터 함수 로 뒤의's:8:'function'을 사용 하면s:xx:"삼 키 면 function 의 값,즉 우리 가 주입 하고 자 하 는 대상 이 바로 상위 에 있 지 않 습 니까?"그러나 앞 에 있 는 삼 키 기 때문에 부족 한 분점 과 작은 따옴표 를 닫 는 것 을 주의 하 세 요.그리고 여기 두 개의 작은 따옴표 가 붙 어 있 으 면 잘못 보고 할 수 있 습 니 다.그래서 우 리 는 문 자 를 하나 더 추가 하고 이 문 자 를 함께 삼 키 면 됩 니 다.그리고 여기 앞 에 a:3 입 니 다.그래서 저 는 마지막 에 속성 을 추가 해 야 합 니 다.
payload
_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}
원본 코드 읽 기

payload 파일 의 값 을 수정 한 다음 에 방문 합 니 다.아무것도 돌아 오지 않 은 것 을 발견 하고 시도 합 니 다././d0g3flllllag 그리고 base 64 인 코딩 으로 접근 하면 flag 로 돌아 갑 니 다.

(2)길이 가 길어진다
제목[0CTF]piapiapia//역시 buu 에서 재현
wp 여기 참고->https://www.jb51.net/article/180496.htm
a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:8:" [email protected]";s:8:"nickname";s:8:"sea_sand";s:5:"photo";s:10:"config.php";}s:39:"upload/804f743824c0451b2f60d81b63b6a900 ";}
빨간색 부분 은 우리 가 주입 하고 자 하 는 것 이다.이 문제 의 여과 함 수 는 세 가지 가 있 지만 길이 변 화 를 일 으 키 는 여과 은 이것 이다.

where->hacker 에 문자 가 하나 더 나 왔 습 니 다.
그러나 다른 필 터 는 nickname 의 길 이 를 제한 합 니 다.

여기 strlen 은 배열 로 돌아 갈 수 있 지만 배열 을 사용 하면 직렬 화 문자열 에 변화 가 생 길 수 있 습 니 다.
a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:8:" [email protected]";s:8:"nickname";a:1:{i:0;s:3:"xxx"};s:5:"photo";s:10:"config.php";}s:39:"upload/804f743824c0451b2f60d81b63b6a900 ";}
배열 이 직렬 화 에서 먼저 나타 나 는 것 을 주의 하 십시오.더욱
여기 서 제 가 로 컬 테스트 를 했 어 요.

결과:

빨간색 부분 은 우리 가 주입 하고 싶 은 것 이다.파란색 은 우리 가 payload 를 제출 한 곳 이 고,뒤쪽 은 사실상 전혀 상관 하지 않 는 다.
지금 우리 가 생각 하 는 것 은 where->hacker 를 통 해 문자 가 하나 더 생 겨 서 우리 가 입력 한 Nickname 의 값 을 탈출 하여 대상 으로 만 드 는 것 입 니 다.
앞 에 있 는 작은 따옴표 와 괄호 를 닫 는 것 이 이 렇 습 니 다.";}s:5:"photo";s:10:"config.php";}
모두 34 글자 입 니 다.하나의 where 에서 한 글자 가 빠 져 나 오 면 34 개의 where 가 필요 합 니 다.
payload:wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}    
총화
무한 화 이 팅!중국 화 이 팅!파 이 팅!
위 에서 기술 한 것 은 여러분 에 게 소개 하 는 PHP 반 직렬 화 에서 필터 함수 의 부적 절 한 사용 으로 인 한 대상 주입 문제 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다!

좋은 웹페이지 즐겨찾기