DIMI-CTF exec-me
<?php
if(isset($_GET['source'])){
highlight_file(__FILE__);
exit;
}
$filter = ['system', 'exec', '`', '_', '\'', '"', 'file', 'open', 'read', 'eval', 'pass', 'include', 'require', '=', 'glob', 'dir', '/'];
$exec = $_GET['exec'];
for($i = 0; $i < count($filter); $i++){
if(stristr($exec, $filter[$i])){
die("Filtered");
}
}
eval($exec);
?>
<a href="?source"> View Source </a>
문제 이름을 보니 실행시키는게 주 목적인 문제인거 같다. 코드를 보니 역시나 필터링이 stristr 함수를 이용해 이루어지고 있다.
stristr 함수는 첫번째 인자로 주어진 문자열 속에서 두번째 인자로 주어진 문자열이 존재하는지 찾는 함수다.
www.w3schools.com/php/func_string_stristr.asp
위 사이트에서 더 자세하게 확인할 수 있다.
$filter에 저장된 배열에는 필터링할 대상들이 저장되어 있다. 씨 무슨 다 안된대,,,
저 필터링을 무사히 벗어나 exec라는 이름으로 주어진 파라미터값을 eval 함수로 실행시켰을 때!? exec이 되면 되는거겠찌...?
사용한 익스플로잇 방법은 아래와 같다.
$filter[0](chr(108).chr(115));
$filter[0]은 $filter 배열에 저장된 데이터들 중 첫번째 데이터를 의미하므로 'system' 이 된다.
(와 )는 필터링 목록에 들어가있지 않으므로 그대로 들어간다.
chr() 함수는 안에 들어간 10진수가 가리키는 아스키코드를 문자로 변환해주는 함수다.
chr(108)은 'l'로 바뀌고, chr(115)는 's'로 바뀐다. 'l'과 's'는 문자열을 합쳐주는 . 연산자로 인해 'ls'로 된다.
결국 위의 코드는 'system'('ls');로 바뀌게 된다. php의 특성상 'system'은 system과 똑같게 해석한다.
그러므로 위의 코드를 exec이라는 이름의 파라미터 값으로 넣어주면 eval() 함수로 실행된다.
위 코드대로 입력을 해줘도 되지만 URL 인코딩을 한 후 입력해주는게 더 바람직한 방법일거 같다...!
댓글
이 글 공유하기
다른 글
-
[root-me.org - Web-Server] HTTP - POST
[root-me.org - Web-Server] HTTP - POST
2020.09.15 -
[root-me.org - Web-Server] HTTP - Cookies
[root-me.org - Web-Server] HTTP - Cookies
2020.09.15 -
[root-me.org - Web-Server] HTTP - User-agent
[root-me.org - Web-Server] HTTP - User-agent
2020.09.15 -
[root-me.org - Web-Server] HTTP - Open redirect
[root-me.org - Web-Server] HTTP - Open redirect
2020.09.15