오늘은 CSRF 공격을 공부했다.
CSRF는 변존 XSS 공격이다.
CSRF ( Cross Site Request Forgery )
변종 요청 공격이다.
스크립트를 사용하지 않고 html 태그를 사용하여 취약점을 공략한다.

이 공격을 해보기에 앞서서
HTML 코드를 분석해보는 단계부터 연습해 볼 것이다.

관리자 페이지에 들어간다.



(관리자 페이지)



회원 관리를 눌러준다.



(회원 관리 버튼)




여기서 게시판에 회원 가입한 회원들의 정보를 볼 수 있다.
또한 이 페이지에서 회원의 정보, 등급을 바꿀 수 있다.
그렇다면 이 페이지에서 어떤 변수들을 어느 페이지로 전달을 하여
회원 level을 수정할까?




(회원 관리 페이지)



소스보기로 들어간다.

먼저 form 태그를 찾아서 어디로 보내는지 그리고 변수를 확인했다.
보내는 곳은 admin_setup.php 파일이다.



(소스 코드)



(소스 코드)





(소스 코드)



여기 까지 레벨 수정에 필요한 변수들이었고
수정하기 버튼을 잘 보면 onclick으로 move_all() 함수가 설정 되있는 것을 볼 수 있다.
그렇다면 move_all() 함수를 살펴보자.



(move_all() 함수)



exec2에 moveall 이라는 값을 넣어주어 넘겨준다.!

여기까지 정리해보면 필요한 변수와 값은
page=1
group_no=1
exec=view_member
page_num=10
exec2=moveall
cart[] = 2 
movelevel=1 

먼저 GET 방식으로 변경해보겠다.
URL을 통해서 변수를 전달해준다.
admin_setup.php?page=1&group_no=1&exec=view_member&page_num=10&exec2=moveall&cart[]=2&movelevel=1



(url 입력)



(실행 결과)



실행 결과 사용자의 Level이 1로 상승된 것을 확인 할 수 있다.

이번에는 POST방식으로 변수를 넘겨보겠다.
그러기 위해 F12 관리자 모드에서
콘솔에 입력해주면 된다.
document.write("") 으로 입력해주면 페이지를 만들어서 보낼 수 있다.

조작한 Form
<form method=POST>
<input type=hidden name=page value=1>
<input type=hidden name=group_no value=1>
<input type=hidden name=exec value=view_member>
<input type=hidden name=page_num value=10>
<input type=hidden name=exec2 value=moveall>
<input type=hidden name=cart[] value=2>
<input type=hidden name=movelevel value=1>
<input type=submit value=전송>
</form>
이 내용을 전부 한줄로 만들어 보내는 것이 중요하다.
이 내용을 전부 한 줄로 만들어 콘솔에 입력해준다.



(POST 전달)




(Form 페이지)



입력을 하면 Form 페이지가 만들어진것을 확인 할 수 있고
여기서 전송버튼을 누르면 우리가 만들어준 변수들이 그대로
admin_setup.php로 전달되는 것이다.



(실행 결과)



실행 결과 역시 level1로 상승했다. ( 다시 9로 만들어준 상태였다.)

이번에는 회원 설정변경에 들어가서 레벨과 관리자 권한을 수정해보겠다.



(수정할 부분)



소스코드를 열어서 확인해보면



(소스 코드)




(소스 코드)



변경에 필요한 변수들을 쉽게 찾을 수 있다.

이 변수들을 이용해 아까와 마찬가지로
GET방식으로 정리하면
admin_setup.php?exec=view_member&exec2=modify_member_ok&group_no=1&member_no=2&page=1&keyword=&name=normal&level=1&is_admin=1



(GET방식)




(실행 결과)




실행 결과 역시 level1로 상승 되었다.

