[Solved in under 21 minutes]
모의침투 사업중인데 나름 Wargame 덕분인지 성과가 조금 있다..!
XSS, CSRF, File-Upload 이렇게 성공했다..
모두 공부 꾸준히 하면 좋은 성과가 있을겁니다!
가보자

뭐 데이터 삽입하는 문제로 푸는 것 같다.
이름부터 php7cmp4re 이니 간단히 보자면 php7 compare 문제, 즉 비교한다는 뜻이다.
파일을 다운 받아서 소스코드를 보자

<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>php7cmp4re</title>
</head>
<body>
<!-- Fixed navbar -->
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/">php7cmp4re</a>
</div>
<div id="navbar">
<ul class="nav navbar-nav">
<li><a href="/">Index page</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div class="container">
<?php
require_once('flag.php');
error_reporting(0);
// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$input_1 = $_POST["input1"] ? $_POST["input1"] : "";
$input_2 = $_POST["input2"] ? $_POST["input2"] : "";
sleep(1);
if($input_1 != "" && $input_2 != ""){
if(strlen($input_1) < 4){
if($input_1 < "8" && $input_1 < "7.A" && $input_1 > "7.9"){
if(strlen($input_2) < 3 && strlen($input_2) > 1){
if($input_2 < 74 && $input_2 > "74"){
echo "</br></br></br><pre>FLAG\n";
echo $flag;
echo "</pre>";
} else echo "<br><br><br><h4>Good try.</h4>";
} else echo "<br><br><br><h4>Good try.</h4><br>";
} else echo "<br><br><br><h4>Try again.</h4><br>";
} else echo "<br><br><br><h4>Try again.</h4><br>";
} else{
echo '<br><br><br><h4>Fill the input box.</h4>';
}
} else echo "<br><br><br><h3>WHat??!</h3>";
?>
</div>
</body>
</html>
딱 보아하니 뭔가 어지럽게 되어 있다.
저기 무수히 많은 if문을 통과하면 flag를 뽑아낸다..
내가 제일 싫어하는 분류의 문제다 허허 거 참
그래도 하나씩 차근차근 보자
if($input_1 != "" && $input_2 != ""){
가. 공백이면 안된다.
if(strlen($input_1) < 4){
나. $input_1의 길이 <= 3
if($input_1 < "8" && $input_1 < "7.A" && $input_1 > "7.9"){
다. 이거는 글보다 조건문을 정리하는게 더 보기 좋겠다.
"7.9" < $input_1 < "8"
"7.9" < $input_1 < "7.A"
if(strlen($input_2) < 3 && strlen($input_2) > 1){
라. 1 < $input_2의 길이 < 3
if($input_2 < 74 && $input_2 > "74"){
마. "74" < $input_2 < 74
이렇다.
정리하자면, ...
정리할게 없다 그냥 저거대로 $input_1부터 하나씩 해보자.
그런데 알아둬야 할 것이 있다.
필자도 이 Wargame을 풀다가 알게 된 것인데 PHP7버전부터 다른 타입을 비교할때 자동 형변환으로 하여 계산한다는 것이다.
진짜 가보자.
"7.9" < $input_1 < "8"
은 둘 다 캐릭터 형이니 "7.9"와 "8" 사이 어딘가를 넣어주면 되니 패스해도 될 듯 하다.
"7.9" < $input_1 < "7.A"
를 보면 앞에 "7.x" 는 동일하니 뒤에 것만 비교해주면 되겠다.
아스키 코드를 보자

"9" == ASCII(57)
"A" == ASCII(65)
이다 그러하니 저 둘 사이의 아무 값이나 넣어주면 된다.
"74" < $input_2 < 74
당장 이렇게 보면 정말 헷갈린다.
이 부분에서 시간을 많아 먹은 듯 하다
그런데 이렇게 생각하면 정말 간단하다.
"74" < $input_2
.
.
.
$input_2 < 74
간단하게 하나씩 비교해보자
"74" == ASCII(J)
이러하니 $input_2는 아스키 74보다 위여야한다.
$input_2 < 74
이 부분을 생각해보자 정수형 74 보다 아래 있어야 하는데 여기서 생각해야 할 포인트가 있다.
PHP는 문자열이 숫자가 아닌 문자열로 시작하면 0을 뱉는다.
ex) aa1 == 0 / aa == 0 / a123s == 0
그러니까 문자를 넣어주면 된다는 말이다.
하지만 strlen에 의해서 두글자가 되어야 하니
a("97") ~ z("122") 사이에 랜덤으로 넣어주면 두 조건을 다 만족한다.
가보자

$input_1 = 7.?
$input_2 = aa
아까 말했듯이 $input_1의 7. << 이 녀석은 고정에 뒤에
ASCII(57) < $input_1 < ASCII(65) 에 사이의 특수문자를 넣어주고
뒤에녀석은 문자열이면 PHP에서 변환할 때 0을 뱉으니 조건 만족!

이쁘다.
드림핵 페이지에 넣어주면?

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 답 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
DH{81df5f707394347306c1ce2693601349407013aedbf79ae8d97a502c3d138bfe}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
해결~~~
LoS 어려워서 드림핵 왔다..
뭐 여하튼 오늘 하루도 수고했어 오늘도~
DreamHack Php7cmp4re Write-up
이상 보고 끝!