해당 문제에 들어가보면 아래와 같은 소스코드를 볼 수 있다.
<?php
error_reporting(0);
include('flag.php');
$message = "<img src='cat.jpg' height=400><!-- is_debug -->";
if (isset($_GET['is_debug']))
{
highlight_file(__FILE__) and die();
}
else
{
$qs = $_SERVER['QUERY_STRING'];
if(!(substr_count($qs, '_') > 0) && !(substr_count($qs, '%')> 1))
{
$cmd = $_GET['c_m_d'];
if(!preg_match('/[a-z0-9]/is', $cmd)){
system("/sandboxed_bin/".$cmd);
}else{
echo $message;
die();
}
}
echo $message;
die();
}
?>
php 샌드박스 류의 문제인데 내가 우회해야할 필터는 두가지가 존재했다.
먼저 c_m_d라는 파라미터를 통해 실행할 명령어 문자열 값을 전달해야하는데 QUERY_STRING으로 가져온 값에서 _값을 필터해버린다. 이는 c+m+d요런식으로 파라미터명을 넣어주면 우회가 된다. QUERY_STRING으로 가져왔을때는 c+m+d값이지만 php에서 파라미터명에 +값이 존재하면 이 값을 _로 인식하기때문에 실제로 c_m_d 파라미터로 값을 넣어줄 수 있다.
이제 두번째는 내가 입력한 명령어 값이 non-alphanumering 상태여야 한다. 특문밖에 쓸 수 없는 상황이었는데 일단 /sandboxed_bin/ 디렉토리 내에 존재하는 명령어가 뭔지 몰라 ?를 하나씩 늘려가면서 요청하다보니 ??? 일때만 응답이 엄청 늦게오는걸로 보아서 뭔진 모르지만 3글자 짜리 명령어가 하나이상 존재하는 것 같았다. 단순히 명령어만 들어갔을때는 응답만 엄청 오래걸릴 뿐 명령어실행결과를 따로 볼 수가 없어서 인자로로 ???%20*요런식으로 날려보니 파일 내용이 읽혔다. 그래서 cat 명령어가 먹히고 있구나 생각했꼬 아래와 같은 식으로 파일명을 하나씩 늘려가면서 찾아보니 플래그가 나왔다.
'CTF > Writeup' 카테고리의 다른 글
Hack.lu CTF 2018 BabyReverse (0) | 2018.10.25 |
---|---|
InCTF 2018 TorPy (0) | 2018.10.08 |
InCTF 2018 S3cur3 Bank (0) | 2018.10.08 |
InCTF 2018 The Most Secure File Uploader (0) | 2018.10.08 |
D-CTF Quals 2018 secops (0) | 2018.09.26 |