일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- sql injection
- aslr
- cookie
- base32
- 카이사르 암호
- burpsuit
- assembly
- Masonic Cipher
- AVR
- JavaScript
- reversing
- php_extract
- Mail Header injection
- BASE64
- Pigpen Cipher
- Qrcode
- sha1
- base16
- vigenere cipher
- 비즈네르 암호
- Web Hacking
- 시저 암호
- Navajo alphabet
- Linux
- Python
- overthewire
- Fortran 90
- Caesar Cipher
- Javscript
- webhacking
- Today
- Total
My Drive
webhacking #24 본문
webhacking #24.
페이지 소스를 보니 index.phps에 소스가 있다고 하여
index.phps를 들어갔다.
php부분을 보면,
우선 php의 extract함수가 사용된다.
extract($array) 함수는 인자로 배열타입의 변수를 받는다.
그리고 배열속의 키값들을 변수화시켜주는 역할을 하는 함수이다.
예를 들어, a라는 배열이
$a[i] = 100;
$a[j] = 200;
위와 같으면,
extract($a);
를 했을 경우,
$i = 100;
$j = 200;
과 같은 결과가 나타난다.
extract함수는 $_GET, $_POST, $_SERVER 같은 전역변수에 사용하게 되면 보안상의 문제가 있다.
(이 문제에서 볼 수 있다.)
위에서는 $_SERVER와 $_COOKIE를 extract의 인자로 넣어주고 있는데,
$_SERVER는 아래와 같은 정보가 담겨있는 배열이고
$_SERVER['DOCUMENT_ROOT'] = 현재 사이트가 위치한 서버상의 위치 (ex. webappinclude)
$_SERVER['HTTP_ACCEPT_ENCODING'] = 인코딩 방식 (ex. gzip, deflate)
$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 언어 (ex. ko)
$_SERVER['HTTP_USER_AGENT'] = 사이트 접속한 사용자 환경 (ex. Mozilla4.0(compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705)
$_SERVER['REMOTE_ADDR'] = 사이트 접속한 사용자 IP (ex. 123.123.123.123)
$_SERVER['SCRIPT_FILENAME'] = 실행되고 있는 위치와 파일명 (ex. webappincludeindex.php)
$_SERVER['SERVER_NAME'] = 사이트 도메인 (ex. WWW.X2CHI.COM)
$_SERVER['SERVER_PORT'] = 사이트가 사용하는 포트 (ex. 80)
$_SERVER['SERVER_SOFTWARE'] = 서버의 소프트웨어 환경 (ex. Apache1.3.23 (Unix) PHP4.1.2 mod_fastcgi2.2.10 mod_throttle3.1.2 mod_ssl2.8.6 OpenSSL0.9.6c)
$_SERVER['GATEWAY_INTERFACE'] = cGI 정보 (ex. CGI1.1)
$_SERVER['SERVER_PROTOCOL'] = 사용된 서버 프로토콜 (ex. HTTP1.1)
$_SERVER['REQUEST_URI'] = 현재페이지의 주소에서 도메인 제외 (ex. index.phpuser=&name=)
$_SERVER['PHP_SELF'] = 현재페이지의 주소에서 도메인과 넘겨지는 값 제외 (ex. index.php)
$_SERVER['APPL_PHYSICAL_PATH'] = 현재페이지의 실제 파일 주소 (ex. Dwebapp)
$_COOKIE는 페이지에 존재하는 쿠키가 담벼있는 배열이다.
$_SERVER['REMOTE_ADDR'] = 사이트 접속한 사용자 IP (ex. 123.123.123.123)
$_SERVER['HTTP_USER_AGENT'] = 사이트 접속한 사용자 환경 (ex. Mozilla4.0(compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705)
이 문제에서는 위의 두 가지가 사용된다.
우리가 해 줘야 하는 것은 $ip를 127.0.0.1로 바꿔주는 것이다.
extract($_SERVER)에서
$REMOTE_ADDR = 내 IP
$ip = $REMOTE_ADDR
결국 $ip에는 내 IP주소가 들어간다. 하지만 그 전에 extract($_COOKIE)를 할때,
만약 REMOTE_ADDR이라는 이름을 가진 쿠키가 있다면,
$REMOTE_ADDR = REMOTE_ADDR 쿠키의 값이 되고,
$ip 에는 REMOTE_ADDR 쿠키의 값이 들어가게 된다.
REMOTE_ADDR 라는 이름의 쿠키를 만들 수 있다면 $ip를 조작할 수 있게 되는 것이다.
쿠키값을 127.0.0.7로 바꾸면 위에서 str_replace함수를 이용해 12,7.,0.을 빈칸으로 바꾸고 있으므로 1밖에 남지 않는다.
이를 우회하기 위해 약간 머리를 쓰면
112277..00..00..1 이런 방식으로 우회한 글자를 없앴을 때 원하는 글자가 나오도록 해준다.
'writeup' 카테고리의 다른 글
webhacking #47 (0) | 2014.10.19 |
---|---|
webhacking #54 (0) | 2014.10.16 |
webhacking #16 (0) | 2014.10.13 |
webhacking #17 (0) | 2014.09.29 |
webhacking #15 (0) | 2014.09.29 |