2021. 8. 27. 15:03ㆍLayer7/Layer7_Web Hacking
Webhacking.kr - 14
검은 화면에 입력란과 버튼 하나밖에 없다. 개발자 도구를 열어서 (F12) 소스코드를 살펴봤다.
입력란의 이름은 input_pwd로, 특정 문자열을 넣어야 할 것이다. 버튼의 속성으로는 onclick="ck()"가 쓰여있는데, 이는 버튼을 클릭했을 시 웹 페이지에 있는 자바스크립트 소스 코드 내에서의 ck 함수를 실행한다는 것이다.
ck() 함수를 <script> 태그 밑에 찾아보았다.
아래와 같이 생겼다. ul이라는 변수에 페이지의 url을 저장한 뒤 url에서 .kr의 인덱스 번호를 찾는다.
즉 url이 https://webhacking.kr/challenge/js-1/일 때 이때 .kr이 시작되는 인덱스를 찾는다. 0번부터 세는 것이므로 18이다.
이에 30을 곱하여 다시 ul 변수에 저장한다. 이때 입력란에서 ul과 같은 값을 입력했을 때 location.href를 이용하여 리다이렉트 해주고, ul과 다를 경우 Wrong라 표시하며 아무것도 하지 않는다.
18*30인 540을 입력란에 입력하면 location.href로 인해 https://webhacking.kr/challenge/js-1/?input_pwd=540으로 리다이렉트되면서 문제가 풀린다.
위와 같이 손으로 일일이 해보는 것도 방법이지만 더 빠르고 간편하게 하려면 개발자 도구에서 Console 탭을 이용하면 된다.
Console은 웹 페이지에서의 JavaScript를 실행할 수 있는 탭으로, ck() 함수의 내용을 갖다 붙이면 코드가 실행이 되어서 결과가 나오게 된다.
if문을 제외한 나머지 부분을 붙여 넣어 실행하면 다음과 같이 실행된 결과가 리턴되어 화면에 표시된다.
Webhacking.kr - 25
리눅스 디렉토리와 비슷한 화면이 나타났다. 해당 디렉토리에 다음과 같은 파일들이 있다는 의미가 아닐까 싶다.
url을 살펴보니 file 파라미터로 어느 파일을 열 지 지정해 주고 있다. 현재는 hello.php가 실행되고 있는 것이다.
file 파라미터를 flag로 바꿔서 flag.php를 열려고 한다.
그러나 이때 플래그는 코드 안에 있다고 출력된다.
무슨 의미인 지 생각을 해봤는데, 플래그가 코드 안에 있다는 것은 우리의 화면에 표시되는 php 코드에 있다는 것이다.
다만 우리에게 보이는 것은 php 코드가 실행되어서 보여주는 결과일 뿐, 플래그가 담긴 원래 php 코드를 볼 수 없기 때문에 플래그를 얻는 것이 까다롭다.
그러나 위와 같이 파일 인클루젼이 이루어질 때 PHP Wrapper라는 것을 이용하면 PHP 소스 코드를 읽을 수 있게 된다.
Wrapper란, 실제 데이터를 가지고 틀을 잡아 주는 프로그램이다. 우리가 이용할 것은 PHP Filter 중 Base64 필터이다.
이를 사용하면 PHP 파일의 내용이 Base64로 인코딩되어 출력이 된다. 출력이 된다는 것에 주목을 해야 하는데, 이때 Base64로 디코딩하게 되면 원본 PHP 소스 코드를 얻게 되는 것이다.
php://filter/convert.base64-encode/resource=
우리가 이용하는 Wrapper이다.
위와 같이 입력해 주면 flag의 내용이 Base64 인코딩 필터를 거쳐서 페이지에 출력될 것이다.
이제는 더 이상 FLAG is in the code라 뜨지 않고 Base64로 인코딩 된 문자열이 표시된다.
이를 디코딩하면 아래와 같이 PHP 코드가 나오면서 플래그를 얻을 수 있다.
Webhacking.kr - 24
접속하는 IP가 127.0.0.1이어야만 문제가 풀린다.
Cookie에서 REMOTE_ADDR라는 정보를 가져와서 필터링 과정을 거친다. ..을 .으로, 12와 7., 0.은 모두 없애버린다. 이러한 필터링 과정을 거친 후 여전히 REMOTE_ADDR가 127.0.0.1이면 솔브가 된다.
이때 검사하는 루틴을 자세히 봐야 한다. 한 번만 필터링을 하고 재귀적으로 실행을 하지 않는다.
따라서 IP의 일부분이 필터링된다고 해도 한 번 필터링을 거친 뒤 나머지 문자열이 127.0.0.1이기만 하면 된다는 것이다.
이때 다음과 같이 생각해보자:
127.0.0.1을 넣었을 때 필터링 때문에 12 7 0.이 모두 없어진다. 따라서 남는 건 1뿐이다.
이때 남는 문자열이 127.0.0.1을 이루도록 만들면 된다.
112277...00...00...1
즉, 112277...00...00...1일 때
1) 112277..00..00..1 (..이 .으로 모두 치환되어 없어짐)
2) 1277..00..00..1 (12를 ""로 치환하여 없어짐)
3) 127.00..00..1 (7.을 ""로 치환하여 없어짐)
4) 127.0.0.1 (0.이 ""로 치환되어 없어짐)
>> 따라서 원래 문자열이 나온다.
따라서 112277..00..00..1을 이름이 REMOTE_ADDR라는 쿠키의 값으로 넣어주면 문제가 풀린다.
메인 사진 출처: Unsplash
© 남찬우, 2021
'Layer7 > Layer7_Web Hacking' 카테고리의 다른 글
SQL Injection II (0) | 2021.08.29 |
---|---|
SSRF, HTTP Request Smuggling (0) | 2021.08.23 |
SQL Injection (0) | 2021.08.18 |
XSS, CSRF, Command Injection (0) | 2021.08.11 |
Proxy, Cookie (0) | 2021.08.09 |