본문 바로가기

1. Web hacking (웹 해킹)/2) 개념 정리

[2021.3.27]웹고트 설정, SQL injection

Webgoat

WebGoat는 일부러 보안에 취약하도록 만든 자바 기반의 응용 프로그램이라고 한다. 즉, 취약점 테스트를 위해 실제 웹 사이트가 아닌 WebGoat라는 가상의 웹 사이트에 테스트하기 위해 만든 웹 어플리케이션이라고 할 수 있다.

Webwolf

WebWolf는 공격자 시스템을 가장한 별도의 웹 어플리케이션이다.

  • 파일 업로드어떤 파일을 업로드하고, 이 파일에 대한 다운로드 링크를 구할 수 있다.
  • 이메일을 송수신할 수 있는 클라이언트(Mailbox)를 제공한다. 보낸 이메일은 InBox에서 확인할 수 있다.
  • 랜딩 페이지/landing/~ 형태의 모든 요청을 보여준다. 이것으로 쿠키 탈취 등의 XSS 레슨에서 유용하게 사용할 수 있다.

Webgoat 를 설치하기 전 webgoat를 실행하기 위해선 java가 필요하다.

오라클에서 jdk 를 설치하고 환경 변수 설정을 해준다.


Java 환경변수 설정하기

위 링크를 참고하여 환경 변수 설정을 한다

환경 변수 설정을 하는 이유는 java 환경 변수 설정을 하지 않는다면 자바를 실행할 때 항상 자바 jdk파일이 있는 곳으로 가서 명령어를 써야하기 때문에 불편하다. 이를 환경 변수로 번거롭지 않도록 하는 것이다.

환경변수 설정이 완료 되었다면 cmd에서 javac -version 혹은 java -version을 입력하여 환경변수가 잘 되었는지 확인한다

java 환경변수가 잘 설정된 것을 확인했다.

이제 webgoat를 다운받도록 한다.

웹고트는 OWASP 이라는 사이트에서도 다운을 받을 수 있지만, webgoat의 버전이 매우 낮기 때문에 깃허브를 통해 다운을 받도록 한다.

Releases · WebGoat/WebGoat

위 링크에서 webgoat와 webwolf를 다운 받는다.

또 프록시를 이용하기 위해 burp suite 캡처툴과 firefox 웹브라우저를 추가로 깔아준다.

webgoat를 다운받고 원하는 폴더에 옮긴다.

Webgoat 폴더에 해당 파일들을 옮긴 후 cmd로 웹고트를 실행하도록 한다

cd 라는 change directory 명령어를 사용하여 웹고트가 존재하는 디렉토리로 현재 디렉토리를 옮긴다

디렉토리 이동이 확인 됐으면

java -jar webgoat-server-8.0.0.M24.jar [--server.port=8080][--server.address=localhost]

를 치고 웹고트 서버를 구동한다

start webgoat가 뜨면 webgoat를 실행할 수 있다.

이제 웹브라우저 url에

localhost:8080/WebGoat로 들어가면 webgoat를 구동할 수 있다.

 

회원가입하도록 한다

webwolf를 구동할 땐 webgoat를 실행중인 cmd를 끄지 않고 새 cmd를 켜서 사용하도록 한다

아까처럼 현재파일을 웹고트와 웹 울프가 들어있는 디렉토리로 이동후

java -jar webwolf-8.0.0.M24.jar만 쳐도 webwolf 서버를 구동할 수 있다

해당 서버 주소는 localhost:9090/WebWolf이다

 

이제 웹 고트서버를 이용할 수 있다.

webgoat


 

아래 카테고리에서 다양한 종류의 공격을 시도할 수 있다.

 

첫번째 카테고리에 있는 webgoat를 눌러보자.

WebGot는 사용자와 마찬가지로 관심 있는 개발자가 공통 오픈 소스 구성 요소를 사용하는 Java 기반 애플리케이션에서 일반적으로 발견되는 취약성을 테스트할 수 있도록 하는 의도적으로 안전하지 않은 애플리케이션입니다.

