websec - level 24
파일이름을 입력하면 해당 파일명으로 파일을 생성할 수 있고, 안에 data를 넣을 수 있다.
data는 <?와 script가 필터링 되어 파일에 쓸 수 없다.
1. XSS
우리가 입력할 수 있는 것은 filename과 data이다.
처음에는 filename부분에 <script>태그를 넣어 xss를 시도하려고 하였다.
<script>alert(1)</script>를 넣었을 때 성공적으로 수행되며 edit창으로 넘어갔으나, /를 dir로 인식을 하는지
다음과 같은 오류로 서버에 저장되지 않아서 사용할 수 없었다.
2. PHP wrapper
두번째는 data와 filename모두를 건드려 보았다.
실질적으로 데이터가 저장되는 부분은 file_put_contents부분이라 이 부분을 중심으로 시도해보았다.
file_put_content의 메뉴얼을 살펴보면
다음과 같이 path를 적는 부분에 Wrapper를 사용할 수 있음을 알 수 있다.
root-me 문제를 풀면서 사용했던 php wrapper "php://filter/convert.base64-encode/resource=[파일명]"를 사용하면 파일이 실행되기전 base64로 인코딩된 파일을 나타내준다.
이번과 같은 경우 data에 <?와 <script>를 사용하지 못하는데 적절한 php코드를 작성 후 encode된 값을 넘겨주면 stripos 필터에 걸리지 않고 data를 넘겨 줄 수 있다.
그리고 우리가 원하는 것은 출력될 때 정상적인 php코드로 동작하는 것이므로 file_put_contents로 파일을 작성할 때에 php wrapper를 사용하여 넘겨준 data를 decode하여 작성하게 된다면, 우리가 /uploads 디렉토리로 접근하여 파일을 읽었을 때에 정상적으로 php코드가 실행 될 것이라 예상할 수 있다.
<? php
echo var_dump(scandir'/');
?>
#directory에 있는 file 찾기
다음과 같이 php코드로 flag파일을 찾은 후 파일을 읽으면 답을 얻을 수 있다.
XSS를 이용한 풀이방법을 한번 다시 연구해봐야겠다..
'Web hacking > Websec' 카테고리의 다른 글
Websec - level9 (1) | 2020.03.24 |
---|---|
websec - level 19 (0) | 2020.03.05 |
Websec - level 22 (0) | 2020.02.22 |
Websec - level 14 (0) | 2020.02.19 |
Websec - level 17 (0) | 2020.01.05 |