개인과제+정보처리기사+보안기사+취업활동

다 챙기기에는 내 능력상 버티질못해 잠시 휴재....

ㅠㅠㅠ
정보처리기사 필기시험 : 2018.03.04
가채점결과는 합격 ㅋㅋ

'Penetration Testing > Bee-Box' 카테고리의 다른 글

[Bee-Box] SQL 인젝션 (GET/Search)  (0) 2018.02.22
PHP - addslashes 함수  (0) 2018.02.21
[Bee-Box] SSI 인젝션  (0) 2018.02.21
[Bee-Box] PHP 코드 인젝션 (PHP Code Injection)  (0) 2018.02.20
[Bee-Box] OS 커맨드 인젝션  (0) 2018.02.14

    SQL 인젝션?

그렇다. 대부분이 웹해킹을 하면 제일 많이듣는 기법중 5손가락안에는 드는 그것! 
OWASP에도 거의 탑쓰리급으로 제일 먼저 나오는 그것!

SQL인젝션은 사용자가 입력한 값을 서버에서 검증하지 못하거나 안했을 때 데이터베이스가 쿼리를 정상인식해버려서 정보가 노출된다던가 공격자가 원하는 결과를 뽑게 만들어준다.

SQL 인젝션이 일어나는 쿼리를 예시를 들자면
select * from testtable where id='' or 1=1 #' AND password='';
가 되겠다.

실습하면서 보도록 하자.



    실습(GET/Search)

실습페이지 이동, Search와 Select 두개중에 Search를 선택한다.

선택 시 나오는 첫 화면, 영화를 데이터베이스에서 검색해주는 기능을 한다.

처음으로 해야할 것은 '를 넣어서 SQL 인젝션 취약점이 있는지 확인한다.

Oops! 이렇게 에러메시지가 뜨게된다. 
그러나 이러한 에러 메시지를 통해 공격자는 데이터베이스는 MySQL을 사용하고 있다는 것을 알 수 있고, SQL 인젝션공격이 먹힌다는 정보를 얻을 수 있다.

대표적인 SQL 인젝션 쿼리인
' or 1=1#을 입력해보자.
사용할 쿼리를 해석하면 쿼리결과는 1=1을 통해 항상 참이되고 기존코드 뒷부분을 전부 주석처리를 해버린다.
여튼 정상쿼리로 입력되어 진행된다는 것이다.

그려면 위와 같은 결과가 쫘르르륵 출력되게 된다.

단순히 ' or 1=1#뿐아니라
이제 DB의 정보를 한번 획득을 해보는 실습을 해보자

이번에 쓸것은 UNION SQL인젝션!
SQL구문중에 UNION이라는 구문이 있는데 UNION은 둘 이상의 Select문을 결합하여 하나의 결과물로 출력해주는 구문이라고 생각하면 된다.

' union select 1#이라고 입력해보자

칼럼의 갯수가 맞지 않아서 에러가 뜬다
' union select 1,2#
' union select 1,2,3#
...
이렇게 추가하면서 차례대로 입력을 해보면
' union select 1,2,3,4,5,6,7#

칼럼수가 일치해지는 구간이 생겨 결과가 출력된다.
그리고 하단을 보면

출력되는 열이 2,3,5,4열인 것을 알 수 있다.

그럼 2번열에 MySQL의 버젼을 얻어오는 시스템 변수를 아래와 같이 쳐보면
' union select 1,@@version,3,4,5,6,7#

MySQL의 버전이 출력된 것을 확인할 수 있다!!

이번에는 아래와 같이 SQL구문을 입력해보자
0' union select 1,table_name,3,4,5,6,7 from information_schema.tables#
위 구문의 해석을 미리하자면 information_schema데이터베이스 안에 속한 tables라는 테이블의 table_name 즉 DB에 등록된 모든 테이블의 목록들을 불러오는 SQL구문이다. 
참고로 맨앞에 0을 넣은 이유는 앞전의 select 결과물을 무효화 시켜 쓸모없는 값들을 제외하기 위함인것!

결과는 하단에 나열하기 힘들정도로 많이 나왔다.

추가적으로 blog, users, movies라는 테이블도 보였다.

제일 크리티컬해보이는 users 테이블의 데이터들을 알아내보도록하자.
0' union select 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users'#
뒤에 where하고 조건이 더 붙었는데 users라는 테이블이름을 가진 테이블에서 column_name 즉, 칼럼들의 정보들을 가져오는 SQL구문이다.

출력결과 users라는 테이블의 열값으로는
id, login, password, email 등등 값들이 들어있는 것을 볼 수 있다.

