본문 바로가기
정보보안

정보보안7 6차시

by IT매니절 2024. 10. 20.

mysql, mariadb 접속시
mysql -h localhost -u user1 -p123456 입력하거나
또는 .my.cnf 파일이 자신의 홈디렉터리 파일에 있어서 데이터가 셋팅되어 있을 때 mysql 만 입력하면 해당 정보로 접속할 수 있다

 

.my.cnf 파일 형식

[client]
host = localhost
user = root
password = 123456

 

테이블 생성

create table member

(no int auto_increment not null primary key,

userid varchar(20) not null unique,

userpw varchar(20) not null);

 

 

데이터를 받아오는 방식

$row = mysqli_fetch_row($result)
$row[0] ... $row[1]

$row = $result->fetch_row()
while($row){
 $row[0] ... $row[1]
}

$row = mysqli_fetch_array($result)
$no = $row[0]; 또는 $row['no'];
$id = $row[1]; 또는 $row['id'];

 

참고 https://www.php.net/manual/en/mysqli-result.fetch-array.php

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3";
$result = mysqli_query($mysqli, $query);

/* numeric array */
$row = mysqli_fetch_array($result, MYSQLI_NUM);
printf("%s (%s)\n", $row[0], $row[1]);

/* associative array */
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);

/* associative and numeric array */
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
printf("%s (%s)\n", $row[0], $row["CountryCode"]);

 

fetch_array(MYSQLI_NUM)
=> row[숫자] 형태로만 사용가능
fetch_array(MYSQLI_ASSOC)
=> row['변수명'] 형태로만 사용가능
fetch_array(MYSQLI_BOTH) 또는 빈값
=> 둘 다 사용가능

 

+ php로 db 연동 테스트 하다가 file not found가 떠서 깜짝 놀랐는데,

알고보니 vi를 home 디렉터리에서 열어서 저장하는 바람에 /var/www/html에 파일이 만들어지지 않았던것

cp로 복사하여 옮겨주니 잘 실행되었다...

 

 

function hap($x, $y=1){ return $x + $y; }
print(hap(3,5) ."<br>");
print(hap(5));
=> 인수가 1개일때 디폴트인수가 셋팅되어 있으면 $y는 1이 된다

* 디폴트인수는 오른쪽부터 채워져야 하며, 왼쪽에만 셋팅하면 에러가 난다
function hap($x=5, $y) ==> 에러

 

 

login.php

=> 로그인 정보를 공백체크하여 loginok.php로 전송

=> 로그인 되면 전송칸 대신 <?=$_SESSION['username'] ?> 님 환영합니다. 환영문구 출력

=> 로그인여부는 if(isset($_SESSION['userid'])) SESSION 값으로 체크

 

loginok.php

=> $query = "SELECT * FROM member WHERE userid = '$userid' and userpw = password('$userpw') ";

$row = mysqli_fetch_array($result);

$_SESSION['userid'] = $row['userid'];

세션에 로그인 ID 저장

echo " <script>location.href='login.php';</script> ";

echo를 통해 login.php로 주소를 변경하여 돌려보냄

 

logout.php

session_destroy();

=> 세션 삭제후 echo를 통해 login.php로 주소를 변경하여 돌려보냄

 

* 취약한 코드

loginok.php에서는 if($num) if문으로 일치하는 자료수가 1이상이면 로그인된것으로 판단함

추가 인증 코드가 없다

 

취약한 코드를 이용한 인증우회시도

' or 1=1 -- 또는 ' or 1=1 # 을 입력한다.

 

HTTP는 연결을 유지하지 않는 프로토콜이다 (*ssh는 연결을 유지함)
이 때 연결을 유지하는 역할을 하는 것이 쿠키와 세션

세션 : 서버에 저장됨. 인증에 성공시 인증정보를 저장하고, 고유한 세션ID를 클라이언트에 보냄
파일시스템, 메모리, 데이터베이스 등에 정보를 저장한다
유효기간은 서버에서 제어한다
PHP에서 $_SESSION 슈퍼 글로벌 변수를 이용하여 세션 데이터에 접근

쿠키 : 클라이언트에 저장됨. 이전에는 인증정보를 저장했으나 보안이슈가 있어, 이제는 세션ID나 중요하지 않은 정보만 저장
서버가 보내준 정보를 쿠키에 저장하고 http 헤더에 붙여서 서버로 전송한다
클라이언트가 수정가능하므로 보안에 주의해야 하고, 유효기간을 설정할 수 있다
주로 팝업창이나 장바구니로 활용

 