우리는 어떤 동물, 염소, 또는 다른 어떤 동물에게 고의적인 해를 끼치는 것을 용납하지 않지만, 보안 취약성에 대해 여러분이 할 수 있는 모든 것을 배우는 것은 여러분의 애플리케이션에 의도하지 않은 작은 코드라도 생길 때 어떤 일이 일어나는지 이해하는 데 필수적이라고 생각합니다.

당신 자신의 희생양보다 더 좋은 방법이 뭐가 있겠어요?

그와 함께 할 일은 얼마든지 하세요. 해킹, 찌르기, 찌르기, 그리고 만약 그것이 당신의 기분을 나아지게 한다면, 당신의 심장이 만족스러울 때까지 그를 놀라게 하세요. 어서 가서 염소를 부숴라. 그가 좋아한다고 약속해요.

관심 가져줘서 고마워!

 

웹고트의 소개이다. 직역해보자면 웹염소의 취약점을 마음껏 괴롭혀도 된다고 나와있다.

https://www.test.com의 사이트처럼 마음껏 테스트 해도 되는 사이트로, 친절하게도 취약성이 포함되어 친절하게 해킹 기술을 늘릴 수 있도록 돕는 사이트라고 한다.

해킹 기술을 마음껏 실제 사용중인 서버에 사용한다면 악의가 없더라도 해킹, 공격으로 간주하고 경찰서에 출석할 위험이 있다 때문에 워게임 사이트와 비슷하게 공격을 자유롭게 해도 되는 서버를 웹고트에서 제공한다는 것 같다.

 webwolf


웹 울프의 설명이다.

간단하게 설명하자면

파일 호스팅

이메일 수신

수신 요청에 대한 랜딩 페이지

의 기능을 제공하며

WebWolf는 공격자 컴퓨터를 시뮬레이션하는 별도의 웹 애플리케이션입니다. 이를 통해 공격받은 웹 사이트에서 발생하는 작업과 "공격자"로서 수행해야 하는 작업을 명확하게 구분할 수 있습니다.

java -jar webwolf-<version>.jar [--server.port=9090] [--server.address=localhost]

기본적으로 WebWolf는 --server.port가 있는 포트 9090에서 시작되며 다른 포트를 지정할 수 있습니다. server.address를 사용하여 다른 주소(기본 localhost)에 바인딩할 수 있습니다.

와 같이 웹울프 실행 명령어까지 소개해주고 있다.

간단히 소개를 알아 봤으면 general 카테고리로 이동한다.

 

general 카테고리를 이동하기 전 burp suite를 설치할 필요가 있다. webgoat의 취약점을 이용할 때 사용할 툴이니 아래 방법을 통해 설치해보도록 하자.

burp suite를 사용할때 8080번 포트로 running 이 안되기 때문에 꼭 참고하도록 한다.

 

myanjini.tistory.com/entry/Burp-Suite%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-WebGoat-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B3%BC%EC%A0%95-%EB%B6%84%EC%84%9D?category=772292?category=772292

 

Burp Suite를 이용한 WebGoat 로그인 과정 분석

1. Burp Suite를 실행합니다. 2. Proxy 포트를 8081로 변경합니다. 3. 프록시 서버 구성합니다. 윈도우 메뉴에서 "프록시 서버 구성"을 검색해서 실행합니다. Windows 10에서는 "프록시 설정" 기능으로 동..

myanjini.tistory.com

위의 방법으로 webgoat burp suite를 설정할 수 있다.

general


 

 

직역

HTTP 작동 방식:

모든 HTTP 트랜잭션은 동일한 일반 형식을 따릅니다. 각 클라이언트 요청 및 서버 응답에는 요청 또는 응답 줄, 헤더 섹션 및 엔티티 본문의 세 부분이 있습니다.

클라이언트는 다음과 같이 트랜잭션을 시작합니다.

클라이언트가 서버에 접속하여 문서 요청을 보냅니다. GET 요청에는 URL 매개 변수가 있을 수 있으며 이러한 매개 변수는 웹 액세스 로그에서 사용할 수 있습니다.

