본문 바로가기

전체 글

(41)
[DVWA 실습] SQL Injection(high) 문제 해결 방법 이번 단계에서는 로그인한 사용자의 세션에 id 조회 파라미터를 담고 있다. 그래서 한번 조회한 값은 다른 실습 페이지로 이동했다가 돌아와도 그대로 남아있는 것을 볼 수 있다. 하지만 굳이 별도의 창을 띄우는 것은 Burp Suite의 Repeater 같은 툴로 요청을 반복할 수 있기 때문에 SQL Injection을 방어하는 데 별다른 도움이 될 수 없다. 그리고 결정적으로 SQL Injection에 대한 필터링이 없기 때문에 이전과 비슷하게 공격할 수 있는데 이번에 다른 점은 맨 마지막에 LIMIT 구문이 붙어서 결과를 하나만 출력하고 있다는 것이다. SELECT first_name, last_name FROM users WHERE user_id = '' or '1'='1' LIMIT ..
[DVWA 실습] SQL Injection(medium) 문제 해결 방법 이번 단계에서는 사용자에게서 직접 id 값을 입력받지 않고 HTML의 셀렉트박스를 이용해서 지정된 값만 입력할 수 있도록 제한하고 있다. 하지만 이는 별 의미가 없는게 결국 GET이든 POST든 전달되는 데이터를 수정하면 되기 때문에 Burp Suite를 이용해서 이전 단계에서 사용했던 쿼리를 집어넣으면 되지 않을까? 동일하게 입력해봤지만 다음처럼 에러가 발생하는 것을 볼 수 있었다. 에러를 확인해 보니 쿼리의 '\' union select user_id, password from dvwa.users#'에서 문제가 발생했다고 하는데 우리가 수정한 값인 "' union select ..."가 "\' union select ..."로 이스케이프되어 있었다. 그렇다면 여기서 우리는 mysql_..
[DVWA 실습] SQL Injection(low) 문제 해결 방법 이번 단계에서는 어떤 SQL Injection 필터링도 적용되어 있지 않기 때문에 모든 SQL Injection 기법을 사용할 수 있다. 먼저 확인을 위해 따옴표를 입력해보면 다음처럼 에러가 발생하는 것을 볼 수 있다. 이는 소스 코드에서 오류 발생 시 die() 함수를 이용해 쿼리 에러를 출력하고 있기 때문에 나타나는데 이는 불필요한 정보(DB 정보) 노출이기 때문에 쿼리가 실패하더라도 데이터가 존재하지 않을 때와 같은 반응이 나와야 한다(블라인드). 현재 쿼리는 다음과 같다. SELECT first_name, last_name FROM users WHERE user_id = '$id'; 이는 앞서 말했듯이 동적 쿼리로 사용자 입력인 id 변수가 필터링 없이 SQL 쿼리에 포함되고 있는..
DVWA - SQL Injection DVWA의 일곱 번째 실습 대상인 SQL Injection이다. 현재 데이터베이스에는 5명의 사용자 정보(이름, 비밀번호 등)가 저장되어 있으며 SQL Injection으로 이들의 비밀번호를 탈취하는 것이 목적이다. 현재는 해당 사용자의 ID를 입력하면 이름(First Name, Surname)만 출력하고 있으며 난이도에 따라 ID 입력 방식이 조금씩 달라지고 있다. SQL Injection? SQL Injection은 사용자 입력이 서버측에서 실행되는 SQL 쿼리에 삽입되어 의도했던 것과 다른 동작을 수행하게 되는 취약점이다. 이전에 실습했던 커맨드 인젝션처럼 Injection 취약점으로 데이터베이스 종류에 따라 형태는 달라지지만 데이터베이스와 연결된 대부분의 사이트에서 공격 대상이 된다. 공격자는 이..
[DVWA 실습] Insecure CAPTCHA(high) 문제 해결 방법 이번 단계부터는 비밀번호 변경 과정이 하나로 통합되고 CSRF 토큰 같은 user_token 파라미터가 전달된다. 불필요하게 분할된 과정을 하나로 합치고 CAPTCHA 뿐 아니라 CSRF 토큰을 이용하여 추가적으로 인증하고 있는 것이다. 그래서 이전처럼 step 항목 값을 바꾸거나 심지어 삭제해도 비밀번호 변경에는 아무런 영향이 없다. CAPTCHA를 수행하지 않으면 "The CAPTCHA was incorrect. Please try again." 이라는 메시지와 함께 요청이 거부된다. 그렇다면 이를 어떻게 우회할 수 있을까? 소스 코드를 살펴보니 다음처럼 DEV_NOTE라는 개발자가 작성한 듯한 주석 문이 남아있는 것을 볼 수 있었다. Response 값이 'hidd3n_valu3'이..
[DVWA 실습] Insecure CAPTCHA(medium) 문제 해결 방법 이번 단계에서는 비밀번호 변경 과정(step 1, step 2) 사이에 인증 로직을 적용하기 위해 새로운 헤더가 추가되었다. 변경할 비밀번호를 입력하고 CAPTCHA를 통과하는 것까지는 동일하지만 step 2에 대한 요청에는 'passed_captcha' 파라미터가 true 값으로 설정되어있는 것을 확인할 수 있다. 이전 단계처럼 숨겨진 step 요소를 수정하면 다음처럼 CAPTCHA를 통과하지 못했다는 에러 메시지가 출력된다. CAPTCHA를 수행하고 step 2로 넘어왔는지 바로 step 2로 넘어왔는지 어떻게 아는 것일까? 이는 파라미터 이름으로만 봐도 'passed_captcha'가 그 인증 토큰 역할을 수행한다는 것을 추측할 수 있다. 그래서 HTML 코드를 수정하여 passed..
[DVWA 실습] Insecure CAPTCHA(low) 문제 해결 방법 이번 단계에서는 비밀번호 변경 요청 및 확인 두 과정을 거쳐야 한다. 이는 실습 페이지에 step 파라미터로 전달되는 값으로 구분하는데 본래 정상적인 요청이라면 다음처럼 동작한다. 먼저 비밀번호 입력 폼에 변경될 비밀번호를 입력하고 CAPTCHA를 통과한다. 그리고 버튼을 클릭하면 CAPTCHA를 통과했다는 메시지가 출력되고 Change 버튼을 눌러 비밀번호 변경을 확정 짓는다. 이때 개발자 도구에서 전송된 요청 값을 보면 step 파라미터로 1이 들어간 것을 알 수 있다. 하지만 이는 입력 폼에 나타나지 않았는데 그렇다면 예전에 CSRF 토큰을 폼의 hidden 필드로 넣어서 전달했던 것처럼 숨겨진 필드로 존재하는 게 아닐까? 일단 계속 진행해 보기로 했다. 이후 비밀번호 변경 확인 페..
DVWA - Insecure CAPTCHA DVWA의 여섯 번째 실습 대상인 Insecure CAPTCHA다. 현재 문제에서는 CAPTCHA를 이용하여 비밀번호 변경 기능을 다른 프로그램이 공격하지 못하도록 방어하고 있다. 이 잘못 적용된 CAPTCHA 시스템을 악용하여 현재 로그인한 사용자 모르게 비밀번호를 바꾸는 것이 목적이다. CAPTCHA? CAPTCHA란 현재 서비스를 사용하고 있는 주체가 진짜 사람인지 컴퓨터 프로그램인지 구분하기 위해 고안된 프로그램이다. 뒤틀린 형태의 텍스트나 여러 방향으로 잘린 이미지 등 사람이 아니면 알아보기 힘든 콘텐츠로 시험하여 자동화된 봇이 악의적인 작업(spamming 등)을 수행하지 못하도록 하는 게 주목적이며 브루트 포스 방지, 추가 인증 등 다양한 용도로 사용되고 있다. 옛날에는 왜곡된 텍스트를 분석..
[백준 2693] N번째 큰수 https://www.acmicpc.net/problem/2693 2693번: N번째 큰 수 첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 배열 A의 원소 10개가 공백으로 구분되어 주어진다. 이 원소는 1보다 크거나 같고, 1,000 www.acmicpc.net 문제 배열 A가 주어졌을 때, N번째 큰 값을 출력하는 프로그램을 작성하시오. 배열 A의 크기는 항상 10이고, 자연수만 가지고 있다. N은 항상 3이다. 입력 첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 배열 A의 원소 10개가 공백으로 구분되어 주어진다. 이 원소는 1보다 크거나 같고, 1,00..
[백준 2609] 최대공약수와 최소공배수 https://www.acmicpc.net/problem/2609 2609번: 최대공약수와 최소공배수 첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다. www.acmicpc.net 문제 두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다. 출력 첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다. 코드 풀이 유클리드호제법을 이용하여 최대공약수와 최소공배수 구하는 방식을 이해해야함.