우선, 문제에 접속해보니 아래와 같은 페이지를 볼 수 있었다. 문제로 함께 주어진 코드 파일을 확인해보니 아래와 같은 파일을 볼 수 있었다. 해당 코드는 GET argument로 'url'을 받아 'http'가 들어있는지 확인하고 escapeshellcmd() 함수에 넣는다 이후, curl 명령어를 실행하고 result는 /cache 폴더 아래에 파일로 저장한다. escapeshellcmd() 함수 - 메타 문자를 통한 커맨드 인젝션을 방지하기 위해 php에서 사용하는 함수 - 쉘 명령을 속이는 데 사용될 수 있는 문자열의 모든 문자를 이스케이프한다 - 다음 문자 앞에 백슬래시를 붙인다 : & # ; ` | * ? ~ ^ ( ) [ ] { } $ \ , \x0A \xFF ' " (따옴표는 쌍이 아..
분류 전체보기
우선, 문제는 아래와 같은 페이지로 되어 있었다. 페이지의 소스코드를 확인해보자. 소스코드는 아래와 같다. 소스코드에서 핵심적인 부분을 살펴보면 POST방식으로 id 값을 받으며, id의 길이는 5라는 것을 알 수 있다. 또한, system() 부분이 실질적인 소스 실행부이기에 이 부분에 맞게 id를 전송해주어야 한다. 따라서 system() 함수 안의 파라미터 부분을 공략하는 것이 이 문제의 핵심이다. system("echo 'hello! {$id}'");에서 ls를 실행하기 위해 텍스트박스에 ';'ls를 입력하여 전송할 수 있다. ';'ls 를 입력하면 flag로 시작하는 .php를 볼 수 있었고, 이를 주소창에 입력해보자. 입력해보니 플래그 값을 얻을 수 있었다! 문제 해결!
문제 페이지는 아래와 같이 볼 수 있다. ping 부분의 페이지 또한, 이전 문제와 유사한 모습임을 확인할 수 있다. 문제에서 제공해준 소스 파일을 통해 어떤 명령어를 입력해야 플래그 값을 얻을 수 있을지 확인해보자. ping 부분에 대한 소스 코드를 살펴보니, 명령어를 'ping -c 3 "{host}"'의 형태로 보내고 있음을 확인할 수 있다. 따라서, 이 부분을 활용하여 flag.py 파일을 확인하기 위해 위와 같이 작성해보았으나, 요청한 형식과 일치시키라는 문구가 나왔다. 소스 코드를 확인해보니 필터링 해주는 패턴이 있음을 확인할 수 있었고 필터링해주고 있는 부분을 지우고 다시 시도해보았다. command injection 메타 문자를 사용해서 flag.py의 내용을 확인할 수 있도록 작성하니 위..
우선 문제의 메인 페이지는 아래와 같은 화면으로 구성되어 있다. 현재 Home과 Ping 외의 별다른 카테고리는 없었고, Ping 카테고리에 접속하니 아래와 같은 페이지를 볼 수 있었다. 우선 호스트 Ping 주소를 입력하는 부분에 예시로 적혀있는 8.8.8.8을 넣고 Ping 버튼을 눌러 보았더니 ping 명령어가 작동되어 출력하는 것을 볼 수 있었다. 해당 부분에서는 플래그 값을 찾기 위한 추가 힌트를 발견할 수 없었고, 문제에서도 플래그는 flag.py에 있다고 하였으니 해당 파일을 확인해보자. flag.py에서 중요한 부분은 아래 'ping'에 대해 정의하고 있는 부분인 것 같다. 코드는 다음과 같이 해석해볼 수 있다. 위 코드는 /ping 페이지에 GET Method로 접속 시에는 핑을 보낼 수..
보호되어 있는 글입니다.
우선 문제 페이지에 접속하면 아래와 같은 모습을 볼 수 있었다. 각 카테고리 별로 우선 vuln(csrf) page가 아래와 같이 구성되어 있고, flag 페이지는 아래와 같이 파라미터 값을 입력하도록 되어 있다. 마지막으로 로그인 페이지는 아래와 같이 구성되어 있음을 확인할 수 있었다. 소스코드를 확인해보니 아래 이미지와 같이 guest와 admin 계정이 각각 제시되어 있었고, 비밀번호까지 나와있는 게스트 계정에 먼저 로그인해보았다. 게스트 계정으로 로그인을 하니 아래와 같이 'Hello guest, you are not an admin'이 출력되고 있었다. 계속 소스코드를 확인해보자. 우선 아래 코드에서 xss 공격을 막기 위해 필터링을 하고 있기 때문에 script 태그는 사용하지 못하므로 img..