본문 바로가기

Security

(29)
[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 계정으로 실행되고 있다. 이..
DVWA - Command Injection DVWA의 두 번째 실습 대상인 Command Injection이다. 주어진 IP 주소로 ping 명령을 수행하는 시스템이며 이를 이용하여 커맨드 인젝션을 실습해볼 수 있다. 커맨드 인젝션? 커맨드 인젝션이란 사용자가 취약한 웹사이트의 입력 폼이나 기타 방법을 이용하여 서버에 직접적, 간접적으로 명령어(Bash, CMD 등)를 전송하여 실행시키는 공격 방법이다. RCE(Remote Command Execution)이라고도 하며 입력 폼뿐만이 아니라 사용자의 쿠키값, 레퍼러, HTTP 헤더 등을 서버 측에서 읽어 적절한 검증 없이 시스템 호출에 포함한다면 공격 벡터가 될 수 있다. 이 공격이 가능하려면 웹 애플리케이션에서 사용자 입력을 기반으로 system(), exec(), os.system() 같은 시..
[DVWA 실습] Brute Force(high) 문제 해결 방법 High 레벨부터는 이전 포스트에서 분석했듯이 CSRF 토큰이 포함된다. 이는 서버가 받는 요청이 진짜 사용자가 HTML 폼에서 입력하여 보낸건지 확인하는 방법으로 현재 레벨에서는 숨겨진 폼에 포함되어 같이 전송되고 있다. 이 토큰값은 서버에서 클라이언트에게 보여줄 페이지를 동적으로 생성할 때 같이 생성되어 포함되며 사용자가 굳이 수정할 이유도, 그래서도 안되는 값이기 때문에 hidden 타입으로 지정되어 있다. 지금은 text 타입으로 수정했기 때문에 보이지만 아무튼 이런 식으로 숨겨진 input 태그에 포함하여 submit 시에 같이 웹 서버로 전송된다. 그래서 실제로 로그인을 시도할 때도 user_token이라는 파라미터로 같이 포함된 것을 확인할 수 있다. 만약 이 user_tok..
[DVWA 실습] Brute Force(medium) 문제 해결 방법 Medium 단계부터는 SQL Injection이 불가능하고 브루트 포스에 대한 방지책으로 로그인이 실패했을 때 2초동안 대기하게 된다. 기존에 1초도 안되서 빠른 응답을 받을 수 있었던 것과 달리 매 시도마다 올바른 비밀번호 입력을 제외하고는 무조건 2초가 걸리지만 반복적으로 들어오는 요청에 대한 대응이 없기 때문에 결국엔 공격에 성공하게 된다. Python requests 모듈 지난번에 작성한 코드를 조금 수정하여 medium 레벨에서 브루트 포스 공격을 수행했다. admin 계정의 비밀번호인 'password'가 리스트 상위에 있었기 때문에 몇 초 걸리지 않았지만 비밀번호가 좀 더 복잡하거나 리스트의 아래쪽에 있었다면 몇 분이 걸릴지 몇 시간이 걸릴지 모르는 만큼 브루트 포스 공격의..
[DVWA 실습] Brute Force(low) 문제 해결 방법 지난 포스트에서 분석한 소스 코드처럼 Low 단계에서는 브루트 포스에 대한 어떤 방어 체계도 갖춰져있지 않으며 SQL Injection에 대한 입력 필터링도 없기 때문에 쉽게 특정 계정에 접속할 수 있다. 현재 admin 계정에 접속하려면 "admin'#"처럼 입력해주면 비밀번호를 입력하지 않고도 로그인할 수 있지만 Brute Force를 실습하는 문제인 만큼 관련 툴을 사용하여 실습해보겠다. OWASP Zap - Fuzzer OWASP ZAP의 확장 프로그램인 Fuzzer를 사용하면 특정 위치에 무작위 값을 대입해서 여러 번 입력을 시도할 수 있다. 로그인에 실패했을 때는 아이디나 비밀번호나 틀리다는 메시지가 웹사이트에 나타나기 때문에 로그인에 성공했을 때의 웹사이트와 비교하면 HTML..
DVWA - Brute Force DVWA의 첫 번째 실습 대상인 Brute Force다. Username과 Password를 입력하여 admin 계정으로 로그인하는 것을 목표로 하고 있다. 브루트 포스? 브루트 포스는 무작위로 비밀번호를 조합하거나 사전 파일에 정의된 비밀번호를 하나하나 대입해보며 공격하는 방식(또는 두 가지를 합한 hybrid 방식)이다. 본래 어떤 시스템에서 특정 개체를 인증하려면 인증서라던지, OTP, 생체 인식 등 여러 분야의 인증 수단을 활용할 수 있지만 웹 애플리케이션에서는 대개 아이디와 비밀번호만을 이용하여 사용자를 인증하고 있다. 이 브루트 포스 공격은 비밀번호(혹은 아이디도)를 가능한 모든 문자를 조합하거나 많이 사용되는 문자를 조합하여 반복해서 로그인을 시도하는 공격으로 전통적이지만 시간만 충분하다면 ..
DVWA - 환경 구축 화이트 해커를 위한 웹 해킹의 기술 - YES24을 읽으면서 DVWA 실습을 위해 칼리 리눅스에 XAMPP를 설치하여 DVWA 1.9를 구축하였다. 칼리 리눅스 2020 설치 2020 Kali Linux 우선 칼리 리눅스를 Kali Linux Custom Image Downloads에서 VMWare 이미지로 설치한 후 기본적인 업데이트 및 한글 설정을 수행하였다. # 기본적인 업그레이드 sudo apt update sudo apt upgrade # 한글 입력기 및 폰트 설치 sudo apt install fcitx-lib* sudo apt install fcitx-hangul sudo apt install fonts-nanum DVWA 설치 DVWA는 최신 버전인 1.9 버전을 DVWA - Damn Vu..