본문 바로가기

보안공부/Webhacking.kr 풀이

webhacking.kr 44번 문제 풀이

44번 문제에 들어가면 다음과 같은 화면이 반겨준다.

아무거나 입력하고 submit을 누르니 hello! [입력값]의 형태로 출력한다.

동작 원리를 분석하기 위해 view-source를 누르면 다음과 같은 코드를 확인할 수 있다.

<?php
  if($_GET['view_source']){ highlight_file(__FILE__); exit; }
?><html>
<head>
<title>Challenge 44</title>
</head>
<body>
<?php
  if($_POST['id']){
    $id = $_POST['id'];
    $id = substr($id,0,5);
    system("echo 'hello! {$id}'"); // You just need to execute ls
  }
?>
<center>
<form method=post action=index.php name=htmlfrm>
name : <input name=id type=text maxlength=5><input type=submit value='submit'>
</form>
<a href=./?view_source=1>view-source</a>
</center>
</body>
</html>

form input에서 받아온 값의 첫 번째부터 다섯 번째의 문자까지를 $id에 넣어주는 모양이다.

처음에 저 중괄호까지 처리해야하는줄 알고 애썼다. (나 자신이 PHP코딩해본 사람이 맞나 싶었다.)

저 중괄호의 의미를 모르시는 분은 [사악미소의 현대마법의 공방 - [PHP] 변수 출력 - { } 중괄호의 사용]를 봐주세요.

 

암튼 이어서 해보자면 우리는 5글자만으로 ls를 실행해야 하는 상황이다.

처음에 나는 단순히 ';ls만 하면 될 줄 알았다.

 

Joon : 본인 방금 ';ls 로 플래그 따는 상상함.

Webhacking.kr : 하지만 어림도 없지!

이때 깨달았다. ls가 필터링된다는 사실을.

아무것도 출력되지 않는다는 것을 봐서 ';는 필터링되지 않았다는것을 알 수 있다.

 

리눅스 터미널에서 single quotation을 포함한 명령을 입력해도 없는것으로 인식한다는 것을 활용하여 이 필터링을 우회할 수 있었다.

 

';는 그대로 가져가고 ls 사이에 '를 추가하여 ';l's를 만들었고, 이를 입력했더니 놀랍게도 ls의 결과가 나왔다.

찾은 플래그 파일을 주소에 입력하여 들어가보았더니 플래그가 나왔다.

CLEAR!

 

Off the record


니시노 카나의 노래가 좋으신건가요 커버가 좋으신건가요? ㅎㅎ

아마 문제 풀이에 성공하신분은 이 문구를 이해하실 수 있으실겁니다 :)