GET /index.class?param=value HTTP/1.0

그런 다음, 클라이언트는 선택적 헤더 정보를 전송하여 서버에서 허용할 구성 및 문서 형식을 알려줍니다.

사용자-에이전트: Mozilla/4.06 동의: image/gif, image/jpeg, /

POST 요청에서 사용자 제공 데이터는 선택적인 머리글을 따르며 POST URL에 포함된 내용의 일부가 아닙니다.

와 같이 웹고트를 이용하기위해 필요한 http 지식에 대한 설명이 있다.

 

 

 

이름을 넣고 go!를 누르면 리퀘스트가 올것이고 입력을 반대로 하여 출력한다는 내용이다.

3번 페이지로 이동한다

 

우선 위의 사진을 보자

go!를 눌렀을때 get과 post중 어떤 커맨드가 사용되는지와 magic number를 맞추어보라는 내용이다.

이를 알기 위해선 우선 HTTP의 간단한 지식이 필요하다.

웹에서 이루어지는 통신을 정의한 프로토콜이다.

HTTP는 사용자가 서버에 요청을 하는Request와 사용자의 요청에 대한 서버의 응답인 Response

로 나누어 진다.

HTTP Request는 서버에 대한 요청을 의미하며,

HTTP Response는 사용자의 요청에 대한 서버의 응답을 의미한다.

이 구조는 burp suite로 살펴본다.

http request의 모습이다.

METHOD PATH VERSION

HEADER

BODY

method는 서버에 요청 시 수행하고자 하는 동작을 말하며,

매소드로 자주 사용되는 것으로 GET 과 POST다

Get ➡ URL에 파라미터 포함

Post ➡ BODY에 파라미터 포함

이것은 http 매소드중 POST를 사용하는 것으로 추정된다. go!를 눌렀을 때 url의 변화가 없어서이다.

request를 할 때 GET 매소드를 사용하게되면 위 리소스 url의 쿼리 파라미터가 변한다

get 매소드로 http 통신을 하게 될 때 바디에 정보를 넣지 않고 파라미터를 넣는 것이다.

밑줄친 ?뒤의 부분이 바로 쿼리 파라미터이다.

POST 매소드를 사용한다면 url의 변화없이 위 burp suite의 사진처럼 바디에 파라미터가 작성되는 것을 볼 수 있다.

 

따라서 위의 답은 POST, 16 이다

 

🐐(아주 간단한)WebGoat 실습

 

랜딩 페이지

링크를 눌렀을 때 나오는 페이지. 일반적으로 다른 페이지들과 다른 특수한 목적이 있다.

링크 클릭 유도

정보 탈취

webwolf 에서 볼 수 있다.

 

SQL

  • 문자형 String
  • 숫자형 Numeric

데이터 베이스와 상호작용하기 위해 사용되는 컴퓨터 언어

  • DML 데이터 조작어 (DB에 저장되는 데이터 관련) 테이블 데이터 필드 추가, 삭제, 검색 등
  • DDL 데이터 정의어 (DB 구조 관련) 테이블 생성, 삭제
  • DCL 데이터 제어어 (DBMS 제어 관련) DBMS: 데이터 베이스를 관리하는 시스템(database management system) 권한 부여

 

What is SQL?

It is your turn!

Look at the example table. Try to retrieve the department of the employee Bob Franco. Note that you have been granted full administrator privileges in this assignment and can access all data without authentication.

🦜💭예제 표를 보십시오. 직원 밥 프랑코의 부서를 회수해 보세요. 이 할당에 대한 전체 관리자 권한이 부여되었으며 인증 없이 모든 데이터에 액세스할 수 있습니다.

정답

select * from employees where first_name='Bob' and last_name='Franco';

 

Data Manipulation Language (DML)

It is your turn!

Try to change the department of Tobi Barnett to 'Sales'. Note that you have been granted full administrator privileges in this assignment and can access all data without authentication.

