[Webhacking.kr] old-24 (PHP extract 함수 취약점 활용)

728x90
반응형

1. 서론

본 포스팅 시리즈는 webhacking.kr의 문제 풀이를 하면서 정리한 자료이다.
필자가 풀이한 방법들이기 때문에 완벽하지 않을 수도 있다는 점을 참고 바란다. (지적과 조언은 언제나 환영이다)

이번 문제는 old-24, PHP extract 함수의 취약점 활용이 필요한 문제이다.

2. 본론

client ip 부분에 접속자의 ip 주소가 나타난다. 위 이미지의 경우 필자의 ip 주소가 노출되어있어 이미지상에선 제거하였다.

이번 문제를 처음 접속하면 이러한 화면을 볼 수 있다. client ip라는 항목으로 접속자의 ip 주소가 보이고, 바로 아래에는 접속자의 브라우저 정보가 보인다. 그리고 표 아랫쪽에 "Wrong IP!"라는 문자열이 눈에 띈다. 아마 ip 주소를 조작해야하는 문제인 듯하다.

이건 이번 문제의 소스코드이다. 일단 문제 해결조건은 $ip 변수이 값이 "127.0.0.1"이 되도록 하는 것이다. 그럼 $ip 변수의 값이 업데이트 되는 부분들을 하나하나 살펴보도록 하자.

우선 한가지 눈에 띄는 점은 처음 $ip 변수가 선언될 때 $ip 변수에 $REMOTE_ADDR이라는 변수의 값을 대입하고 있는데,
여기서 중요한 부분은 $REMOTE_ADDR은 $ip 변수가 선언되기 이전에 선언된적이 없던 변수다. 그렇다면 이 변수는 어디서 갑자기 튀어나온 것일까?

그 해답은 바로 이 extract 함수에 있다. extract 함수는 Array 내의 각 키값들을 변수화 시켜주는 함수인데
예를 들어,

$A = array("key1" => 1, "key2" => 2, "key3" => 3);
extract($A);

echo $key1;  // 출력값: 1
echo $key2;  // 출력값: 2
echo $key3;  // 출력값: 3

이런식으로 각 키 값들이 독립적인 변수로 만들어지게 된다.
그런데 저 extract 함수에 인자로 $_SERVER, $_COOKIE array를 넣었다는건, 저 Array 내의 각 키값들이 독립적인 변수로 선언된다는 뜻이다. 여기서 우리는 공격점을 찾을 수 있다.

$_SERVER 내의 "REMOTE_ADDR"이 접속자의 ip 주소가 저장된 키값인데 이 키값도 마찬가지로 독립적인 변수로 만들어졌다. 하지만 문제는 직접적으로 저 값을 우리가 원하는대로 수정하지는 못한다. 하지만 결정적으로 "extract($_SERVER)" 다음에 "$extract($_COOKIE)"가 나왔기 때문에 우리는 이 문제를 해결 할 수 있는 방법이 있다. 쿠키는 우리가 인터럽터를 이용해 패킷내의 HTTP 헤더를 직접 수정하여 조작할 수 있기 때문에 만약에 "REMOTE_ADDR"이라는 이름의 쿠키 안에 우리가 원하는 값을 넣고 포워드 한다면, "extract($_SERVER)"로 인해 선언되었던 $REMOTE_ADDR이 "extract($_COOKIE)"로 인해 우리가 넣은 값으로 오버라이팅이 될 것이다.

위 방법을 수행하기 위해선 인터럽터가 필요하므로 Burp Suite를 이용하여 공격해보도록 하겠다.

필자의 PHPSESSID 쿠키 값은 감췄다. 참고 바란다.

Burp Suite를 이용해 HTTP 헤더 쿠키 부분에 "REMOTE_ADDR"이라는 쿠키를 추가하고 일단 테스트 문자열을 넣고 포워드 해보았다.

그랬더니 우리가 의도한대로 "test"라는 문자열이 client ip 항목에 출력되었다. 이제 우리는 이걸 이용해 정규식 필터를 통화한 후에 "127.0.0.1"이라는 문자열이 될 수 있는 문자열을 이 쿠키에 넣어 보내면 문제를 해결 할 수 있을 것이다.

1. ".."은 "."으로 치환
2. "12"는 ""으로 치환
3. "7."는 ""으로 치환
4. "0."은 ""으로 치환
위 순서대로 필터링이 이루어 지기 때문에

"112277....00....00....1" 이렇게 하면 필터링 후 "127.0.0.1"이 남게 된다.

결과는 성공적.

728x90
반응형