<p>면책 조항: 이는 PHP 코드 삽입 학습을 위한 예시일 뿐이며 어떤 방식으로든 사용되는 프로덕션 코드는 아닙니다. 나는 이것이 좋은 코딩 습관이 아니라는 것을 충분히 알고 있습니다. </p>
<p>다음 PHP 스크립트가 있습니다: </p>
<pre class="brush:php;toolbar:false;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<머리>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>예제 스크립트</title>
</머리>
<본문>
<h1>예제 페이지</h1>
<p>이제 수학을 해보세요. 계산할 수식을 입력해주세요. 예: 1+1. </p>
<form method="get">
<p>공식: <input type="text" name="maths" /></p>
<p><input type="submit" value="calculate" /></p>
</양식>
<?
if (( isset($_REQUEST["maths"])) && ($_REQUEST["maths"] != "") )
{
echo "<p>결과는 다음과 같습니다:";
eval("echo (".$_REQUEST["수학"].");");
echo "</p>";
}
?>
</body>
</html></pre>
<p>이 스크립트는 PHP 코드 삽입에 취약합니다. 다음을 수행하여 이를 깨뜨릴 수 있었습니다(대부분 시행착오를 통해 알아냈습니다). </p>
<pre class="brush:php;toolbar:false;">$a='1');phpinfo();echo($a</pre>
<p>그러나 나는 그 근거를 완전히 이해하지 못합니다. 제가 이해한 바로는 echo 문을 완성하고 자체 코드(예: phpinfo())를 삽입한 다음 닫는 괄호를 처리하는 다른 함수(예: echo)를 작성해야 합니다. </p>
<p>저는 다음과 같은 코드가 작동할 것이라고 생각했습니다. </p>
<pre class="brush:php;toolbar:false;">");phpinfo();echo("</pre>
<p>그러나 phpinfo는 문자열의 일부로 간주되고 eval 함수에 의해 평가되지 않으므로 이는 작동하지 않습니다.
나는 또한 성공하지 못한 채 따옴표를 이스케이프 처리하려고 시도했습니다. </p>
<p>질문:</p>
<li>여기에 코드를 삽입하는 올바른 방법은 무엇인가요? </li>
<li>왜<code>$a='1');phpinfo();echo($a</code>가 작동하나요?</li>
</ul><p><br /></p>
문제는 이 진술이 유효하지 않다는 것입니다:
으아악파싱 오류가 발생합니다. 따라서 이 오류를 방지하려면 무언가를 주입해야 합니다. 예:
으아악해당 입력을 사용할 때 변수를 대체한 결과는 다음과 같습니다.
으아아아그래서 여기에 값
$a='1'
,并且输出了该赋值的结果(即被赋给$a
的值)。然后执行了phpinfo()
。最后再次输出了$a
이 할당됩니다.);phpinfo();echo(
,它不会起作用,因为它试图执行echo ()
。但是echo
를 사용하려면 하나 이상의 인수가 필요합니다.여기에 코드를 삽입하려면 입력이 이전에 유효한 것으로 끝나는지 확인해야 합니다.
echo (
之后是有效的内容开头,并且以在);
. 이 두 부분 사이에 삽입하려는 추가 코드를 배치하세요.