Wargame/xcz.kr

[xcz.kr] 18번 Web Basic

광팔2 2021. 1. 19. 18:32
반응형

문제

음... 가장 자신 없는 웹 해킹 문제이다.

 

View source를 누르면 소스코드를 준다.

 

일단 코드를 보기전에 보기 복잡한 변수명을 바꾸는 게 좋겠다.

<?
$key = "Congratulations!</br>Key is ??????????????????";
$liillillilliliili = @$_COOKIE['c'];
$liillillliiiliili = @$_GET['g'];
$lilllillliiiliili = @$_POST['p'];
if(empty($liillillilliliili) || empty($liillillliiiliili) || empty($lilllillliiiliili)){exit ('wrong T.T');}
$lililillliiiliili = $liillillliiiliili . $liillillilliliili;
$lilililliiiiliill = $lilllillliiiliili;

function test($a){
$b = '';
    for($i=0; $i < strlen($a); $i++){
        $b = $b . ' - ' . ord(substr($a,$i,1));
    }
    return $b;
}
if(test($lililillliiiliili)==" - 103 - 105 - 118 - 101 - 109 - 101 - 112 - 97 - 115 - 115 - 119 - 111 - 114 - 100" || test($lilililliiiiliill) == " - 107 - 101 - 121 - 112 - 108 - 122 - 33"){
    echo $key;
}
else{
    echo 'wrong T.T';
}
?>

li 뭐시기로 시작하는 변수명은 총 5개가 존재한다.(A, B, C, D, E)로 바꿔 줄 거다.

$key = "Congratulations!</br>Key is ??????????????????";
$A = @$_COOKIE['c'];
$B = @$_GET['g'];
$C = @$_POST['p'];
if(empty($C) || empty($A) || empty($B)){exit ('wrong T.T');}
$D = $B . $A;
$E = $C;

function test($a){
$b = '';
    for($i=0; $i < strlen($a); $i++){
        $b = $b . ' - ' . ord(substr($a,$i,1));
    }
    return $b;
}
if(test($D)==" - 103 - 105 - 118 - 101 - 109 - 101 - 112 - 97 - 115 - 115 - 119 - 111 - 114 - 100" || test($E) == " - 107 - 101 - 121 - 112 - 108 - 122 - 33"){
    echo $key;
}
else{
    echo 'wrong T.T';

이제 코드를 이해를 해보면 생각보다 간단하다.

$key = "Congratulations!</br>Key is ??????????????????";
$A = @$_COOKIE['c'];
$B = @$_GET['g'];
$C = @$_POST['p'];
if(empty($C) || empty($A) || empty($B)){exit ('wrong T.T');}
$D = $B . $A;
$E = $C;

A, B, C 변수에 대입을 해주는데 A는 쿠키값, B는 GET 메서드, C는 POST 메서드를 받는다.

 

조건문 if를 보면 C, A, B 중에 하나라도 값이 없으면 문구가 띄어준다.

 

조건 문 밑에는 변수 두 개를 새로 받는데 D는 B와 A의 문자열을 합친 값, E는 C를 대입

 

function test($a){
$b = '';
    for($i=0; $i < strlen($a); $i++){
        $b = $b . ' - ' . ord(substr($a,$i,1));
    }
    return $b;
}

여기서 test 함수를 만드는데, 문자열을 받으면 한 글자 씩 잘라 아스키코드로 만들고 '-' 문자가 들어가면 이어 붙여 리턴해주는 함수이다.

 

if(test($D)==" - 103 - 105 - 118 - 101 - 109 - 101 - 112 - 97 - 115 - 115 - 119 - 111 - 114 - 100" || test($E) == " - 107 - 101 - 121 - 112 - 108 - 122 - 33"){
    echo $key;
}
else{
    echo 'wrong T.T';

이 부분에서는 test 함수를 쓰는데 값을 미리 계산해보면 D는 givemepassword / E는 keyplz! 가 되어야 한다.

그럼 key를 응답해주고 아니면 실패 문구가 뜬다.

 

그럼 이제 우리는 처음에 봤던 변수들의 대입 값들을 알아내서 대입을 하면 key 값을 받을 수 있다는 것을 알 수 있다.

 

여기서 우리는 D와 E 값을 알기 때문에 A, B, C 값을 구할 수 있다.

 

D가 givemepassword이기 때문에 A와 B는 그냥 아무렇게 나눠서 A는 giveme / B는 password를 입력시켤줄 것이다.

E의 값 keyplz! 를 C에 입력하면 된다.

 

진짜 왜 안될까..... 코드도 다 짜고 여러 가지 방법으로 했는데 왜 안될까...... write up 봐도 나랑 풀이가 같은데... 왜지

2일간 해도 될 생각이 없네... 다음에 다시 해보자....

반응형