[DreamHack] phpreq Write-up
2024. 12. 26. 10:51ㆍ보안/웹
728x90
문을 열고 step2로 가라고 한다.
Nickname과 Password를 입력하면 문이 열릴 것 같다.
// pw filtering
if (preg_match("/[a-zA-Z]/", $input_pw)) { //pw에 알파벳 필터링
echo "alphabet in the pw :(";
}
else{
$name = preg_replace("/nyang/i", "", $input_name);
//nyang을 대소문자 구분없이 제거(공백으로 치환)
$pw = preg_replace("/\\d*\\@\\d{2,3}(31)+[^0-8\\"]\\!/", "d4y0r50ng", $input_pw);
//일치하는 정규표현식 패턴이 나오면 d4y0r50ng로 치환
if ($name === "dnyang0310" && $pw === "d4y0r50ng+1+13") {
//name이 dnyang0310, pw가 d4y0r50ng면 step2로 이동
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>';
정규 표현식으로 나와있다.
name부터보면 dnyang0310이어야 하는데 nyang이 나오면 공백으로 치환하여 제거해주고 있다.
이를 우회하려면 nyang에 nyang을 덮어씌우면 된다.
- name
- nynyangang0310
이렇게 쓰면 nyang이 제거되면서 name에는 nyang이 입력되게 된다.
pw를 보면
d4y0r50ng+1+13 이어야 하는데 영어를 필터링하고 있다.
"/\\d*\\@\\d{2,3}(31)+[^0-8\\"]\\!/"
- \\d*
- 숫자(\\d)가 0개 이상 나오는 부분
- 예: "", "123", "45678"
- \\@
- 문자 "@" 그대로
- \\를 붙여 특수문자로 인식하지 않고, 문자 "@"로 처리
- \\d{2,3}
- 숫자(\\d)가 2개 이상, 3개 이하 반복
- 예: "12", "123"
- (31)+
- "31"이 1번 이상 반복되는 부분
- 예: "31", "3131"
- [^0-8\\"]
- [^]대괄호 안에 없는 문자
- 0-8과 "를 제외한 문자에 매칭.
- 예: "9", "a", "@", "!"
- \\!
- 문자 "!" 그대로.
- \\를 붙여 특수문자로 인식하지 않고 문자 "!"로 처리.
이 조건에 맞는 문자를 써주면 d4y0r50ng로 치환되어 영어를 필터링해도 pw를 알맞게 입력할 수 있다. 맞는 문자는
- pw
- @1231@!+1+13
이런식으로 써주면 우회하여 pw를 입력할 수 있다.
그럼 이렇게 문이 좀 열린다.
$cmd = $_POST["cmd"] ? $_POST["cmd"] : "";
if ($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
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";
}
command 입력해서 하는 것 같은데 해보니까 ls, echo 이런 명령어들이 되는 것을 확인하였다.
flag파일에 flag가 있는데 명령어에 flag를 필터링하고 있다.
ls .. 를 해보니 dream디렉토리가 나오는 것도 확인하였다.
그렇다면 cat 명령어로 파일을 확인해주지만 명령어에 flag가 들어가지 않아야 한다.
- pw
- cat ../dream/*.txt
이런식으로 정규표현식을 사용하여 해당 디렉토리에 모든 txt파일을 확인할 수 있다. 그래서 flag를 포함하지 않고 flag의 내용을 확인할 수 있다.
'보안 > 웹' 카테고리의 다른 글
[DreamHack] ex-reg-ex Write-up (0) | 2024.12.26 |
---|---|
[DreamHack] Flying chars Write-up (0) | 2024.12.26 |
[WebHacking.kr]Old-03 Write-up (1) | 2024.12.18 |
[WebHacking.kr]Old-01 Write-up (1) | 2024.12.17 |
[WebHacking.kr]Old-07 Write-up (0) | 2024.12.17 |