POST 방식도 아까와 같다.
<form method=POST>
<input type=hidden name=exec value=view_member>
<input type=hidden name=exec2 value=modify_member_ok>
<input type=hidden name=group_no value=1>
<input type=hidden name=member_no value=2>
<input type=hidden name=keyword value=>
<input type=hidden name=name value=normal>
<input type=hidden name=level value=1>
<input type=hidden name=is_admin value=1>
<input type=submit value=전송>
</form>
아까와 마찬가지로 한줄로 만들어서 작성해주면 된다.


(POST 전달)




(Form 페이지)



버튼을 누르면



(실행 결과)



실행 결과 레벨상승과 관리자 권한을 획득할 수 있다.

다시 원래 주제로 돌아가서
오늘은 CSRF를 이용하여 레벨1, 관리자 권한을 획득 할 것이다.
변조 요청으로
HTML 태그 중 <img> 태그를 이용할 것이다.

원리는 이렇다.
<img src=""> src에 우리가 원하는 변수와 값들을 GET방식으로 전달하는 url을 넣을 것이다.
만약
관리자가 이 글을 본다면
관리자의 신분으로 이 변수값들이 서버에 전달되게 되고
그렇게 되면 서버 입장에서는 관리자가 요청한 것으로 착각하게 되어
공격자의 레벨이 1로 상승하고 관리자 권한이 생기게 된다.

공격에 앞서 다시 attack 계정을 일반계정으로 바꾸어 두었다.



(일반 계정으로 전환)



attack 계정으로 로그인 한 후
게시판에 글을 작성한다.
CSRF 공격


(악성 HTML 태그 삽입)



그 후 관리자가 그 글을 읽기 까지 기다린다.



(관리자 확인)



관리자가 확인을 했다면
게임 끝이다.

이제 attack 계정은 관리자 계정이 되는 것이다.




(공격 확인)




이것이 변조 요청 공격
CSRF 공격이다. 바로 XSS의 변종 공격기법이라고 할 수 있다.




XSS( Cross Site Scripting )
- javascript를 이용한 대표적인 취약점이다.
  스크립트로 작성된 코드는 클라이언트의 웹브라우저에서 실행이 된다.

인터넷 웹 화면이 뜨는 과정은 웹 서버에서 우리 앞의 웹 브라우저로 코드가 날라오고 웹 브라우저는 그 코드를 실행하여 화면에 보여주는 것이다. 이 때 넘어오는 값에 스크립트 코드를 넣는 것이다.
 -> 주 타겟 : 불특정 다수(클라이언트)

ex) 예를 들어 게시판에 아래와 같은 글을 업로드 하는 것이다.
<script>alert("공격성공")</script>
(Enter가 들어가면 안된다.)
-> 공격을 하려면 자바스크립트로 원하는 코드를 만들 수 있어야한다.

스크립트 코드가 실행 되는지 확인하기 위하여 alert() 을 사용하여
코드가 실행 된다면 악의적인 코드가 실행될 가능성이 있다고 판단하여
취약점이라고 간주한다.

우리가 만든 제로보드 게시판에 XSS 공격을 해보겠다.



(스크립트 작성)




(게시판 화면)



게시판에 공격자의 글이 올라온 것을 확인 할 수 있다.

만약 이 글을 클릭한다면



(악성 코드 실행)



공격자가 작성한 스크립트 코드가 실행된다.



(글 화면)



글 내용에는 아무 글도 보이지 않는다.
왜냐하면 스크립트코드로 간주되었기 때문이다.

이런 방식으로 게시판 혹은 서버에 저장해두어 다른 사람들이 열람하여
코드가 실행되게 하는 방식을 Stored XSS 라고 한다.

다른 방법으로는 reflected XSS가 있다.

이 방법은 다음 XSS 취약점을 보면서 확인하겠다.
다음 XSS가 가능한 부분은 많지만
그 중에 회원가입란의 아이디 중복체크하는 페이지다.


(중복 체크 페이지)



이 페이지의 주소를 살펴보면
url을 통해서 값이 전달되고 있는 것을 확인 할 수 있는데
이 변수에 스크립트 코드를 넣어 실행하면
바로 실행이 된다.



