phpreg
목록
1. PHP 정규화 표현식
정규 표현식(regular expression)은 문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴이다.
2. Code
step2.php
<?php
// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$input_name = $_POST["input1"] ? $_POST["input1"] : "";
$input_pw = $_POST["input2"] ? $_POST["input2"] : "";
// pw filtering: 영어 입력 X
if (preg_match("/[a-zA-Z]/", $input_pw)) {
echo "alphabet in the pw :(";
}
else{
// 대소문자 구분 없이 "nyang"을 입력하면 빈문자열로 치환됨
$name = preg_replace("/nyang/i", "", $input_name);
// 정규표현 조건이 맞을 경우 "d4y0r50ng"로 치환함
$pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8\"]\!/", "d4y0r50ng", $input_pw);
// 이름이 "dnyang0310" 이고 비밀번호가 "d4y0r50ng+1+13"일 경우
if ($name === "dnyang0310" && $pw === "d4y0r50ng+1+13") {
echo '<h4>Step 2 : Almost done...</h4><div class="door_box"><div class="door_black"></div><div class="door"><div class="door_cir"></div></div></div>';
$cmd = $_POST["cmd"] ? $_POST["cmd"] : "";
if ($cmd === "") {
// cmd 입력창 띄우기
echo '
<p><form method="post" action="/step2.php">
<input type="hidden" name="input1" value="'.$input_name.'">
<input type="hidden" name="input2" value="'.$input_pw.'">
<input type="text" placeholder="Command" name="cmd">
<input type="submit" value="제출"><br/><br/>
</form></p>
';
}
// cmd filtering: "flag"가 들어가면
else if (preg_match("/flag/i", $cmd)) {
echo "<pre>Error!</pre>";
}
else{
echo "<pre>--Output--\n";
system($cmd);
echo "</pre>";
}
}
else{
echo "Wrong nickname or pw";
}
}
}
// GET request
else{
echo "Not GET request";
}
?>
첫 번째로 name과 pw를 입력 받고 있다.
name의 경우 대소문자 구분 없이 nyang이라는 글자가 들어가 있으면 빈 문자열로 치환하고 있다.
pw의 경우 \d*\@\d{2,3}(31)+[^0-8\"]\! 조건식을 충족할 경우
\d*: 숫자(0-9) 0개 이상\@:@1개\d{2,3}: 숫자 2~3개(31)+: 문자열"31"이 1회 이상[^0-8\"]:0~8숫자 또는"를 제외한 1글자\!:!1개
d4y0r50ng로 치환하고 있다.
두 번째로 cmd를 입력 받고 있다.
cmd의 경우 대소문자 구분 없이 flag가 입력되어 있는 경우 에러 메시지를 띄운다.
3. Payload
3.1. Step1

id: dnnyangyang0310
nyang이 빈 문자열로 바뀌면서 앞 뒤 문자가 붙어서 dnyang0310.이 된다.
pw: @45319!+1+13
@45319!가 치환되어 d4y0r50ng로 바뀌고 그 뒤에 +1+13이 붙어 d4y0r50ng+1+13이 된다.
3.2. Step2

flag의 위치는 ../dream/flag.txt이고, flag를 전부 다 작성할 경우 에러 메시지가 뜨므로 특수 문자열 *를 사용해 우회할 수 있다.
cat ../dream/f*.txt

Comments