여기까지 users라는 테이블의 존재, users안에 있는 칼럼들의 내용들을 알았으니 본격적으로 users안에 있는 정보들을 얻어보도록 하자
이번에 입력할 SQL 구문은
0' union select 1,concat(id,login),password,email,secret,6,7 from users#
concat 함수는 두개의 칼럼을 하나로 합치는 구문이다. 
출력해서 볼 수 있는 칸이 4개이고 내가 보고싶은 칼럼은 5개이므로 2개를 1개로 합쳐서 출력시켜본다.

순순히 계정정보들이 나온 것을 볼 수가 있다.
차례대로 concat(id,login), password, secret, email순으로 출력되엇다.

결과적으로 SELECT SQL 인젝션은 보안을 하지 않으면 데이터베이스 정보부터해서 테이블 정보 심지어 테이블의 내용까지 전부 볼 수 있다.




    보안방법

지금까지 인젝션한 SQL구문들을 보면 싱글쿼터(')에 의해서 어디까지가 SQL구문의 끝인지 알 수 있다.
그렇다면 이러한 특수문자를 필터링 하면 1차적으로 쉽게 해결될 것이다.
Bee-Box 서버의 sqli_1.php소스코드를 보자.

위 소스코드가 마찬가지로 보안하는 함수들이다. 각각 Low, Medium, High레벨

sqli_check_1, sqli_check_2함수가 들어있는 functions_external.php 소스코드를 보면

sqli_check_1함수는 addslashes함수를 통해 '를 전부 문자열로 바꿔버리고
(addslahes함수는 이전 포스팅 참고)
sqli_check_2함수는 mysql_real_escape_string함수를 통해 MySQL에서 사용되는 특수기호들을 필터링하여 삽입된 특수기호들이 SQL문법으로써 실행되지 못하도록 한다.


'Penetration Testing > Bee-Box' 카테고리의 다른 글

Bee-Box 실습글 휴재  (0) 2018.03.04
PHP - addslashes 함수  (0) 2018.02.21
[Bee-Box] SSI 인젝션  (0) 2018.02.21
[Bee-Box] PHP 코드 인젝션 (PHP Code Injection)  (0) 2018.02.20
[Bee-Box] OS 커맨드 인젝션  (0) 2018.02.14

    addslashes함수

사용자는 데이터베이스에 특수문자를 넣을 경우 예상치 못한 오류를 발생시킬수 있다.
그래서 addslashes 함수를 통해 쿼터(',")같은 특수 문자들을 포함하고있는 문자열에 역슬래쉬(\)를 넣음으로써 오류를 최소화 시키는 역할을 한다.

    예시?

예시를 들어서 우리가 방명록같은 곳에
나는 '남자'다
라고 입력을 할 경우, 데이터베이스 쿼리에는 아래와 같이 작성될 것이다.
insert into testtable values('나는 '남자'다');
이렇게 입력된다면 '남자'를 감싸고 있는 싱글쿼터(')를 제어문자로 인식해버려 문법적으로 오류를 발생시킨다.
이를 최소화 시키기 위해 문자열 싱글쿼터를 따로 구분하기 위해 addslashes는 아래와 같이 바꿔서 넣어주게된다.
insert into testtable values('나는 \'남자\'다');
이렇게 데이터베이스 쿼리로 전송되고 \'는 문자열'로 인식하게 되어 오류를 일으키지 않고 정상적으로 수행할 수 있게된다.


'Penetration Testing > Bee-Box' 카테고리의 다른 글

Bee-Box 실습글 휴재  (0) 2018.03.04
[Bee-Box] SQL 인젝션 (GET/Search)  (0) 2018.02.22
[Bee-Box] SSI 인젝션  (0) 2018.02.21
[Bee-Box] PHP 코드 인젝션 (PHP Code Injection)  (0) 2018.02.20
[Bee-Box] OS 커맨드 인젝션  (0) 2018.02.14

    SSI?

- Server Side Includes의 약자로써 HTML에서 페이지의 전체코드를 수정하지 않고 공통 모듈 파일로 관리하며 동적인 내용을 추가하기 위해서 만들어진 기능이다.
- 주로 값이 자주 변동하는 방문자수를 세거나 새로운 기능을 추가할 때 사용한다.
- SSI를 사용하는 웹 페이지는 .shtml확장자 파일을 생성한다.

개인적으로 써본적이 없어서 제대로 설명하긴 어려울것 같다.
실습하면서 감을 잡는 방법밖에 없는듯..

    실습

실습페이지 이동

첫 화면이고 저기에 입력값이 보인다.
입력값에 아무값이나 넣어줘보자.
필자는 1hello, 2world를 넣었다.

그러자 위와 같은 결과물이 떳다. Hello 1Hello 2World라는 문구와 IP가 출력되었다.
IP는 현재 내가 실습중인 칼리리눅스 IP이다.

그리고 URL을 보면,

ssii.shtml이라는 파일을 가리키는 것을 볼 수 있다.
이를 보아 SSI를 사용하는 것을 알 수 있다.


필자는 SSI를 써본적이 없기 때문에 책에 적힌 명령어를 참고하여 그대로 실습해보았다.

First name에는 SSI 지시어인 <!--#echo var="DATE_LOCAL"-->을 넣었다.
해당 지시어는 현재 시간정보를 출력하는 기능을 수행한다

위와 같이 시간정보가 출력되는 것을 확인할 수 있다.


이렇게되면 이전에 실습한 인젝션 공격들과 비슷하다.
입력칸에 SSI 지시어를 사용해 Bee-Box서버의 정보들을 얻어보자.

이번에는 <!--#exec cmd="cat /etc/passwd"-->를 입력해보자

KOOL!

    보안방법

Bee-Box서버에서 소스코드를 보자

ssii.php의 소스코드 중 보안을 담당하는 함수들이다.
위 함수들이 포함된 functions_external.php로 이동해보자

xss_check_3과 xss_check_4함수가 있다. 각각 High, Medium레벨을 담당한다.
xss_check_3를 보면 htmlspecialchars를 통해 특수기호들을 필터링을 진행하고
xxs_check_4는 addslashes라는 함수를 통해 필터링을 한다.


addslashes함수는 설명하면 길기 때문에 따로 기능에 대해 작성하겠다.


    PHP 코드 인젝션?

웹 애플리케이션을 통해서 PHP 코드를 입력하면, 웹 애플리케이션의 입력을 정상적으로 인식하여 개발자가 의도한 바와 다르게 내부에 있는 PHP 코드를 실행하는 기법이다.
모르면 직접 해보도록 하자.


    실습

PHP로 이동하고

위와 같은 내용이 뜬다.
저기서 message...는 하이퍼링크이다. 일단 눌러보자.


이제 척하면 감이 온다.

우리가 해야하는 것은 PHP 인젝션이므로 message파라미터에 PHP 함수를 쓴다면 ??
pwd명령을 불러와 보자.

입력할 명령어는 system("pwd");

바로 결과가 뜬다.
그런데 왜 2개가 뜨는건지는 소스코드를 봐야할 것같다.

(가독성을 위해 Bee-Box서버의 소스코드를 notepad++로 옮겨온 것)
위가 메인 소스코드이다.

빨간사각형은 Low레벨, 파란사각형은 Medium, High레벨의 함수이다.

Low레벨의 소스코드를 해석해보면
php코드를 실행시키는 eval함수를 사용하는데, echo [message파라미터값];
이렇게 끝나게 된다.

내가 message값으로 system("pwd")를 주었기 때문에
실행되는 php코드는 echo system("pwd");가 된다.
값이 2번 출력되는 이유는 우선 system("pwd")함수를 통해 pwd의 결과를 출력하고,
그 결과를 echo함수가 또 출력해주는 식이라 2번 출력이 되는 것이다.


    보안방법

위에 그림을 또 재탕해서(..) 파란사각형에 있는 내용이 보안방법이 되겟다.
htmlspecialchars함수를 통해 필터링과정을 거친다.
htmlspecialchars함수에 있는 2번째 파라미터에 ENT_QUOTES가 있는데, 이 녀석의 역할은 XSS(Cross Site Scripting)에 사용되는 특수문자들을 HTML문자로써만 인식하게 만든다.


    공격 시나리오

공격자PC(192.168.80.134) 칼리리눅스에 netcat모드를 1234포트를 이용하여 listen상태로 만들어둔다.
netcat에 대한 설명은 생략하겠다. 찾아보면 금방나온다.


바로 브라우저에 입력값을 아래와 같이 입력한다.


그리고 아까의 터미널로 돌아가면

이렇게 자유롭게 bash쉘을 쓸 수 있는 것을 볼 수 있다.
여기까지 우리는 Bee-Box의 쉘을 따낸것이라고 보면된다. (root는 아니지만)

여기서 파일을 생성과 삭제를 하거나 백도어를 심음으로써 지속적으로 Bee-Box서버를 괴롭힐 수 있게된다.

나는 예시로 파일을 만들어 보았다.

빨간색사각형이 필자가 입력한 명령어
이제 브라우저 들어가서 직접 찾아가면..

예상대로 조건부로 서버를 주물럭거릴수 있게되었다.


'Penetration Testing > Bee-Box' 카테고리의 다른 글

PHP - addslashes 함수  (0) 2018.02.21
[Bee-Box] SSI 인젝션  (0) 2018.02.21
[Bee-Box] OS 커맨드 인젝션  (0) 2018.02.14
htmlspecialchars 함수에 대해  (0) 2018.02.13
[Bee-Box] iframe Injection  (1) 2018.02.13

+ Recent posts