목록2019/03 (9)
White Security
Sunshine CTF web 2번 XXE Injection 문제입니다. 주소에 접속하면 특이한 서비스 페이지가 주어지는데 성, 이름, 무기를 선택할 수 있습니다. 제출하면 재미있게도 중간 이름을 만들어 줍니다. 요청은 GET 메소드를 통해 이루어집니다. input 인자 값이 익숙한 형태로 되어 있네요. lee posix 디코딩 하면 위와 같은 xml 형식의 데이터를 확인할 수 있습니다. &xxe; posix Entity를 삽입해보니 /etc/passwd 파일을 정상적으로 참조합니다. &xxe; posix php://filter 를 사용하여 현 폴더의 generate.php 파일을 base64 변환하여 읽도록 하였습니다. 상단에서 요청 주소가 $whitelist에 속한 경우 flag를 출력하도록 되어 있..
Sunshine CTF Web 1번 SQL Injection 문제입니다. 링크에 접속하면 로그인 페이지가 주어집니다. 적당히 입력하여 제출하면 잘못된 입력이라는 오류가 출력됩니다. 싱글 쿼트를 삽입하면 메시지가 출력되는데 이를 통해 Sqlite3를 사용하고 있다는 것을 알 수 있습니다. Order by 절을 사용하여 컬럼의 개수를 알아낼 수 있습니다. 시큐어 코딩이 전혀 되어있지 않으므로 Union 절도 문제없이 사용이 가능합니다. Sqlite3에서 테이블을 확인하는 쿼리를 통해 모든 테이블과 쿼리문을 확인할 수 있었습니다. users 테이블에 flag 라는 컬럼이 존재하는 것이 눈에 띕니다. Group_concat 문을 통해 모든 flag 컬럼 데이터를 확인하는 것으로 문제 해결이 가능했습니다.
Sunshine CTF Scripting 1번 문제에 주어진 주소로 접속해보면 0부터 999 사이의 숫자를 하나 낼테니 그대로 다시 보내라고 합니다. 값을 입력하고 난 이후에 답이 주어진다는 것인데요. 정확히 똑같은 순서와 값이 반복되기 때문에 일단 입력하고, 주어지는 값을 저장했다가 다시 시도하면 됩니다. import socket from time import sleep import sys A = [] while True: s = socket.socket() s.connect(('tw.sunshinectf.org', 4101)) s.recv(1024) s.recv(1024) if len(A) != 0: s.send(('\n'.join(A)+'\n').encode()) sleep(1) res = s.re..
b00t2root 2019 web 4번 XSS 문제입니다. 링크에 접속하면 우측 상단에 버튼이 하나 보입니다. 관리자에게 메시지를 보내는 서비스 페이지입니다. 입력이 주어지면 상단에 alert 명령어가 보여지는데 관리자가 메시지를 금방 확인할 것이라고 합니다. script img 등 태그명, 온점 등이 필터링 되고 입력시 한탄하는 메시지가 나오므로 주의합시다. 온점이 들어가는 document.cookie 등은 document['cookie']로 바꾸고 ip 주소는 정수형태로 변경하여 필터링을 우회하였습니다. 수신되는 패킷의 쿠키를 확인해보면 접속해 볼 것도 없이 플래그가 주어집니다. 참조문서 https://blog.minivet.kr/?p=315
b00t2root 2019 web 3번 RCE 문제입니다. 접속하면 위와 같은 메시지를 보실 수 있는데 로컬에서 보낸 패킷이라고 여기게 하면 됩니다. X-Forwarded-For 헤더를 변조하여 해결하였는데요. 이는 프록시를 통해 통신할 경우에 사용되는 헤더로 실제 통신하는 프록시 서버에서는 연결자의 IP를 위 헤더에 첨가해 호스트로부터 응답자를 식별할 수 있도록 하는 역할을 합니다. 따라서 127.0.0.1로 설정해주고 다시 패킷을 전송해 봅니다. 페이지와 그 소스가 출력되는데 상단에 ping을 보내어 응답을 확인할 수 있도록 하는 폼이 보입니다. 서버가 존재하지 않는 IP를 입력해 테스트해 보면 Not Alive 문자열이 나타나는 것을 볼 수 있습니다. 정확하게는 shell_exec를 통해 실행된 명..
b00t2root 2019 web 2번 SQL 인젝션 문제입니다. 링크에 접속하면 소스가 출력되는 것을 확인할 수 있습니다. 다른 페이지에서도 모두 마찬가지입니다. 가입 페이지에 접근하면 위와 같은 소스를 볼 수 있는데 유저를 생성하기 위해 유저네임이 사용중인지 검증하는 쿼리에서 문자열 escape 처리가 되어 있지 않은데요. 여기서 blind sql injection을 사용해 문제를 해결할 수 있습니다. from urllib import request, parse import sys, math def send(query): data = parse.urlencode({ 'username' : "') and if((%s),1,0) #" % query }).encode() req = request.Reque..
b00t2root 2019 web 1번 PHP Type juggling, unserialize 취약점 문제입니다. 페이지에 접속하면 highlight_file 함수에 의해 소스가 출력되는데. 그 아래를 보면 $_GET['1']과 md5($_GET['1']) 을 비교하고 있습니다. md5에는 해싱 이후에도 동일한 0e[0-9]+ 형식이 반환되는 매직 해시가 존재하는데 http://3.16.68.122/Easy-php/?1=0e215962017 둘 모두 지수표현으로서 매우 작은 값이므로 이 매직 해시와 php의 느슨한 비교 취약점을 사용하면 비교문을 통과할 수 있습니다. 다음은 $_GET['2']와 $_GET['3'] 을 인자로 사용하는데 엄격한 비교 연산자 !== 를 사용해 둘이 모두 같지 않아야 하고 숨..
Vim 을 처음 설치하고 나면한글을 비롯하여 기타 언어들이 제대로 표시되지 않습니다. 이는 기본 인코딩이 latin1으로 설정되어 있기 때문인데요.설정 변경으로 간단히 해결할 수 있습니다. Vim에 들어가 :set encoding=utf-8을 입력하면 글자가 제대로 표시되는것을 확인할 수 있습니다. 이를 영구적으로 설정해주려면홈 폴더의 .vimrc 파일을 수정하여 주면 되는데요. 모든 유저에게 적용하려면/etc/vim/vimrc 파일을 수정하면 되겠습니다. encoding 옵션은 표시 옵션이며fileencoding은 파일 입출력시의 옵션이기에 encoding 만 설정해두고 fileencodings 설정을해 주지 않으면, Vim에서는 제대로 나오나타 프로그램에서 제대로 표시되지 않을 수 있습니다.