Linux/모의해킹

세션 파일을 이용한 로그인 분석

GGkeeper 2022. 1. 20. 22:13

#############
## 세션 & 쿠키
#############
웹에서 사용하는 HTTP 는 연결을 유지하지 않는 프로토콜이다.
SSH, Telnet 의 프로토콜은 연결을 유지하는 프로토콜이다.
HTTP 이용한 웹 클라이언트와 웹 서버간에 연결을 유지하는 역할을 하는게 쿠키와 세션을 이용한다.

쿠키 : 클라이언트에 정보가 저장된다.
세션 : 서버에 정보가 저장된다.

예전 : 인증에 성공하면 쿠키로 관련 정보를 저장했다. (정보가 클라이언트에 저장되기 때문에 보안에 문제가 생기게 되었다.)
요즘 : 
인증에 성공하면 세션으로 관련 정보를 저장하고 세션ID를 클라이언트에게 전송해서 클라이언트에서는 세션ID를 쿠키로 저장한다.
그리고 서버에 접속을 할때마다 세션ID를 쿠키로 가지고 다니고 서버가 이를 확인해서 사용자를 판단한다.

실습> 세션 파일을 이용한 로그인 분석

세션파일 : 
http 프로토콜은 연결이 유지되지 않는 프로토콜이므로 세션 파일을 이용해서 연결을 유지시켜준다. 
ex) 로그인

1. 소스코드 작성
테스트할 소스코드를 작성한다.
[root@www ~]# cd /var/www/html/
[root@www html]# vi session1.php
<?
// 세션을 사용하기 위해서는 session_start(); 함수를 사용한다.
// 이 함수를 사용하기 전에 HTML 코드가 하나라도 전송되면 안된다.
session_start();

?>
<!doctype html>
<html>
  <head>
    <meta charset=utf-8>
    <title> ::: session 테스트 ::: </title>
  </head>

<body>

세션 테스트

</body>
</html>

2. EditThisCookie 플러인 추가
EditThisCookie : 크롬에서 쿠키를 관리해주는 플러그인 프로그램
https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg/related?hl=ko

3. 쿠키 삭제
EditThisCookie 플러그인을 추가하면 고정으로 설정해 놓고 쿠키를 삭제한다.

4. 세션 파일 삭제
/etc/php.ini 설정 파일
[Session]
session.save_handler = files
  :
  :

/etc/httpd/conf.d/php.conf 설정 파일
php_value session.save_handler "files"
php_value session.save_path    "/var/lib/php/session"      

PHP 세션디렉터리 : /var/lib/php/sessions
리눅스 서버에서 세션을 관리하는 디렉터리인 /var/lib/php/session/ 디렉터리 이동해서 세션 파일들을 삭제한다.
[root@www html]# cd /var/lib/php/session/
[root@www session]# rm -f *

5. burp 설정
Intercept is on 으로 설정한다.

6. 클라이언트 접속
브라우저에서 아래 URL로 접속한다.
http://192.168.108.101/session1.php

7. Request 분석
클라이언트에서 접속한 Request 정보를 확인한다.

GET /session1.php HTTP/1.1
Host: 192.168.108.101
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

8. burp에서 전송
burp에서 Forward 버튼을 클릭해서 서버로 웹 데이터를 전송한다.

서버입장 : 
session1.php 를 서버에서 실행할 때 session_start(); 함수가 실행되면서 세션 디렉터리(/var/lib/php/session)에
랜덤 문자열을 생성하고 서버에서 확인하면 아래처럼 세션파일이 생성된다. 
세션 파일명 : sess_랜덤문자열
[root@www session]# ls -ld
drwxrwx---. 2 root apache 45  1월 20 13:13 .

[root@www session]# ls -l
합계 0
-rw-------. 1 apache apache 0  1월 20 13:13 sess_142v2qnvgghevrumcojk949937

클라이언트에게 Set-Cookie: PHPSESSID=142v2qnvgghevrumcojk949937; path=/ 를 HTTP 헤더에 담아서 전송한다.

HTTP/1.1 200 OK
Date: Thu, 20 Jan 2022 04:13:10 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Set-Cookie: PHPSESSID=142v2qnvgghevrumcojk949937; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 157
Connection: close
Content-Type: text/html; charset=UTF-8

<!doctype html>
<html>
  <head>
    <meta charset=utf-8>
    <title> ::: session 테스트 ::: </title>
  </head>

<body>

세션 테스트

</body>
</html>

burp에서 Forward 버튼을 클릭해서 클라이언트에게 웹 데이터를 전송한다.
클라이언트가 서버가 보내준 쿠키를 자신이 관리하는 임시 웹 디렉토리에 쿠키를 저장한다(굽는다).

9. 서버 재접속
클라이언트가 서버로 재접속을 할 때 자신이 저장한 쿠키를 가지고 서버로 접속한다.
세션 이름은 /etc/php.ini 설정 파일에 설정되어 있다. 
형식 : session.name = PHPSESSID

형식 : Cookie: PHPSESSID=142v2qnvgghevrumcojk949937

GET / HTTP/1.1
Host: 192.168.108.101
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: PHPSESSID=142v2qnvgghevrumcojk949937
Connection: close

10. 로그인 
클라이언트가 로그인 시도한다.
id : admin
pw : 111111

[root@www session]# ls -l
합계 4
-rw-------. 1 apache apache 44  1월 20 13:25 sess_142v2qnvgghevrumcojk949937
[root@www session]# cat sess_142v2qnvgghevrumcojk949937 
userid|s:5:"admin";username|s:9:"관리자";