PHP 의 session 은 안전 합 니까?

PHP 를 개발 한 지 이렇게 오래 되 었 는데 도 정말 안전 에 관심 을 가 진 적 이 없다.매번 프로젝트 를 완성 하 는 것 을 위주 로 한다.최근 에 인터넷 에서 안전 에 관 한 글 을 보 았 는데 보고 나 서 야 자신의 이전 프로젝트 에 매우 큰 안전 구멍 이 존재 한 다 는 것 을 알 게 되 었 다.그래서 하나의 프로젝트 를 골 라 테스트 를 했 는데 쉽게 방법 에 들 어 갈 수 있 었 다.여기 서 나 는 내 가 쓴 테스트 의 예 를 공유 하여 PHP 의 session 이 어떻게 안전 하지 않 은 지,그리고 프로젝트 에서 어떻게 안전성 을 강화 하 는 지 설명 할 것 이다.
session 의 원리 체제 에 대해 인터넷 에 좋 은 글 이 많이 있 으 니 우 리 는 스스로 찾 아 볼 수 있다.테스트 용 예 를 직접 공유 하 겠 습 니 다.
이 테스트 의 예 는 주로 로그 인 페이지 입 니 다.로그 인 에 성공 한 후에 비밀 번 호 를 수정 할 수 있 습 니 다.이렇게 간단 한 기능 입 니 다.
화면 은 아래 와 같다.

우선 프로젝트 입구 에 함수 session 을 사용 합 니 다.start()가 session 을 열 었 습 니 다.이렇게 하면 클 라 이언 트 가 요청 을 할 때 신분 표지 인 SessionID 가 생 긴 다.쿠키 를 통 해 클 라 이언 트 에 저 장 됩 니 다.클 라 이언 트 와 서버 의 매번 통신 은 이 SessionID 로 신분 식별 을 합 니 다.
로그 인 에 성공 하면 사용자 id,사용자 이름 을 session 에 저장 합 니 다.

