Home [Wargame] Webhacking.kr old-25 (PHP)
Post
Cancel

[Wargame] Webhacking.kr old-25 (PHP)

🚩 문제 νŒŒμ•…


image

문제 νŽ˜μ΄μ§€μ— λ“€μ–΄κ°€λ©΄ /?file=hello λΌλŠ” url둜 μ—°κ²°λ˜κ³ , hello.php λΌλŠ” 파일의 λ‚΄μš©μ΄ 좜λ ₯λ˜λŠ” κ²ƒμœΌλ‘œ λ³΄μ΄λŠ” νŽ˜μ΄μ§€λ₯Ό 확인할 수 μžˆλ‹€. 이둜 보아, url의 νŒŒλΌλ―Έν„°λ‘œ 파일λͺ…을 μ „λ‹¬ν•˜λ©΄ ν•΄λ‹Ή νŒŒμΌμ„ 읽을 수 μžˆλŠ” 것을 μ•Œ 수 μžˆλ‹€.


/?file=index둜 μš”μ²­ν•˜λ©΄ μ•„λ¬΄λŸ° 결과도 받을 수 μ—†μœΌλ‚˜, /?file=flag둜 μš”μ²­ν•˜λ©΄ μœ„μ™€ 같이 FLAG is in the codeλΌλŠ” λ¬Έμžμ—΄μ„ 확인할 수 μžˆλ‹€. μ΄λŠ” flag.phpλΌλŠ” νŒŒμΌμ„ 읽은 것이 μ•„λ‹ˆλΌ μ‹€ν–‰ν•œ κ²ƒμœΌλ‘œ μœ μΆ”ν•  수 있고, ν”Œλž˜κ·Έ 값은 ν•΄λ‹Ή νŒŒμΌμ„ 읽어야 μ•Œ 수 μžˆλŠ” κ²ƒμœΌλ‘œ μœ μΆ”ν•  수 μžˆλ‹€.



🚩 문제 풀이


이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” PHP WrappersλΌλŠ” κ°œλ…μ΄ ν•„μš”ν•˜λ‹€. PHP Wrapperλž€ 파일 μ‹œμŠ€ν…œ ν•¨μˆ˜μ™€ ν•¨κ»˜ μ‚¬μš©ν•˜κΈ° μœ„ν•œ λ‹€μ–‘ν•œ URL μŠ€νƒ€μΌ ν”„λ‘œν† μ½œμ„ λ‚΄μž₯ wrapperκ°€ μ œκ³΅ν•˜λŠ” 것을 λ§ν•œλ‹€. PHP 곡식 λ¬Έμ„œμ—μ„œ μžμ„Έν•œ λ‚΄μš©μ„ 확인할 수 μžˆλ‹€.


image

곡식 λ¬Έμ„œμ—μ„œ wrapper의 μ’…λ₯˜λ₯Ό 확인할 수 μžˆλŠ”λ°, 이 μ€‘μ—μ„œ μš°λ¦¬λŠ” νŒŒμΌμ„ 읽어야 ν•˜κΈ° λ•Œλ¬Έμ— I/O streams와 κ΄€λ ¨λœ php:// wrapperλ₯Ό μ‚¬μš©ν•  것이닀.


κ·Έ 쀑 php://filterλ₯Ό μ‚¬μš©ν•˜λ©΄ νŒŒλΌλ―Έν„°λ₯Ό μ΄μš©ν•˜μ—¬ νŠΉμ • 파일 κ²½λ‘œμ™€ νƒ€μž… 등을 지정할 수 μžˆλ‹€. phpμ—μ„œ μ œκ³΅ν•˜λŠ” filter의 λ¦¬μŠ€νŠΈλŠ” 곡식 λ¬Έμ„œμ—μ„œ μ°Ύμ•„λ³Ό 수 μžˆλŠ”λ°, μ—¬λŸ¬ ν•„ν„°λ₯Ό μ΄μš©ν•˜μ—¬ νŒŒμΌμ„ μΆ”μΆœν•  수 μžˆμ—ˆλ‹€.


μ‚¬μš© 방법은 php://filter/read={μ μš©ν•˜λ €λŠ” ν•„ν„°}/resource={파일 경둜}이닀.

νŒŒμΌμ„ μΆ”μΆœν•  수 μžˆμ—ˆλ˜ ν•„ν„°λŠ” string.rot13, convert.base64-encode, convert.quoted-printable-encode 등이 μžˆμ—ˆλ‹€.


image

μ‚¬μš© κ°€λŠ₯ν•œ ν•„ν„° 쀑 convert.base64-encodeλ₯Ό μ΄μš©ν•˜μ—¬ url νŽ˜μ΄λ‘œλ“œλ₯Ό λ§Œλ“€λ©΄ php://filter/read=convert.base64-encode/resource=./flag와 같이 ꡬ성할 수 있고, 이λ₯Ό ν¬ν•¨ν•˜μ—¬ μš”μ²­ν•˜λ©΄ μœ„μ™€ 같이 base64둜 μΈμ½”λ”©λœ 값을 얻을 수 μžˆλ‹€.


1
2
3
4
<?php
  echo "FLAG is in the code";
  $flag = "FLAG{this_is_your_first_flag}";
?>

이λ₯Ό decode ν•œ κ°’μ—μ„œ ν”Œλž˜κ·Έλ₯Ό 찾을 수 μžˆλ‹€.



🚩 μΆ”κ°€ 뢄석


1
2
3
4
5
6
7
8
9
10
11
<?php
  echo("<pre>");
  system("ls -al");
  echo("</pre>");
  if(!$_GET['file']) echo("<meta http-equiv=refresh content=0;url=?file=hello>");
  echo "<hr><textarea rows=10 cols=100>";
  $file = $_GET['file'].".php";
  if($file == "index.php") exit(); // anti infinite loop
  include $file;
  echo "</textarea>";
?>

같은 λ°©μ‹μœΌλ‘œ index.php νŒŒμΌμ„ μΆ”μΆœν•  수 μžˆλŠ”λ°, include $file; λΆ€λΆ„μ—μ„œ LFI 취약점이 λ°œμƒν•˜λŠ” 것을 확인할 수 μžˆμ—ˆλ‹€.

This post is licensed under CC BY 4.0 by the author.

[PortSwigger] Academy: Path traversal

[PortSwigger] Academy: Server-side request forgery (SSRF) attacks