kaka09
PHP preg_replace e modifier 취약점 본문
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 버전에는 사용이 안되는 옵션이다. 따라서 현재 해당 취약점으로 어딜 공략할 만한 사이트가 있을까??
'Web' 카테고리의 다른 글
리버스 쉘(nc via mkfifo) (0) | 2017.12.05 |
---|---|
document.cookie bypass (0) | 2017.09.08 |
mysql용 SQLI 치트시트(계속 업데이트 예정) (0) | 2017.09.02 |
대충짜본 오라클 공격쿼리??(계속 업데이트 예정) (0) | 2017.09.02 |