Local File Inclusion - Wrappers

 

 

 

 

 

flag를 찾으면 되는 문제이다.

 

 

 

 

 

문제 화면으로 들어가면 파일을 선택하여 업로드할 수 있는 기능이 있다.

 

 

 

 


문제풀이

 

 

 

 

업로드 기능을 이용하여 .php 파일을 업로드해보면

 

 

 

 

다음과 같이 JPG파일만 업로드 할 수 있다는 결과와 page파라미터를 볼 수 있다.

 

페이지에 index우리가 처음 보았던 페이지로 이동한다.

../는 필터링 되어있으며 .와 /는 개별적으로 필터링 되어있지않다.

 

.만 입력하였을 때

 

 

 

우리가 입력한 값 뒤에 .php가 붙어서 파일을 여는 것을 알 수있다.

 

 

 

문제의 제목을 보면 Wrappers를 이용하여 문제를 해결해야함을 알 수 있다.

이전에 풀었던 LFI문제와 같이 php://를 사용하여 풀려고 하면 php는 필터링이 걸려 사용할 수 없고

system command를 실행 할 수 있는 expect://

 

 

 

 

다음과 같이 지원하지 않음을 알 수 있다.

 

 

File upload를 할 수 있는점을 이용할 수 있는 zip:// 을 이용하여 문제를 풀 수 있다고 생각했다.

zip:// 필터는 업로드된 .zip 파일을 서버측에서 저장된 파일을 압축 해제하여 압축을 푼 파일안에 있는 파일을 실행 시켜준다.

 

하지만 zip파일을 바로 업로드 할 수 는 없기 때문에 압축한 파일의 확장자를 .jpg로 바꾸어준다.

 

 

 

 

파일을 업로드하고 확인해보면 tmp/upload 위치에 파일명이 바뀐 채로 저장되어 있음을 알 수 있다.

zip://zip파일이름#풀렸을 때 파일 이름  -> #은 url encoding 하여 %23

 

 

Input : page = zip://tmp/upload/(이미지파일)%23(읽을 파일)

파일명이 한 글자를 넘어가면 page name too long이 나온다.

 

 

 

 

본인은 다음과 같이 scandir을 이용하여 해당 디렉토리에 있는 파일들을 알기 위해서 사용하였다.

이 .php파일을 실행시킨 결과는

 

 

 

 

다음과 같이 flag가 들어있는 php파일을 얻을 수 있으며 해당 파일을 읽을 수 있게 php파일을 수정해주면 flag를 얻을 수 있다.


<?php eval($_GET['cmd']); ?>

'Web hacking > Root me' 카테고리의 다른 글

[Root-me] - PHP - Eval  (0) 2019.12.03
[Root-me] - File upload - ZIP  (0) 2019.12.03
[Root-me] PHP - Serialization  (0) 2019.11.16
[Root-me] SQL injection - Error  (0) 2019.10.07
[Root-me] SQL Injection - Routed  (0) 2019.10.01

JSON 3

 

 

문제


 

 

 

 

 

문제해석

 


 

 

 

</를 입력하면 <\/로 치환되며 이전의 JSON 문제들과 같이 ", \ 와 같은 문자들 앞에 백슬래쉬가 붙는다.

 

 

 

 

 

 

 

console.log("입력한 문자열")이 들어가게 되며

#을 기준으로 같은 스크립트가 하나 추가되게 된다.

 

 

 

풀이


 

 

HTML파서는 문자들을 읽으면서 어떠한 상태에 있는지 파악한다.

 

 

일반적으로 읽는 문자들은 Data state상태로 인식하게 되며

<script>와 같은 문자를 읽게 되었을 때 script data state로 파서의 상태가 바뀌게 되어 자바스크립트를 읽을 수 있게 된다.

https://www.w3.org/TR/html50/syntax.html

 

 

위의 페이지에서 <script>태그에서 하나하나씩 따라가다보면 script data double escaped state란 것을 볼 수 있다.

 

 

 

Data state에서의 상태 변화

 

 

data state + <script>    ->   Script data state

Script data state + <!--    ->    Script data escaped state

Script data escaped state + <script>  ->   Script data double escaped state

 

 

Script data double escaped state 상태 일때

- </script>   ->   script data escaped state

- -->   ->   script data state

 

 

Script data escaped state 상태 일때

- </script>   ->   data state

- -->   ->   script data state

 

 

 

 

Script data state, Script data escaped state, Script data double escaped state 는 모두 자바스크립트로 문자를 해석하게 된다.

 

 


 

이를 이용해서 문제를 해결하게 되면

 

 

 

 

 

Input에 <!--<script>를 입력하여 script data double escaped 상태에로 바꾼 후 원래 있던 </script>를 만나

Script escaped state 상태로 변하게 된다.

다시말해서 </script>로 닫혔음에도 불구하고 아직 뒤에 오는 문자열이 자바스크립트로 해석되는 것을 의미한다.

 

 

 

 

 

 

