소스도 별거 없고, 일단 1 적고 들어가본다.
Hello 1 이 돌아오는데 뭔가 이상하다. 창이 넘어가는게 한번 더 거친것 같다.
디버거를 켜고 한번 다시 해보기로 한다.
index.php 에서 form값으로 index.php를 넘겨주는데, 값을 입력받으면 <meta>를 이용해 /index/go.html으로 넘겨준다.
그리고 go.html은 내 아이디가 적혀있다. 따로 인자를 넘기진 않는것 같은데도..
근데 뭐 admin이면 admin을 적어도 되고 공백을 넘겨도 넘어가고, 55글자씩 적어서 보내도 잘 된다.
뭘 의도하는지 잘 모르겠다. 그러던와중에 ; 를 적으니까 인자가 안넘어는걸 발견했다. \도 마찬가지.. 이게 쓸모가 있나 모르겠다
그래서 검색 했더니 Command Injection이라고 한다. ㅡㅡ 이게 파일이 생성되고 있는지 아닌지 밖에선 알 길이 없으니...
그제서야 ls 고 cp고 쳐봤는데 하나도 안된다. 허 참...
어쨌든 이런 느낌의 명령어가 실행되고 있나 보다. 아마 그럼 exec일려나? 이런느낌인것 같다.
exec('echo $_POST['html']' > /index/go.html);
근데 아직도 여기 뭘 적어야되는지 모르겠다. 시스템 명령어를 넣으면 성공인가 싶은데. 대강 찾아보니 ls를 넣어야된다는 것 같다.
그래도 이해가 안되서 결국 command injection으로 검색해보니 OWASP에서 보여주고 있는게 있다.
<?php print("Please specify the name of the file to delete"); print("<p>"); $file=$_GET['filename']; system("rm $file"); ?>
요컨데, 요런 코드가 있으면
http://127.0.0.1/delete.php?filename=bob.txt;id
이렇게 질의를 하면
Please specify the name of the file to delete uid=33(www-data) gid=33(www-data) groups=33(www-data)
이렇게 대꾸 한다는것이다. 요 문제에서도 비슷한걸 수행해야 하는 모양이다.
최종 골은, /index/go.html이 아니라 다른 파일을 만들게 해야된다는것! 근데 bypass를 검색해봤는데 주로 사용되는 " 랑 ; 가 이미 필터링 되고 있다. '는 되는것 같고.. bash의 #가 주석이니까 #를 넣는 방법으로도 잘 안되었다ㅠㅠ
결국 검색을 좀 했는데 (이문제는 정말 부끄럽다;;)
ls가 필터링되고 있으니 간단히 ls 필터링을 회피해야된다는것이다. 그래서 다음과 같이 만들어주면 된다.
'&l's
부끄러우니 첨언을 좀 하자면,
&는 커맨드에서 앞 명령어가 성공적으로 실행되게 되면 다음 명령어도 수행하라는 말이다.
즉 echo hello은 성공적으로 실행되기때문에, 뒤의 ls도 동작시켜 go.html에 같이 쓰게 하는것이다.
(실제로, 'l's라고 적어도 ls명령어를 출력한다 -_-;)
정말 별에별 공격이 다있구나 싶다...