Websec - level5

 

 

 

 

input box에 입력한 값이 q값으로 전달 되며,

 

 

blacklist가 아닌 값이 2개이상 들어오는 것을 \\1으로 해석하므로

q값중 blacklist에 있는 값이 나오기전까지의 부분이 \\1으로서 correct함수의 파라미터로 전달된다.

 

 

correct 함수의 return값이 출력된다.

 


 

 

preg_replace에서 pattern부분의 e modifer의 취약점을 이용하여 이 문제를 해결할 수 있다.

e modifer는 preg_replace의 두번쨰 파라미터인 replacement부분을 실행 시켜준다.

따라서 우리가 입력하는 input box에 적절한 값을 넣어서 php코드로 실행할 수 있다.

 

 

우선 문제에서 힌트를 찾자면

 

 

 

flag.php를 참조해서 php안에 있는 flag를 출력해야 할 것 같다.

 

 

이는 $뒤에 오는 {}안에서 문자열이 실행되는 것을 이용하여 문제를 해결할 수 있다.

{}안에 flag.php를 참조할 수 있는 include나 require를 사용하면된다. include flag.php와 같은 경우 공백이 blacklist에 등록되어 있지만 공백줄바꿈(%0a),%09, /**/등을 이용하여 우회할 수 있다.

 

 

하지만 flag.php를 입력하게되면 flag.php으로 인식하는 것이 아니라 각각의 상수 문자로 인식하게된다. 그래서 그냥 $_GET[]으로 flag.php를 따로 입력해주어서 해결하였고, 이후에 $flag파일을 출력하도록 하면 해결할 수 있다.

 

 

?q=${include%0a$_GET[p]}$flag&p=flag.php

 

 

 

 

 


 

 

$뒤에 오는{}에 함수나 문자열이 실행되는 것 예전에 ~연산자를 이용한 우회한 것과 같은 것을 기술적(?)으로는 알고 있으나 이것이 어떤 과정에 의해서 실행되는지는 알아보아야 할 것 같다.

 

이번 문제는 문제 해결과정을 완벽하게 이해했다기 보다 이전에 사용했던 트릭적인 것을 이것저것 사용하다가 푼 것같다.

 

 

 

+ Recent posts