본문 바로가기

개발과제/보안추가

[노말틱 모의 해킹 취업반 개발과제 (1)] 보안 관련해서 보완 하기

안녕하세요 제가 개발과제 2주 차 2번까지

즉 로그인 페이지까지 만들었습니다.

 

그런데 코딩 하면서 보안상 문제가 있더라고요!

 

그래서 그 보안을 지키기 위해 점차 고쳐 나가겠습니다.

아마 지금은 1이고 다음에 만들면서 보안 문제가 보일 때마다 추가하겠습니다

 

되도록이면 만들면서 보안 지키겠습니다!

.

.

.

시작하죠

 

우선 sql injection의 공격을 피하기 위해

mysqli_real_escape_string() 적용시키겠습니다!

 

sql injection은 간단히 말해 저희가 sql문을 작성해 보내는데 평범한 'rerange' 같은 문자가 아닌

DROP TABLE 이렇게 sql 문을 적어서 제 데이터베이스에 악영향을 끼치게 하는 공격입니다.

 

 

https://www.youtube.com/watch?v=Xgb4LhqX4PU&list=PLuHgQVnccGMA5836CvWfieEQy0T0ov6Jh&index=17 

참고는 여기서 했습니다

 

 

 

 

ID에 '; DELECT FROM LOGIN_INFO WHERE id = 'rerange2'; --

이렇게 작성해 보겠습니다.

 

그럼

$sql = "SELECT * FROM LOGIN_INFO WHERE id='$login_id' AND pw = '$login_pw'";  이 명령어 들어갈 때

 

$sql = "SELECT * FROM LOGIN_INFO WHERE id=' '; DELECT FROM LOGIN_INFO WHERE id = 'rerange2'; --AND pw = '$login_pw'";

 

이렇게 실행하게 됩니다 --는 뒤에 있는 명령어 주석 처리하는 것이죠!

 

이렇게 되면 id 찾고 난 뒤에 id가 rerange2인 것을 삭제하게 되는 것이죠..

 

물론.. 이런 공격자에게 제 데이터베이스 이름과 테이블 이름, 필드명( id )을 알려 주면 안 됩니다!

그냥 이 예시는 이런 공격이 가능하다는 것만 보면 될 거 같습니다!

.

.

.

 

phpmyadmin은 이런 sql injection 공격에 보호 모드가 켜져 있어서 자동으로 보호가 됩니다.

 

그래도 완벽하게 보호는 못합니다! 그래서 mysqli_real_escape_string()을 추가하겠습니다

 

저희가 sql문을 처리하는 php문으로 가겠습니다.

 

process_login.php에 $login_id = $_POST['id']하고 $login_pw = $_POST['pw'] 보이 실 겁니다.

 

이걸 고치겠습니다

 

mysqli_real_escape_string() 함수는 '' 나 "" 이거나 ; 이러한 것을 문자 치급하게 하는 것입니다!

간단하게 sql문을 악용으로 넣고 실행하지 못하게 막습니다.

문법은 mysqli_real_escape_string([데이터베이스 연결],[데이터]); 입니다.

 

 

//POST로 전달된 정보 받기
    $login_id = mysqli_real_escape_string($conn,$_POST['id']);
    $login_pw = mysqli_real_escape_string($conn,$_POST['pw']);

 

 

이러면 이제 id와 pw에 sql 문법으로 장난쳐도 상관없게 됩니다!

.

.

.

그리고 세션 ID를 로그인할 때마다 새로운 ID로 발행되게 하겠습니다!

이는 세션 하이재킹 공격을 방지하기 위함입니다.

간단하게 설명드리자면 해커가 쿠키에 저장된 세션 ID를 탈취한 후 해당 ID로 사용자의 세션을 탈취가 가능합니다.

 

그러니 ID를 자동으로 갱신되게 이를 방지하겠습니다.

 

함수는 session_regenerate_id() 사용하겠습니다.

로그인 할때마다 자동으로 갱신되게 하겠습니다.

 

//쿼리 실행 결과 확인
    if(mysqli_num_rows($result) > 0 ) { 
        //로그인 성공
        session_regenerate_id(); //ID 자동 갱신
        $row = mysqli_fetch_array($result);
        $_SESSION['login_id'] = $row['id'];
        header("Location: only_login.php");
    }

 

됐습니다. 한 번 혹시 모르니 잘되는지 안되는지 실행해보고 마치겠습니다

 

보안은 중요하니깐요!

 

 

HAPPY..?

 

잘 되네요! 이렇게 일단 보안 코딩 마치도록 하겠습니다!

 

되도록이면 만들면서 보안 문제를 해결하겠으나

 

만약 놓친 게 있으면 이렇게 추가로 포스팅하겠습니다