🦜💭Tobi Barnett의 부서를 '영업'으로 변경해 보십시오. 이 할당에 대한 전체 관리자 권한이 부여되었으며 인증 없이 모든 데이터에 액세스할 수 있습니다.

정답

update employees set department='Sales' where first_name='Tobi' and last_name='Barnett';

 

Data Definition Language (DDL)

Now try to modify the scheme by adding the column "phone" (varchar(20)) to the table "employees". :

🦜💭이제 "직원" 테이블에 "전화" 열(varchar(20))을 추가하여 계획을 수정해 보십시오. :

정답

ALTER TABLE employees ADD phone varchar(20);

 

sql injection에 사용되면 유용한 커맨드들

주석

/**/, -- , #

 

문자열 이어붙이기

‘, +, ||, char()

*char(97)은 소문자 a

Ex) select * from where name = ‘ ’+char(97) or 1=1

‘’+’smith’

‘’+char(83)+’mith’

 

특수문법

Union 테이블 데이터 합치기, join 테이블 결합(속성값 변동이 일어남)

 

User_system_data 테이블 만들기

 

Smith union select userid, user_name , password,cookie,null,null,null from user_system_data where 1=1(조건없음) –

Union의 특성상

테이블 속성값이 나옴

 

다중 쿼리

;(앞의 셀렉트 닫아주고) select 문 새로 쓰기

Select * from user_system_data where 1=1;

 

Blind sql injection

데이터베이스 ox 문제를 출제하여 돌아오는 답변을 통해 정답을 찾아가는 방식의 공격

어떠한 질문을 주고 sql의 반응을 살펴 그것을 추출하도록 하는 것이고

꽤 어려운 문제임

 

1.     콘텐츠 기반

2.     시간 기반

Ex) article =4 라는 파라미터를 붙여서 보낸다고 가장해보자.

Select * from articles where article_id=4 and 1=1 로 늘리면

우측은 항상 true고 왼쪽 값이 true면 열람하겠다는 뜻 이므로

이것이 오류 발생하지 않을 때 공격이 통하고 있구나 라는 사실을 알 수 있다.

1=2로 바꿔보자.

그럼 우측은 항상 false 일 것이다.

따라서 좌측에 뭐가 돌아와도 동작하지 않을 것이다.

거짓일 때의 서버 반응을 기억하고

참일 때의 서버 반응을 기억해야한다.

 

Article = 4 and substring(database_version(),1,1)=2)

문자를 자를 것이다. String을 잘라서 1,1 의 위치가 숫자가 2라면 true가 나올 것이다

그런식으로 ox 문제를 내는 것이다.

Db 버전이 낮다면 다양한 데이터베이스의 공격을 할 수 있고, sql은 비표준 언어이기 때문에 문법을 확인할 수 있다.

이런 정보를 기반으로 시스템 테이블을 찾을 수도 있을 것이다. 모든 테이블을 열람할 수 있는 기회를 포착할 수 있고, 필요한 정보 획득이 가능하다. DB 자체를 덤프할 수도 있다.

시큐어 코딩을 해서 참, 거짓이 똑같아도 시간 기반 sql 인젝션을 할 수도있다

Ex) article=4; sleep – 이런식으로 하면 반응은 안해도 sql 인젝션이 가능하다는 것을 알 수 있다.

이런 식으로 시간차를 보면서 sql 인젝션이 가능하다.

개발자툴 ctrl shift c로 열어서 힌트를 찾을 수 있음

Length(password)>1; 이런식으로 length 길이 찾고 어트리뷰트 찾고..

Substr(password,1,1)=’a’ 이런식으로

하나씩 노가다하면서 password를 물어보는 것이다.

 

다음 강의에서 자동화 방법 찾기

버프 스위트에서 제공하는 기능 중 인트루더 라는 기능을 사용할 것이다.

 

Mitigation- 어떤 공격이 있으면 방어하고 예방한다는 표현으로 사용함

완화나 경감의 뜻임

 

불변 쿼리

 

Sql 인젝션에 대응하기 위한 몇 가지 방법들이 존재한다