php의 세션 함수
session_unset(): 모든 세션 변수를 제거
unset($_SESSION['변수명']): 특정 세션 변수를 제거
session_destroy(): 세션을 종료하고 세션 데이터를 삭제
session_id(): 현재 세션 ID를 반환
session_regenerate_id(): 새로운 세션 ID를 생성하고 현재 세션을 재생성 (세션 하이재킹 방지)
session_name(): 현재 세션의 이름을 반환하거나 설정 (디폴트는 PHPSESSID)
session_set_cookie_params(): 세션 쿠키의 파라미터를 설정 (lifetime, path, domain, secure, httponly)

session_set_cookie_params([
'lifetime' => 3600,                     //세션연결시간
'path' => '/',                               //쿠키경로
'domain' => 'domain.com',
'secure' => true,                       //https에서만 쿠키전송
'httponly' => true ]);                  //javascript로 쿠키 접근 금지

session_status(): 현재 세션의 상태를 반환
session_encode(): 현재 세션 데이터를 직렬화한 문자열 반환
session_decode(): 직렬화된 세션 데이터를 읽어 현재 세션 데이터로 복원
session_save_path(): 세션 데이터의 저장 경로를 반환 또는 설정
session_write_close(): 현재의 세션 데이터를 저장하고 세션을 종료
session_gc(): 세션 데이터의 가비지 컬렉션을 수행

 

 

클라이언트가 서버의 특정 파일(session_start() 함수가 존재하는)을 요청할 경우
1. 쿠키값이 없으면 서버에 웹데이터 전송
2. 서버는 sesssion_start 함수에 의해 세션의 랜덤문자열을 생성하여 저장한다
3. 클라이언트에게 http 헤더에 생성한 랜덤문자열을 전송
4. 클라이언트는 랜덤문자열을 쿠키로 저장
5. 클라이언트는 매 요청시 http 헤더에 서버가 전송해준 랜덤문자열을 담아 보낸다
6. 서버는 쿠키값을 세션디렉터리에서 확인 (기본 세션디렉터리 : /var/lib/php/session)

 

서버에 있는 세션 디렉토리 전부 지운 후에 php 파일 접속 후 확인

$ sudo ls /var/lib/php/session
sess_tlgsncupgoj9nr1kihjmnvq8q0

클라이언트에서 확인한 쿠키 정보 [{"domain":"192.168.100.10","hostOnly":true,"httpOnly":false,"name":"PHPSESSID","path":"/","sameSite":"unspecified","secure":false,"session":true,"storeId":"0","value":"tlgsncupgoj9nr1kihjmnvq8q0"}]

 

기존에 사용하던 쿠키에디터가 복사만 되고 수정이 안돼서https://chromewebstore.google.com/detail/easy-cookie-editor/lidhbccbajehjnpfjpnamoiemcnhhnki 다른 확장프로그램 사용

 

 

새로 테스트

세션 디렉토리를 삭제하고 burp 프로그램으로 확인하면 Request에는 SESSID가 없고 Response로 받는다

 

$ sudo ls /var/lib/php/session
sess_pmbdi0nbknadtkdc7ec8v9hiih

서버에도 동일한 세션id로 파일이 생성된것이 확인됨

 

페이지를 새로고침하면, Request에도 SESSID가 셋팅된 것이 확인된다.

 

# cat sess_tklman2lc71lnk1dqsa09r4et0
userid|s:5:"admin";username|s:5:"admin";

      |    |  |        |    └;변수끼리 구분

      |    |  |       "값"

      |    |  5 바이트수

      |    s 문자열

세션변수명

 

+ 크롬 시크릿창에서 페이지를 다시 열 경우, 같은 페이지임에도 불구하고 기존 세션이 아닌 새로운 세션이 생성된다.

 

세션하이재킹

Burp 에서 셋팅하면 된다는데 버전이 높아져서 안먹히는 것 같다고 확인해보신다고 하심

'정보보안' 카테고리의 다른 글

정보보안8 1차시  (0) 2024.11.09
정보보안7 8차시  (0) 2024.11.03
정보보안7 5차시  (0) 2024.10.19
정보보안7 4차시  (0) 2024.10.13
정보보안7 3차시  (0) 2024.10.12