
뭔가 입력창이 있다. ‘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>
중요하게 보아야 될 부분은 이 부분이다.
system("echo 'hello! {$id}'");
input태그에서 $id값을 입력받고, 이 $id값을 system함수를 실행하여 'hello! {$id}' 를 브라우저에 출력한다.
system 함수는 서버의 명령어를 실행하는 것이므로 $id값을 이용해 리눅스 명령어를 injection하는 Command Injection 문제다.
익스플로잇
echo 'hello! {$id}'
{$id}여기서 적당히 작은 따옴표(’)를 닫아주고 ls 명령을 실행하는 것이 핵심이다.
이떄, 이 부분을 조심해야된다.
$id = substr($id,0,5);
이 부분 때문에 개발자 도구를 켜서 maxlength를 늘리는 것도 의미가 없다.
따라서, 반드시 5자 이내에 공격 페이로드를 끝내야 된다. 우분투에서 어떻게 해야 ls가 실행되는지 실험해보자.
시도 1
';ls
그럼 최종 결과는 이렇게 된다.
echo 'hello! ';ls'
결과를 보자.

실행이 안 된다. 맨 뒤에 ‘도 닫아주도록 하자
';ls'

실행된다.
';ls'가 마침 딱 5글자이니 이걸 넣으면 되겠다.


flag_29cbb98dafb4e471117fec409148e9386753569e 를 브라우저에서 열어보면


끝.