(url을 통한 스크립트 코드)





(실행 화면)



실행하게 되면 IE에서
XSS를 발견하여 조치를 취해주었다.

우리는 공격을 확인 할 것이므로 잠시 이 설정을 해제해 주도록 하겠다.



(인터넷 옵션)



인터넷 옵션에서 보안탭을 들어간다.




(사용자 지정 수준 클릭)



사용자 지정 설정 수준에 들어가면
아래 부분에 XSS 필터 사용 항목이 있는데
사용 안 함으로 클릭해 주면 된다.



(사용 안함 클릭)



그런 상태로
아까와의 같은 url로 접속을 하면



(실행 화면)



스크립트 코드가 실행 된것을 확인 할 수 있다.

이 방식이 아까 Stored XSS와 다른 점은
저장되는게 아니라 바로 돌아온다. 입력된 그자리에서 실행된다는 것이다.


<script>alert(" target="_blank">http://100.100.100.129/zboard/check_user_id.php?user_id=<script>alert("xss")</script>
 링크를 활용해서 공격할 수 있다.
바로 이런 방법이 reflected XSS 이다.

이 공격을 더 유용하게 만드는 것은 shorten url 이다.
url을 짧게 만들어준다.



(shorten url)



그렇다면
XSS에 대한 대책은 어떤 것이 있을 까?

<script> 문을 게시 글 이외에
어떤 곳에서도 올리지 못하게 해두어야한다.

제로보드의 코드를 조금 수정해 보겠다.
게시판 글을 쓰는 곳에서 코드를 확인해보니
write_ok.php 파일로 데이터들을 전송하는 것을 확인 할 수 있다.



(보내는 곳 확인)



그렇다면
우리가 손봐야할 파일은
write_ok.php이다.



(write_ok.php 수정)



먼저 게시판 글쓰기의 소스코드를 확인해보면
게시 글이 변수 memo를 통해 넘어오는 것을 확인 할 수 있다.



(게시글 변수)



그러므로 우리는
write_ok.php 파일 맨 앞에
<script> 단어가 있으면 XSS 공격으로 간주하는 코드를 추가할 것이다.



(코드 추가)



코드 추가 후 공격을 해보겠다.



(XSS 공격)




(차단)



차단 된 것을 확인 할 수 있다.

하지만 방어가 있으면 다시 또 다른 공격을 하는 법..

이 코드를 우회할 수 있다면? (아주간단하게..)



(우회? 공격)



아주 간단하게 첫 script 를 대문자로 작성했다.



(우회 XSS 공격)




(공격 성공)



공격이 성공했다..
아주 간단하게 성공됬다.

이는 아까의 코드에서 문자열 검색에서 i를 추가해주면
대소문자 전부 체크해준다.



(코드 수정)



그렇게 되면



(우회 공격)




(차단)



간단한 우회도 차단할 수 있게 된다.

하지만 우회하는 방법은 수없이 많다.
그러므로 시큐어코딩(안전한코딩)이 쉬운 일은 아니다..!




제로보드 설정까지 완료했으므로
이제 제로보드를 이용하여
게시판을 만들어보겠다.

관리자 계정으로 로그인 하고
왼쪽 상단에 Add Group을 눌러준다.




(Add Group 클릭)



클릭 후 그룹 이름을 써주고
확인을 누른다. (기본으로 설정해준다.)



(그룹 생성)



그룹이 생성된 모습이다.



(그룹 생성 모습)



여기서 왼쪽 상단에 게시판 항목에 Add를 클릭한다.



(게시판 Add)



게시판 Add 입력 항목이다.
여기서 이름을 작성해주고
기본 보호 설정을 해제 해 줄것이다. (먼저 웹 취약점을 공부하기 위해서)




(게시판 작성 페이지)



HTML 설정을 모두 허용으로 바꾸어준다.



(HTML 설정)



업로드 기능을 체크하여 자료실 기능을 사용으로 바꾸어준다.




(업로드 허용)



그리고 게시판 생성을 누르면
아래와 같이 게시판이 생성된 모습이 보인다.



(게시판 생성 후 모습)



이 페이지는 게시판의 목록을 볼 수 있다.

방금 우리가 만든 게시판을 확인해보자.

Preview를 클릭하여 본다.



(게시판 모습)



우리가 제로보드를 이용하여 만든 게시판의 모습이다.

회원가입을 하여 글을 작성해보겠다.! (테스트)



(회원가입)



그 후 로그인 하여 글을 작성해보겠다.



(글 작성)



보면 글이 잘 써지는 걸 확인해 볼 수 있다.




(작성된 모습)



글 목록에서도 보인다!



(게시판 목록 모습)



여기까지 게시판을 만들었다.

이제 이 게시판을 이용하여 웹 취약점을 살펴 보겠다. :)





