https://07001lab.tistory.com/entry/webhackingkr-Challenge-%F0%9F%8D%8A
발단
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
if($_GET['view_source']){ highlight_file(__FILE__); exit; }
if($_GET['view_version']){ echo phpversion(); exit; } // 7.3.8-1+ubuntu18.04.1+deb.sury.org+1
if($_GET['ls']){ system("ls -a"); exit; } // to prove for about there is not hidden files in this directory. you dont have to run dirbuster!
if(isset($_GET['url'])){
$url = $_GET['url'].".txt";
if(!filter_var($url, FILTER_VALIDATE_URL)) exit("invalid url");
if(!preg_match("/http:\/\/webhacking.kr:10009\//",$url)) exit("invalid server");
if(preg_match("/@|#|\(|\)|\\$|`|'|\"|_|{|}|\?/",$url)) exit("you are not orange");
if((parse_url($url)['host'] !== "webhacking.kr") || (parse_url($url)['port'] !== 10009)) exit("invalid host or port");
if(parse_url($url)['user'] || parse_url($url)['pass']) exit("you are not orange");
include $url;
}
echo "<hr><a href=./?url=http://webhacking.kr:10009/cat>cat</a> <a href=./?url=http://webhacking.kr:10009/dog>dog</a> <hr><a href=./?view_source=1>view-source</a> <a href=./?view_version=1>view-version</a> <a href=./?ls=1>ls</a>";
?>
|
cs |
귀찮으니 반말
일단 코드를 보자
url을 get으로 받아서 잴 뒤에 .txt 를 단다음
정상적인 URL인지 체크
http://webhacking.kr:10009/ 문자열이 존재하는지 체크
@ # ( ) \$ ` ' " _ { } ? 가 존재하는지 체크
host가 webhacking.kr 이고 port가 10009 인지 체크
user pass가 없는지 체크
한 뒤 url을 가져온다.
cat 버튼을 누르면
이렇게 된다.
dog 버튼을 눌러도
이렇게 된다.
////////////////////////////////////////////////////////////////////////////////////////////////
|
if(!filter_var($url, FILTER_VALIDATE_URL)) exit("invalid url");
|
cs |
7번줄
schema://user:pass@host:port/path?=query=foobar#fragment
이렇게 url스럽게 생겼는지 체크한다.
|
if((parse_url($url)['host'] !== "webhacking.kr") || (parse_url($url)['port'] !== 10009)) exit("invalid host or port");
|
cs |
10번줄
host가 webhacking.kr이고 port가 10009인지 체크한다.
우회하는 방법이야 있지만
|
if(preg_match("/@|#|\(|\)|\\$|`|'|\"|_|{|}|\?/",$url)) exit("you are not orange");
|
cs |
이 나쁜 9번줄이 방해하고 있으니 우회할 방법을 모르겠다.
////////////////////////////////////////////////////////////////////////////////////////////////
근데 궂이 http schema를 써야되나?
1트
data schema를 사용한다.
10번라인때문에 host랑 port를 넣어야 한다.
근데 놀랍게도 작동한다.
ㅖ.
근데 base64 인코딩해서 이상한거 막 집어넣을수 있다.
혹시?
|
$url = $_GET['url'].".txt";
|
cs |
6번줄 : ㅋㅋ
뒤에 .txt가 달려서 base64 디코딩을 못한다.
최박사 시즌 172288596호 멸망
////////////////////////////////////////////////////////////////////////////////////////////////
다른 schema 없나?
2트
file://
이라는 친구가 있다.
https://stackoverflow.com/questions/12711584/how-to-specify-a-local-file-within-html-using-the-file-scheme
읽어보자.
안된다.
최박사 시즌 2060630504호 멸망
////////////////////////////////////////////////////////////////////////////////////////////////
얘는 되겠지
3트
nfs://
라는 친구도 있다.
https://datatracker.ietf.org/doc/html/rfc2224
귀찮으니 rfc 로 설명 대신하겠다.
?!
ctf 역사와 전통에 따라서 flag는 /flag 에 들어있을거다.
|
$url = $_GET['url'].".txt";
|
cs |
6번줄 : ㅋㅋ
/flag 에 들어있댔지 /flag.txt 에 들어있다 하진 않았다 ㅋㅋ
자 그럼 저 라인은 어떻게 우회해야 하나.
몰?루
최박사 시즌 349946786호 멸망
////////////////////////////////////////////////////////////////////////////////////////////////
님들은 이런거 하지 마세요
https://07001lab.tistory.com/entry/%EB%98%91%EA%B0%99%EC%9D%80%EA%B1%B0-2%EB%85%84%EC%A7%B8-%EC%B3%90%EB%8B%A4%EB%B3%B4%EB%82%98