article thumbnail image
Published 2023. 1. 31. 01:07

PHP Filter Chain이란?

PHP Filter Chain 취약점의 타임라인 (안 읽어봐도 되지만, 나오는 블로그는 알아두면 좋을 것 같음)

https://gynvael.coldwind.pl/?id=671

 

PHP Filter Chain 취약점은 현재 Google IT Security Engineer로 일하고 계신 gynvael님이 Insomni'hack CTF 2018에서 PHP Filter 취약점 문제를 풀이하다가 우연히 iconv 변환 필터를 이용하여 서버 측의 필터링 기능 우회를 성공하여 발견되었습니다.

 

https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d

 

그리고 gynvael님은 발견한 것을 자신의 블로그에 업로드를 하였습니다.

2021년에 loknop님이 hxp ctf 2021에서 gynvael님의 블로그를 참고하여 문제 풀이에 성공하여, 해당 문제의 Write up를 자신의 Github Gist에 문제풀이를 업로드했습니다.

 

https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html

 

해당 Github Gist에 올린 Write up을 보고 SYNACKTIV의 Rémi Matasse 분께서 자세하게 분석한 포스트가 올라왔습니다.

 

https://portswigger.net/research/top-10-web-hacking-techniques-of-2022-nominations-open

 

이것이 화제가 되어 portswigger의 Top 10 Web hacking techniques of 2022의 후보군으로 선정이 되었습니다.

분석

컴퓨터에서는 다양한 언어를 사용하기 위해 많은 인코딩 테이블이 만들어졌습니다.

 

이 많은 인코딩을 리눅스의 iconv이라는 명령의 -l 옵션을 이용하여 리눅스에서 사용 가능한 인코딩을 확인할 수 있습니다.

 

PHP에서는 iconv 명령의 지원이 활성화된 경우, php://convert.iconv.*.* Wrappers를 이용하여 글자의 인코딩을 변경 가능합니다.

 

흥미로운 부분은 @_> 문자열을 base64 값에 추가하는 경우에도 PHP에선 오류가 발생되지 않고, 무시하고 존재하지 않은 것처럼 동작했다는 것입니다. 해당 부분은 추후 밑에서 왜 무시를 했는지, 알아보도록 하겠습니다.

 

PHP는 base64-decode 필터 및 base64_decode 함수의 동작에서도 비슷하지만 아주 작은 차이점이 존재합니다.

 

위 사진에서 나온 것처럼 base64-decode 함수는 base64_decode 함수에 비해 = 문자에 대한 처리를 제대로 하지 못합니다. 이를 해결하기 위해선 = 문자를 없애는 것이 필요합니다.

 

해결책 중 하나는 UTF-7 인코딩을 사용하는 방법이 존재합니다. UTF-7 인코딩은 = 문자를 base64-decode 함수의 필터가 방해되지 않은 다른 문자로 변환하기 때문입니다.

 

 

복사했습니다!