Web Hacking - 실습환경 웹서버 구축(제로보드)(1) 에 이어서 웹서버를 설정할 것이다.

install.php 경로로 들어오면 아래와 같은 화면이 나온다.




(707 퍼미션 요구 화면)



빨간 글씨로 707 퍼미션이 되어있지 않다고 나와있다.

zboard 디렉터리의 권한 설정을 해준다.
#> chmod 707 zboard



(권한 설정 화면)




위와 같이 설정이 잘되면
아래와 같이 빨간 글씨가 사라지고 설치 시작 버튼이 나온다.



(설치 시작 화면)



클릭을 해주면
아래와 같이 입력하는 란이 나오는데
여기서 아직 우리가 DB를 만들지 않았다.



(입력 화면)



zboard DB를 만들어보자!

먼저 mysql에 접속해준다.



(mysql 접속)



접속 후 show databases; 명령어를 이용하면
현재 있는 DB가 보인다.



(현재 DB)



여기서
create 명령어를 사용하여 zboard라는 DB를 만들어준다.



(DB 생성)



다시
show databases;
명령어를 이용하여 현재 DB를 확인해보면
zboard가 생성된 것을 확인 할 수 있다.



(생성된 DB)



자 생성해주고!
입력을 해주고
설정완료를 눌루면 다음과 같이 에러가 나온다.



(에러 화면)



위 에러는 우리가 지금 옛날 버젼의 zboard를 쓰기 때문에
쿼리 명령문중 바뀐 내용이 있기 때문이다.

우리는 그 명령문을 수정해 줄 것이다.

수정해줄 파일은
zboard 디렉터리 안에있는 schema.sql 파일이다.



(vi 편집기로 schema.sql 열기)




vi 편집기로 schema.sql 을 열어준다.

그리고 수정해주어야 할 것!

1. password varchar(20) -> password varchar(50)
옛날에는 20사이즈면 충분했지만 더 길어진 해쉬값으로 50까지는 늘려주어야한다.



(password 사이즈 수정)



파일 안에 있는 varchar 사이즈를 50으로 바꾸어준다 전부! (password만)

2. primary key는 default 값이 될 수 없다. 하지만 옛날 버젼에서는 가능했는지 다음과 같은 명령 구문이 들어있는데 이 둘이 충돌이 되기 때문에 삭제해주어야한다.
primary key는 사용할 것이기 때문에 default '0' 만 삭제해 준다.




(default '0' 삭제)




(삭제된 모습)



이렇게 primary key와 충돌하는 default 값을 전부 지워준다.

그렇게 되면 아래와 같이
에러없이 넘어갈 수 있다.

그러면 다음 칸에 아이디, 패스워드를 입력하고 [정보입력완료]를 누르면 된다.




(관리자 정보 입력)



그 후 관리자 계정과 비밀번호로 접속해 준다.


(관리자 계정 접속)



그러면 아래와 같이 관리자 페이지가 나온다.




(관리자 페이지)



여기까지가 제로보드 서버 구축 및 설정이다. :)


