websec.fr level24 write up
오늘도 어김없이 에이프릴 이나은으로 시작하는 write up
해당 문제는 webshell upload로 푸는 문제이다. webshell 이라는 확신이 들었던 이유는 다음 코드가 있었기 때문. (진짜 이 문제 풀려고 좀 시간 많이 투자했었는데 너무 허무하게 풀림ㅋㅋ)
if (strpos($data, '<?') === false && stripos($data, 'script') === false) { # no interpretable code please.
file_put_contents($_GET['filename'], $data);
die ('<meta http-equiv="refresh" content="0; url=.">');
}
해당 코드는 <? 를 필터링하여 웹쉘의 업로드를 막는다. 그리고 filename 에 {$filename}.php 가 들어갈 수 있기 때문에 웹쉘을 업로드하는데 생각보다 어려운 점은 없었다.
근데 우리는 파일 업로드를 하는 부분에서 file_put_contents() 함수를 이용하는 것을 유심히 보아야 한다. 해당 함수는 PHP의 Stream을 지원하는 함수이기 때문에 생각보다 쉬운 우회가 가능해진다. 따라서 php://filter/convert.base64-decode/resource={$filename}.php 를 이용하면 base64로 파일 내용을 필터링하는 if clause를 bypass 할 수 있기 때문에 webshell을 execution하여 문제를 풀 수 있다.
[*] exploit code : https://github.com/ch4n3-yoon/write-ups/tree/master/websec.fr/level24
'write-ups > websec.fr' 카테고리의 다른 글
websec.fr level09 write up (0) | 2018.07.10 |
---|---|
websec.fr level22 write up (0) | 2018.07.04 |
websec.fr level10 write up (0) | 2018.07.03 |
websec.fr level25 write up (0) | 2018.07.03 |
websec.fr level28 write up (1) | 2018.06.28 |