Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

kaka09

PHP preg_replace e modifier 취약점 본문

Web

PHP preg_replace e modifier 취약점

kaka09 2017. 8. 4. 20:13

PHP e ModiFier 취약점은 

preg_replace 함수에서  "/e" 옵션을 사용할때 발생하는 취약점이다. "/e" 옵션은  치환될 문자를 php 코드 그대로 해석하는 옵션이다. 만약 치환된 결과가 system과 같은 문자열일 경우 /e 옵션에 의해 해당 문자열은 php 코드 그대로 해석하게 될 것이다.


Nebula level09 문제를 통해서 e modifier 취약점에 대해 살펴보자


[사진]1-1



소스코드를 살펴보면 인자 2개를 받도록 설계되어 있고, 그중 첫번째 인자는 파일명을 받도록 되어있다. 여기서 취약점 포인트는 

$contents = preg_replace("/(\[email (.*)\])/e", "spam(\"\\2\")", $contents); 부분이다.

위에서 서술한대로 "/e"옵션을 이용하여 $argv[1]을 system php 코드로 동작하게 조작하여야 한다. 그런데 치환될 문자에 spam("\\2\")가 들어간다.  구글링을 해본결과 \\n 은 정규표현식에서 역참조 문법이라고 한다. 다음 예제를 살펴보자




[사진]1-2


[사진]1-2 보는바와 같은 패턴매칭이 존재하고 $str에 April 15,2003을 입력하였더니 April이 반환되었다. \\n은 패턴에 매칭된 문자열을 n번째 순으로 보여주는거라 할 수 있다.




[사진]1-3


\\2일때와 \\3의 결과도 살펴보면 어떤 원리인지 충분히 이해가 갈 것이다. 참고로 \\0은 문자열 전체를 의미한다는것을 알아두자

이제 역참조 문법도 알아보았으니 다시 문제로 돌아가자  




[사진]1-4




취약점이 있는 코드를 살펴보면 2번째 매칭문자열에 대해 /e 옵션에 php 코드로 처리되면서 $contents에 저장된다. 따라서 파일을 하나 만들고 파일의 내용을 [email system(/bin/sh)] 같은 내용으로 만들면 된다.




[사진]1-5



파일의 내용은 위 사진에서 아무거나 하나만 사용하면 된다.






[사진]1-6



결과는 다음과 같다. e modifier 취약점은 상당히 예전에 발견된 취약점이고 현재 5.x 버전에는 사용이 안되는 옵션이다. 따라서 현재 해당 취약점으로 어딜 공략할 만한 사이트가 있을까??