웹 해킹에 들어가기 앞서
웹서버를 구축할 것이다.
(취약점이 많은!)

그 취약점들을 먼저 공부해 볼 것이기 때문이다.

리눅스에서 웹서버를 구축하기 전에
리눅스의 방화벽을 전부 해제해 줄 것이다.
(실제 서버에서는 해제하면 안된다!, 하지만 우리는 공부할 것이기 때문에 해제해 주도록 한다!)

리눅스에는 방화벽이 두개가 있다.
1. iptables
2. SELinux
이렇게 두개다!

iptables를 삭제해 줄것이다.
/etc/sysconfig/iptables  를 삭제해준다.



(iptables 삭제)



SELinux를 해제해 줄것이다.

vi /etc/sysconfig/selinux 에 들어가서 (vi 편집기 이용)
SELINUX에 disabled로 고쳐준다.



(SELinux 해제)



잘 해제 되었는지 확인해본다.
iptables -L   (명령)
했을 때 체인 룰이 아무것도 안나오면 설정이 안되있는 것이다.


getenforce를 입력하였을 때
Disabled라고 나오면 해제된 것이다.


(해제 모습)



그 후 yum을 이용하여
httpd.i386
php.i386
php-mysql.i386
mysql.i386
mysql-server.i386

을 설치해준다.



(설치된 모습)



httpd를 실행시켜준다. (아파치 웹서버이다.)



(실행 모습)



netstat -ant로 확인해볼 수 있다. (웹서버 포트는 80번 포트)



(웹서버 실행중)



혹은
현재 실행중인 프로세스를 확인해서 확인할 수 도 있다.
명령어 #> ps -ef | grep httpd



(프로세스 확인)



그렇게 되면 외부 호스트에서 IP주소로 접속하였을 때
아파치 화면이 뜬다.



(아파치 화면)



이제 MySQL 실행시켜줄 것이다.
MySQL은 DB이다.

명령어 #> service mysqld start

netstat -ant로
3306이 열려있으면 실행된 것이다.



(MySQL 실행)



mysql에 접속해 보겠다.
#> mysql -u root
(처음 접속, 비밀번호 설정 안했을 때) 이렇게 들어간다.



(접속 화면)



접속이 되면
mysql>
이렇게 프롬프트가 바뀐다.

비밀번호를 설정해 주겠다.
명령어
#> mysqladmin -u root password (쓸 비밀번호)



(비밀번호 설정)



비밀번호를 설정한 후에는 접속 방법이 조금 다르다.

#> mysql -u root -p
이렇게 접속하면
비밀번호 입력하는 란이 나온다.
여기에 아까 설정해준 비밀번호를 입력하면 된다.


(비밀번호 입력 접속)



이제 제로보드를 설치할 환경이 다 갖추어 졌다.

제로보드를 /var/www/html  경로에 다운받아준다.
현재 제로보드가 tar형태이므로 풀어줄 것이다.
명령어
#> tar xvf zboard.tar



(타르 파일 풀기)




(푼 모습)



해제하고 나면 해당 경로에 디렉터리 하나와 파일 하나가 생긴다.



(풀린 모습)



여기서 /etc/php.ini  파일을 하나 고쳐줄 것이 있다.



(vi /etc/php.ini )



vi 편집기를 이용해 들어와서
아래 표시된 부분을 On으로 고친다.



(고쳐진 모습)



그 후 외부 호스트에서
IP/zboard/install.php 경로로 접속을 하면 아래와 같이 나온다.



(접속 모습)



여기서 한글이 깨지는 것을 발견할 수 있는데
웹브라우저가 인코딩을 안해주기 때문이다.
인코딩 해주는 프로그램을 추가해준다.



(인코딩 프로그램 추가)



추가해 준 후 해당 페이지에서 오른쪽 클릭을 해서
Korea 로 인코딩 눌러준다.



(Korea 클릭)



그렇게 되면 아래와 같은 화면으로 잘 나오게 된다.!





+ Recent posts