π© λ¬Έμ νμ
λ¬Έμ νμ΄μ§μ λ€μ΄κ°λ©΄ /?file=hello
λΌλ urlλ‘ μ°κ²°λκ³ , hello.php
λΌλ νμΌμ λ΄μ©μ΄ μΆλ ₯λλ κ²μΌλ‘ 보μ΄λ νμ΄μ§λ₯Ό νμΈν μ μλ€. μ΄λ‘ 보μ, urlμ νλΌλ―Έν°λ‘ νμΌλͺ
μ μ λ¬νλ©΄ ν΄λΉ νμΌμ μ½μ μ μλ κ²μ μ μ μλ€.
/?file=index
λ‘ μμ²νλ©΄ μλ¬΄λ° κ²°κ³Όλ λ°μ μ μμΌλ, /?file=flag
λ‘ μμ²νλ©΄ μμ κ°μ΄ FLAG is in the codeλΌλ λ¬Έμμ΄μ νμΈν μ μλ€. μ΄λ flag.php
λΌλ νμΌμ μ½μ κ²μ΄ μλλΌ μ€νν κ²μΌλ‘ μ μΆν μ μκ³ , νλκ·Έ κ°μ ν΄λΉ νμΌμ μ½μ΄μΌ μ μ μλ κ²μΌλ‘ μ μΆν μ μλ€.
π© λ¬Έμ νμ΄
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μλ PHP WrappersλΌλ κ°λ μ΄ νμνλ€. PHP Wrapperλ νμΌ μμ€ν ν¨μμ ν¨κ» μ¬μ©νκΈ° μν λ€μν URL μ€νμΌ νλ‘ν μ½μ λ΄μ₯ wrapperκ° μ 곡νλ κ²μ λ§νλ€. PHP 곡μ λ¬Έμμμ μμΈν λ΄μ©μ νμΈν μ μλ€.
곡μ λ¬Έμμμ wrapperμ μ’
λ₯λ₯Ό νμΈν μ μλλ°, μ΄ μ€μμ μ°λ¦¬λ νμΌμ μ½μ΄μΌ νκΈ° λλ¬Έμ I/O streamsμ κ΄λ ¨λ php://
wrapperλ₯Ό μ¬μ©ν κ²μ΄λ€.
κ·Έ μ€ php://filter
λ₯Ό μ¬μ©νλ©΄ νλΌλ―Έν°λ₯Ό μ΄μ©νμ¬ νΉμ νμΌ κ²½λ‘μ νμ
λ±μ μ§μ ν μ μλ€. phpμμ μ 곡νλ filterμ 리μ€νΈλ 곡μ λ¬Έμμμ μ°Ύμλ³Ό μ μλλ°, μ¬λ¬ νν°λ₯Ό μ΄μ©νμ¬ νμΌμ μΆμΆν μ μμλ€.
μ¬μ© λ°©λ²μ php://filter/read={μ μ©νλ €λ νν°}/resource={νμΌ κ²½λ‘}
μ΄λ€.
νμΌμ μΆμΆν μ μμλ νν°λ string.rot13
, convert.base64-encode
, convert.quoted-printable-encode
λ±μ΄ μμλ€.
μ¬μ© κ°λ₯ν νν° μ€ 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 μ·¨μ½μ μ΄ λ°μνλ κ²μ νμΈν μ μμλ€.