티스토리 뷰

728x90
반응형

$_GET['id'] = strrev(addslashes($_GET['id']));
$_GET['pw'] = strrev(addslashes($_GET['pw']));

우선 id 와 pw 파라미터를 전부 addslashes 로 먼저 필터링을 해줍니다.

addslahes 에 대해서 잠시 복습해보자면, 인자 값으로 들어온 문자열에서 '(작은따옴표), "(큰 따옴표), \(백슬래시), NUL(널바이트) 와 같은 문자가 오게 되었을 때 해당 문자 바로 이전에 \(백슬래시)를 추가해주는 기능을 하는 함수입니다.

 

아래 예시는 '(작은 따옴표)가 addslashes 함수에 의해서 \(백슬래시)가 추가되어 이스케이핑 되는 모습입니다.

<?php
$str = "Is your name O'Reilly?";

// Outputs: Is your name O\'Reilly?
echo addslashes($str);
?>

 

아무튼 다시 문제의 코드로 돌아와서 addslahes 함수를 수행한 이후에 strrev 라는 함수를 다시 수행합니다.

strrev 함수는 함수 이름 그래도 문자열(string)을 뒤집습니다(reverse).

 

아래 예시를 보겠습니다. Hello world! 가 !dlrow olleH 가 되게 됩니다.

<?php
echo strrev("Hello world!"); // outputs "!dlrow olleH"
?>

 

계속 이어서 다음 코드를 보겠습니다.

if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); 
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

이제 다시 id 와 pw 에 대한 필터링이 주어집니다. 여기서 id 와 pw 는 위 strrev 와 addslashes 함수에 의해 바뀐 값들에 대하여 필터링이 주어지는 것입니다. 필터링은 prob 이라는 단어가 포함되서는 안되고, _(언더바), .(온점), ()(괄호)가 포함되서는 안된다고 합니다.

 

$query = "select id from prob_zombie_assassin where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; 
echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
if($result['id']) solve("zombie_assassin");

그리고 문제는 사용자가 입력한 id 와 pw 파라미터에 대한 최종 변조값을 query 문에 삽입하고 그 결과 값으로 prob_zombie_assassin 이라는 테이블의 id 값으로 존재할 경우 문제가 풀린다고 합니다.

 

이번 문제는 이전에 풀었던 succubus 문제와도 연관이 있다고 생각됩니다. 이번에도 결국에는 \(백슬래시)를 활용해서 풀 수 있을 것 같습니다. 왜냐하면 addslashes 함수로 인해서 백슬래시가 추가될 것이기 때문입니다.

 

한번 큰따옴표를 넣어보겠습니다.

select id from prob_zombie_assassin where id='"\' and pw='#'

큰 따옴표를 넣게 되면 addslahes 함수에 의해서 \(백슬래시)가 추가되겠죠. 그리고 strrev 함수에 의해서 반전될 것입니다. 그 과정을 나열해보겠습니다.

  • " (id 파라미터 input 값)
  • \" (addslashes)
  • "\ (strrev)

위 같은 과정에 의해서 "\ 가 query 문에 삽입되어서 위와 같은 구문이 만들어집니다. 그리고 추가로 pw 에 # 값을 입력해줬습니다. succubus 문제와 똑같습니다. 이번에도 id 에 해당하는 값은 "\' and pw = 까지가 모두 id 값에 해당하게 됩니다.

 

그리고 동일하게 pw 에 query 구문이 True(참)이 될 수 있는 구문만 넣어주면 문제는 해결되겠습니다.

select id from prob_zombie_assassin where id='"\' and pw='||1#'

 

그리고 당연하겠지만 pw 파라미터의 값도 strrev 함수에 의해서 반전되니깐 반대로 써줘야합니다. URL 페이로드는 아래와 같습니다.

?id="&pw=%231||

(%23 은 # 을 URL 인코딩 해준 것입니다.)

 

위와 같이 URL을 입력하고 페이지를 전송하면 아래와 같이 문제가 풀린 것을 확인하실 수 있습니다.

728x90
반응형
댓글