목록분류 전체보기 (103)
White Security
Sunshine CTF web 3번 Flask SSTI Injection 문제입니다. 주소에 접속하면 두개의 페이지 링크가 존재합니다. 상단의 Custom greeting을 먼저 살펴보겠습니다. /hello/name 주소로 바로 연결되고 파이썬 웹 프레임워크 Flask를 사용하고 있다고 알려주네요. 뒤의 name 부분은 자유롭게 변경이 가능합니다. 바로 SSTI가 가능한지 확인해 보기 위해서 49를 기대하고 {{7*7}}를 삽입해 보았습니다. 그러나 escape되는 듯 적용되지 않습니다. 두번째 페이지를 살펴 보겠습니다. 단일 입력 폼이 보이는데 제출해도 간단한 텍스트가 출력되는 것이 전부입니다. 그런데 소스를 보면 주석화된 옵션이 존재합니다. 템플릿을 확인해 보니 config.DEBUG 가 설정되어 있..
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'] 을 인자로 사용하는데 엄격한 비교 연산자 !== 를 사용해 둘이 모두 같지 않아야 하고 숨..