$_SESSION[‘userid'] =   id
$_SESSION[‘uname'] =    
앞으로 모든 조작 은 판단 을 통 해$SESSION[userid]사용자 가 로그 인 했 는 지 확인 하기 위해 존재 합 니까?코드 는 다음 과 같 습 니 다:

if(isset($_SESSION['userid'])) return true;
암호 인 터 페 이 스 를 수정 하 는 호출 은 ajax 를 통 해 이 루어 집 니 다.  post 방식 으로 데 이 터 를 서버 로 전송 합 니 다.

$.post("  *******",
  {
     oldpass:oldpass,
     newpass:newpass,
     userid:uid,
  },
  function(data){
     data = eval('(' +data+ ')');
     $('.grant_info').html(infos[data.info]).show();
  }
);
주의 하 세 요.저 는 이 코드 를 html 페이지 에 썼 습 니 다.그래서 html 코드 를 보면 인터페이스 주 소 를 알 수 있 습 니 다.
비밀 번 호 를 수정 하 는 인 터 페 이 스 는 이렇게 이 루어 집 니 다.먼저 사용자 가 로그 인 할 지 여 부 를 판단 하고 로그 인 을 해 야 비밀 번 호 를 수정 할 수 있 습 니 다.
테스트 사례 의 실현 방향 은 아마 위 에서 소개 한 것 과 같다.
Session ID 로 공격
1.먼저 SessionID 를 얻 습 니 다.물론 공격 자가 이 표 지 를 얻 는 방식 이 많 습 니 다.제 수준 이 제한 되 어 있 기 때문에 제 가 여기 서 어떻게 얻 는 지 에 대해 소개 하지 않 습 니 다.이 항목 을 정상적으로 방문 한 다음 브 라 우 저 를 통 해 SessionID 를 보고 합 법 적 인 사용자 표 지 를 얻 는 것 을 모 의 할 수 있 습 니 다.요청 헤더 에서 이 ID 를 볼 수 있 습 니 다.

 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
Cookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7;
Host: ******
Referer: ******
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0 
session ID 를 받 은 후 이 사용자 가 로그 인 에 성공 하면 서버 의 session 에 이 사용자 의 정보 가 있 습 니 다.
2.SessionID 를 가 져 온 후 공격 자가 암 호 를 수정 하 는 인 터 페 이 스 를 알 고 있다 면 이 사용자 의 암 호 를 직접 수정 할 수 있 습 니 다.공격 자가 아직 인터페이스 주 소 를 얻 지 못 했다 면 페이지 코드 를 통 해 인터페이스 주 소 를 찾 을 수 있다.다음 명령 을 사용 할 수 있 습 니 다.

#curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7"     
위 에서 말 했 듯 이 이 예 에서 ajax 코드 는 html 페이지 에 쓰 여 있 기 때문에 이 페이지 에서 인터페이스 주 소 를 볼 수 있 습 니 다.
부분 html 코드 는 다음 과 같 습 니 다.

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
……
var uid = $(".userid").val();
$.post("/User/User/modifypass_do",
     {
        oldpass:oldpass,
        newpass:newpass,
        userid:uid,
     },
    function(data){
      data = eval('(' +data+ ')');
      $('.grant_info').html(infos[data.info]).show();
    }
 );
……
<span><input type="password" name="oldpass" id="textfield_o" placeholder="   "></span>
<span><input type="password" name="newpass" id="textfield_n" placeholder="   "></span>
<span><input type="password" name="confirmpass" id="textfield_c" placeholder="    "></span>
<input type="button" class="btn_ok" value="    " />
3.인 터 페 이 스 를 얻 은 후 curl 시 뮬 레이 션 post 를 통 해 데 이 터 를 보 내 비밀 번 호 를 수정 할 수 있 습 니 다.
명령 은 아래 와 같다.

# curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" -d oldpass=111111 -d newpass=000000 -d userid=  id     
이 사용자 가 로그 인 했다 면 공격 자 는 상기 명령 을 실행 하여 사용자 의 비밀 번 호 를 변경 할 수 있 습 니 다.
해결 방법
상기 방식 의 공격 에 대해 우 리 는 검증 방식 을 복잡 하 게 함으로써 안전성 을 강화 할 수 있다.그 중 하 나 는 요청 헤더 에 있 는 User-agent 항목 을 이용 하여 안전성 을 강화 하 는 것 이다.

 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
Cookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7;
Host: ******
Referer: ******
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0
프로젝트 시작 할 때 처음에 우 리 는 session 만 썼 다.start()함수 로 session 을 엽 니 다.지금 우 리 는 sessionstart()아래 에 이 코드 를 추가 합 니 다.

$_SESSION[‘User_Agent'] = md5($_SERVER[‘HTTP_USER_AGENT']);
그리고 로그 인 여 부 를 판단 할 때마다 판단 조건 을 다음 과 같이 추가 합 니 다.

If(isset($_SESSION[‘userid']) && $_SESSION[‘User_Agent'] == md5($_SERVER[‘HTTP_USER_AGENT'])){
    return true;
}
이렇게 하면 상술 한 간단 한 공격 을 피 할 수 있다.
요약:
물론 실제 상황 에서 의 공격 은 이렇게 간단 하지 않다.먼저 SessionID 를 얻 는 것 이 비교적 어렵다.그 다음 에 서버 와 상호작용 하 는 코드 를 최대한 암호 화하 면 상기 상황 을 피 할 수 있다.우리 가 두 번 째 로 코드 를 수정 한 후에 공격 의 복잡 도 를 증가 시 킬 수 있 고 공격 을 근절 할 수 없다.공격 방식 은 다양 하 다.여 기 는 간단 한 방식 일 뿐 하나의 사고방식 만 제공 하지만 원 리 는 같다.실제 상황 에서 실제 상황 에 따라 우리 코드 의 안전 정 도 를 강화 할 수 있다.
여 기 는 단지 자신 이 업무 중 에 부 딪 힌 문 제 를 공유 할 뿐,벽돌 을 던 져 옥 을 끌 어 올 릴 권리 가 있 으 니,여러분 들 이 더욱 깊이 공부 하 시기 바 랍 니 다.

좋은 웹페이지 즐겨찾기