본문 바로가기

분류 전체보기

(41)
[백준 10870] 피보나치 수 5 https://www.acmicpc.net/problem/10870 10870번: 피보나치 수 5 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 www.acmicpc.net 문제 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다. n=17일때 까지 피보나치 수를 써보면 다음과 같다. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 8..
[백준 2460] 지능형 기차 2 https://www.acmicpc.net/problem/2460 2460번: 지능형 기차 2 최근에 개발된 지능형 기차가 1번역(출발역)부터 10번역(종착역)까지 10개의 정차역이 있는 노선에서 운행되고 있다. 이 기차에는 타거나 내리는 사람 수를 자동으로 인식할 수 있는 장치가 있다. www.acmicpc.net 문제 최근에 개발된 지능형 기차가 1번역(출발역)부터 10번역(종착역)까지 10개의 정차역이 있는 노선에서 운행되고 있다. 이 기차에는 타거나 내리는 사람 수를 자동으로 인식할 수 있는 장치가 있다. 이 장치를 이용하여 출발역에서 종착역까지 가는 도중 기차 안에 사람이 가장 많을 때의 사람 수를 계산하려고 한다. 단, 이 기차를 이용하는 사람들은 질서 의식이 투철하여, 역에서 기차에 탈 때,..
[백준 10818] 최소, 최대 https://www.acmicpc.net/problem/10818 10818번: 최소, 최대 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다. www.acmicpc.net 문제 N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다. 출력 첫째 줄에 주어진 정수 N개의 최솟값과 최..
[DVWA 실습] CSRF(high) 문제 해결 방법 High 단계에서는 이전 Medium 단계에서 사용한 레퍼러 헤더를 검사하는 방식 대신 CSRF 토큰을 구현하여 올바른 사용자가 작업을 수행하고 있는지 검사하고 있다. 역시 hidden 필드로 구현되어 있으며 서버측에서 매 요청마다 고유하게 생성한 문자열 값이다. 이전 Low, Medium 단계에서 했던 것처럼 사용자에게 링크나 버튼으로 클릭만 유도해서는 토큰 값을 얻을 수 없기 때문에 공격이 불가능하다. 그렇다면 지난번 Brute Force 실습 때처럼 서버 측 언어를 이용해서 패당 토큰 값을 파싱, 악성 URL에 GET 파라미터로 삽입해서 공격할 수 있지 않을까? 하지만 이번에 필요한 것은 우리의 토큰 값이 아니라 사용자의 토큰 값이다. 사용자가 웹사이트를 요청했을 때 서버 측에서 생..
[DVWA 실습] CSRF(medium) 문제 해결 방법 Medium 단계에서는 레퍼러 헤더를 검사하는 로직이 추가되었다. 그러나 eregi() 함수를 이용한 단순한 문자열 비교기 때문에 레퍼러 헤더에 서버 이름 문자열이 포함되기만 해도 통과할 수 있다. 레퍼러는 해당 사이트에 접속하기전 방문했던 사이트로 예를 들어 DVWA의 CSRF 실습 메뉴에 접근하면 요청 헤더에는 다음과 같은 레퍼러 헤더가 존재한다(직접 URL로 접근한 게 아닌 경우). Medium 단계 실습에서 eregi() 함수로 검사하고 있는 문자열은 $_SERVER['SERVER_NAME'] 변수로 이는 서버가 동작하고 있는 호스트인 "192.168.56.103"을 의미한다. 지금은 DVWA가 가상 머신에 설치되었기 때문에 사설 IP 주소를 갖고 있는데 만약 DVWA가 설치된 환..
[DVWA 실습] CSRF(low) 문제 해결 방법 Low 단계에서는 GET 메서드의 파라미터로 새로운 비밀번호와 새로운 비밀번호 확인 문자열을 받아서 요청을 처리하기 때문에 다음처럼 악성 URL을 클릭하면 비밀번호가 URL에 기재된 대로 변경된다. 이를 테스트해보기 위해서 빈 페이지(about:blank)에 자바스크립트를 활용하여 링크 태그를 하나 추가한 후 href 속성을 비밀번호 변경 페이지로 설정하여 위처럼 악성 URL을 생성하였다. 위 링크를 클릭하면 비밀번호를 00000000으로 변경하는 요청이 전송되며 사용자 인증 수단이 없기 때문에 사용자가 이 악성 링크를 클릭해서 원치 않게 비밀번호를 00000000으로 변경하는 것인지 실제로 비밀번호를 00000000으로 변경하려는 것인지 서버 측에서는 구분할 수 없다. 그러므로 CSRF..
DVWA - CSRF DVWA의 세 번째 실습 대상인 CSRF다. 이 입력 폼은 비밀번호를 변경하는 시스템이며 이를 로그인한 사용자가 모르게 사용하여 비밀번호를 원하는 비밀번호로 변경하는 공격을 실습해볼 수 있다. CSRF? CSRF, Cross-Site Request Forgery는 사이트 간 요청 위조 공격으로 사용자가 자신의 의지와는 무관하게 공격자가 원하는 행위를 수행하게 된다는 것이 핵심이다. 이는 서버 애플리케이션이 어떤 요청을 보내는 사용자가 본인이 맞는지 확인하지 않고 사용자의 브라우저에 저장된 세션이나 쿠키를 신뢰하는 것을 악용한 공격으로 예를 들어 사용자가 특정 웹사이트에 로그인한 상태에서 정상적인 링크로 위장된 비밀번호 초기화 링크를 클릭하게 되면 서버에서는 정상적인 사용자(웹사이트에 로그인되어 세션이 유..
[DVWA 실습] Command(high) 문제 해결 방법 High 단계에서는 Medium 단계와 동일하게 관련 문자를 필터링하여 커맨드 인젝션을 방지하고 있으나 '|'를 '| '로 착각하여 치환하는 바람에 보안 취약점이 발생하게 되었다. 지난 포스트에 언급했듯이 '|'는 파이프라인 문자로 왼쪽 명령어의 출력을 오른쪽 명령어에 입력으로 넘겨주는 역할을 한다. '|'를 사이에 두고 두 명령어는 'cat /etc/passwd | grep root'처럼 주로 공백을 두지만 'cat /etc/passwd|grep root'처럼 공백 없이 사용할 수도 있기 때문에 '| '가 아닌 '|' 자체를 필터링해야 이를 방어할 수 있다. 물론 제일 좋은 방법은 이런 시스템 커맨드를 사용하지 않고 관련 라이브러리를 사용하는 것이다. 예를 들어 ping 명령을 대신하는..
[DVWA 실습] Command Injection(medium) 문제 해결 방법 Medium 단계에서는 '&&'과 ';'만 필터링하고 있다. 하지만 '&', '||', '|' 등 이 필터링을 우회할 수 있는 문자는 많기 때문에 다른 문자를 입력해서 어렵지 않게 우회할 수 있다. '' 문자를 사용해서 우회했다. 결정적으로 str_replace() 함수를 이용하여 '&&'를 ''로 치환하는 과정을 단 한번만 반복하고 있기 때문에 이는 '&&&'을 '&'으로 치환하는 불완전한 연산을 수행하게 된다. 이 '&' 문자는 해당 명령어를 백그라운드로 실행하라는 명령이기 때문에 추가적인 명령어를 실행할 수 있다. 이를 방지하려면 지난번 워게임 풀이에서 언급했듯이 str_contains() 함수를 이용하여 아직 치환 대상 문자열에 아직 치환할 문자열이 남아있는지 검사하면서 반복문을 ..
[DVWA 실습] Command Injection(low) Low 단계에서는 입력에 대한 아무런 필터링도 없기 때문에 단순히 세미콜론 하나로 구분자를 설정해주면 몇번이고 원하는 명령어를 실행시킬 수 있다. 위는 입력폼에 "; id; ls; cat /etc/passwd"를 입력한 결과다. 이는 서버에서 "ping ; id; ls; cat /etc/passwd"처럼 동작하기 때문에 맨 처음의 ping 명령어는 대상 주소가 없어 오류가 발생하고 아무런 메시지도 출력하지 않는다. 이후 id 명령어로 현재 계정의 uid를 확인하고 ls 명령어로 현재 디렉토리에 있는 파일들을 확인하고 cat /etc/passwd 명령으로 /etc/passwd 파일의 내용을 읽은 결과가 한꺼번에 출력되는 것을 볼 수 있다. 현재 웹 애플리케이션은 www-data 계정으로 실행되고 있다. 이..