it-swarm-korea.com

XSS를 통해 PHP에서 $ _SESSION 변수 변경?

내가 말하는 것이 의미가 있는지 확실하지 않지만 대상 외부에서 $ _SESSION 변수를 변경할 수 있습니까 PHP 스크립트?

우리 스크립트 중 하나는 $ _SESSION 변수를 사용하는데 $ _POST 변수가 다음과 같이 외부로부터의 조작에 취약한 지 확실하지 않습니다.

4
Steve

이에 대한 대답은 애플리케이션이 SESSION 데이터를 채우기 위해 GET 또는 POST 데이터를 사용하는지 여부에 따라 다릅니다.

예를 들어 사용자가 다음과 같이 로그인 할 때 $ _SESSION [ 'username']이 채워집니다.

$_SESSION['username'] = $_GET['login-username']

XSS는 클라이언트를 소유하므로 login-username 변수의 내용을 수정하여 세션 변수를 제어 할 수도 있습니다.

그러나 $ _SESSION 전역 변수 배열은 서버 측에서만 수정할 수 있음을 아는 것이 중요합니다.

8
Chris Dale

$_SESSION 변수는 클라이언트로 전송되지 않습니다. 서버에만 저장됩니다. 사용자는 PHP가 해당 $_SESSION 변수를로드하는 데 사용하는 ID 만받습니다.

따라서 XSS 만 사용하면 $_SESSION 변수를 변경할 수 없습니다.

설명

코드에서 $_SESSION['password'] = $var와 같은 줄을 찾을 수없는 경우 XSS는 $_SESSION['password']의 값을 변경할 수 없습니다.

1
Mike

마이크가 좋은 대답을했습니다. 나는 그가 왜 낙선되었는지 모르겠다. (그래서 나는 그를 다시 찬성했다). 방금 가입해서 언급 할 수 없지만, 마이크가 좋은 지적을하고 있기 때문에 그 이유를 설명하려고합니다.

원래 질문은 다음과 같습니다.

우리 스크립트 중 하나는 $ _SESSION 변수를 사용하는데 $ _POST 변수가 다음과 같이 외부로부터의 조작에 취약한 지 확실하지 않습니다.

"사용자가 $ _COOKIE, $ _POST 및 $ _GET으로 할 수있는 것처럼 HTTP 요청에서 직접 $ _SESSION을 조작 ​​할 수 있습니까?"라는 질문으로 해석합니다.

즉, PHP는 문자 그대로 요청 헤더 또는 본문에서 사용자 데이터를 가져와이 세 개의 슈퍼 글로벌에 숨 깁니다. 그러나 $ _SESSION에 대해 동일한 작업을 수행할까요?

대답은 (대부분의 경우) 확실히 아니오입니다. PHP의 기본 세션 저장소는 "file"입니다. 즉, 세션이 직렬화되어 로컬 파일 시스템의 파일에 기록됩니다. 사용자는 세션의 내용을 직접 조작 할 수 없습니다.

이제 다른 사람들이 위에서 지적했듯이 다음과 같이하면 :

$_SESSION['foo'] = $_POST['bar'];

그러면 사용자는 $ _POST에 영향을 주어 간접적으로 $ _SESSION에 영향을 미칠 수 있습니다! 물론 이것은 사실이지만 나는 이것이 질문의 핵심이라고 보지 못했습니다. 사용자 입력을 삭제하지 않으면 사용자 무엇이든 영향을 미칠 수 있음. 요점은 어떤 입력이 삭제되지 않았는지 확인하고 사용하기 전에 삭제하는 방법을 아는 것입니다.

위의 Karrax의 비판은 다음과 같습니다.

XSS가 세션 변수에서 사용되는 클라이언트의 값을 변경하면 XSS를 사용하여 $ _SESSIOn을 성공적으로 변경 한 것입니다.

물론 이것은 사실이지만 질문의 핵심은 아닙니다. 당신의 논리에 따라 "악의적 인 사용자 입력은 달에 로켓을 발사 할 수 있습니다."라고 말할 수도 있습니다. 이것은 진실한 진술 NASA의 누군가가 로켓 제어 응용 프로그램에서 사용자 입력을 삭제하는 것을 잊었다면, 이것은 PHP의 고유 한 위험이 아니라 NASA의 소프트웨어 문제입니다.

불행히도, PHP는 어떤 슈퍼 글로벌이 오염되지 않았는지, 어떤 슈퍼 글로벌이 오염되었는지를 명확하게하지 않습니다. 차이점을 이해하려면 HTTP 프로토콜과 PHP 런타임이 HTTP 요청 및 응답주기를 처리하는 방법에 대한 중간 수준의 이해가 필요합니다.

1
Mark E. Haase