#을 입력하여 뒤에 <script>가 추가되어 다시 Script data double escaped state 상태가 되며 원하는 값을 입력 할 수 있게된다. 

 

 

 

#뒤에 input으로 

<script>console.log("<!--<script>")</script><script>console.log("    입력될 문자열 에서

 

빨간색 부분은 console.log로 출력

<는 비교연산자의 역할

보라색부분은 정규표현식으로 입력할 문자열에서 마무리 지어 주면서 alert를 추가하면된다.

 

 

Input : <!--<script>#)/+alert(1)//-->

 


그냥생각

 

HTML파서로서 읽는 것

js파서로서 읽는 것을 이해하는게 아직은 힘든 것 같다.

-->앞에 왜 //를 붙여야하지..

'Web hacking > alert(1) to win' 카테고리의 다른 글

alert(1) to win - Skandia  (0) 2019.11.11
alert(1) to win - callback2  (0) 2019.11.10
alert(1) to win - JSON2  (0) 2019.11.10
alert(1) to win - markdown  (0) 2019.11.10
alert(1) to win - 1  (0) 2019.11.10

JSON 2

 

 

문제


 

 

 

 

문제해석


 

 

 

</script 를 입력하면 공백으로 바뀐다.

 

 

 

풀이


 

</script를 입력해야지만 공백으로 바뀌고 </s1cript와 같이 다른문자가 섞여있을 때는 그대로 출력된다.

그래서 </script만 공백으로 바뀌는 것을 이용하여 payload를 작성하면된다.

 

Input : </</scriptscript<script>alert(1)//

 

 

'Web hacking > alert(1) to win' 카테고리의 다른 글

alert(1) to win - JSON3  (0) 2019.11.26
alert(1) to win - Skandia  (0) 2019.11.11
alert(1) to win - callback2  (0) 2019.11.10
alert(1) to win - markdown  (0) 2019.11.10
alert(1) to win - 1  (0) 2019.11.10

Markdown

 

 

문제


 

 

 

문제해석


 

<와 "는 각각 &lt; &quot;로 치환 되며

 

 

 

[[a|b]]

 

 

a부분이 img 태그의 alt 부분, b 부분이 src 부분으로 각각 들어가게 되며

alt - Alternate(대체하다) 이미지가 잘못 불러졌을 때 대체되어 나타나는 것.

 

 

 

http://string

 

 

다음과 같이 치환된다.

 

 

 

 

풀이


 

"가 &quot;로 치환되어 사용하지 못하지만 http:// 와 [[a|b]]가 치환되는 형태 안에서 각각 "를 포함하는 것을 이용하여 "를 우회할 수 있다.

 

input : [[a|http://onerror=alert(1)//]]

 

 

다음과 같이 풀 수 있다.

 

 

<img alt="<a href="http://onerror=alert(1)//" src="a.gif">">http://onerror=alert(1)//]]</a> 에서

 

실제 페이지에서 다음과 같이 해석 된다.

 

 

 

 


//에 대한 공부

<img alt="<a href=" http: 에서 //가 html paser로 해석되는데 어떠한 값으로도 해석되지 않아 공백 문자와 같이 처리되고

onerror 다음의 //는 js 이벤트 핸들러로 해석되어 주석의 기능을 실행하며

"">http~~~ 의 // 는 text 그대로 해석 되어 출력된다.

 

참고 : https://www.w3.org/TR/2011/WD-html5-20110405/tokenization.html#tag-open-state

8.2.4.1 Data state

 

'Web hacking > alert(1) to win' 카테고리의 다른 글

alert(1) to win - JSON3  (0) 2019.11.26
alert(1) to win - Skandia  (0) 2019.11.11
alert(1) to win - callback2  (0) 2019.11.10
alert(1) to win - JSON2  (0) 2019.11.10
alert(1) to win - 1  (0) 2019.11.10

Warmup

 

 

 

 

console.log를 닫아주고 alert(1)이 후 주석 처리를 해주어도 되고, 안에 더블 쿼터들을 문자열 연결을 통해 처리해주면서 alert(1)을 하면 된다.

 

input : +"alert(1)"+

 

 


 

Adobe

 

 

 

 

"를 치면 \가 생긴다. "앞에 \를 넣어 줌으로써 \가 "로 생기는 \를 문자로 표현 해주어 우회가 가능하다

 

input : \");alert(1)//

 

 


 

JSON

 

 

 

 

앞선 문제와 달리 \에도 \가 생겨 앞 문제와 약간 다르다 script를 닫아주고 새로운 script 태그를 만들어 alert를 해준다.

 

input : </script><script>alert(1)//

'Web hacking > alert(1) to win' 카테고리의 다른 글

alert(1) to win - JSON3  (0) 2019.11.26
alert(1) to win - Skandia  (0) 2019.11.11
alert(1) to win - callback2  (0) 2019.11.10
alert(1) to win - JSON2  (0) 2019.11.10
alert(1) to win - markdown  (0) 2019.11.10

+ Recent posts