쿼리에 별도로 해석이 피룡한 부분을 존재하지 않도록 없애거나, 쿼리를 해석 없이 독립된 존재로써 다루는 방법이 있다.

사용자의 입력값이 위와 같이 없을 수도 있고, 있을 수도 있지만 이와 관련 없이 형태가 변하지 않는 sql 쿼리를 의미한다

물음표 부분에 대응시켜서 인젝션용 코드라고 해도 코드가 문자열로 취급되기 때문에 sql 인젝션에 안전하다

파라미터화 된 커리를 지원하는 특정 함수를 지원하는 것을 사용하여 특정 값을 대입해라

저장 프로시저

Sql 쿼리들을 한번에 실행하기위해 사용되는 쿼리들의 집합이다. 동적 sql을 생성하지 않도록 하는 것

자바나 닷넷 등에서 있는 예시가 있긴 하지만 그닥 좋은 구문이 아니라서 생략

Sql 인젝션 방어를 위한 핵심 사항은 사용자들의 입력값을 의심하고 필터링하는 과정이 필요함

정적 쿼리 이용하거나 수상한 입력값 차단시키고

Order by clause 절 이용하면 인젝션 공격에 완벽히 대응할 수 있나 ? à 정답은 아니오.

사용자가 입력할 수 있는 어딘가에서 order by를 이용해보자.

Select * from users order by lastname;

으로 해당 어트리뷰트 값 기준으로 정렬한다는 내용

Order by orderExpression:{columnNr | columnAllas | selcetExpress …. 등}

여기에 함수도 올 수 있다고 되어 있다. 따라서 Case 문을 사용하여 질문 할 수 있다.

함수가 들어갈 수 있다 = 함수가 들어갈 수 있기 때문에 case when(true)을 같이 사용하면서 blind sql 인젝션 사용이 가능할지도 모른다.

 

예방법

입력되는 값을 검증하기 위해 화이트 리스트 기반으로 구현해야 할 것이다.

Firstname, lastname 등 특정 값만 들어가도록 통제할 필요가 있다.

Order by 절 이용하여 sql 인젝션 실행해보자

Webgoat-prd 서버 ip 주소 확보해보자.

Burp-suite 사용해보자

 

DREAMHACK WARGAME SQL injection : simple sqli

host1.dreamhack.games:포트번호로 접속 후 로그인 클릭

 

 풀기위해 python 코드 참고

 

userid = >>  입력 : admin" or "1"="1

userpassword는 아무거나 입력해도 된다.

이유?

select * from users where userid = "admin" or "1=1" and userpassword="ramdompw"가 된다.

우선순위에 따라 and가 먼저 연산이 되고 pw는 항상 F이기 때문에

userid="admin" or False가 된다.

따라서 userid = "admin"이 테이블에 존재만 한다면 그 값을 가져올 수 있는 것이다.

 

 

번외 : command injection

 

ping을 들어간다

 

ping 클릭

ping 성공 확인

첨부된 python 파일을 열어 파이썬 파일을 살펴보고

burp suite를 켠다.

 

여기서 input으로 받은 내용이 cmd f' ping -c 3 "{host}" 에 들어간 다는 것을 추측할 수 있다.

여기서 ;을 사용하여 뒷 내용을 실행할 수 있도록 할 수 있다.

ping을 누르면 여기서 요청한 형식과 일치시키라는 말이 뜬다.

나름 방어를 위한 필터링이라고 추측된다.

이땐 burp suite를 사용하면 간단히 저것을 뚫을 수 있다.

이렇게 입력을 바꿔주고 forward를 누르면
ping 명령어 뒤로 ls 명령어가 함께 실행된다.

다시 돌아와서

형식만 아무렇게 맞춰 ip ping을 한후

위와 같이 바꿔준다

여기서 유의할 점은 "cat flag.py 라고 쓰지 않는 것이다.

명령어가 "cat flag"라고 읽어지기 때문에 어떤 명령어도 나오지 않는다.

따라서 저렇게 따로따로 적어줘야지 cat 명령어가 잘 사용된다.