webhacking/etc

wargame.kr type_confusion

qkqhxla1 2014. 10. 30. 13:23

 $json json_decode($_POST['json']);
    
$key gen_key();
    if (
$json->key == $key) {
        
$ret = ["code" => true"flag" => auth_code("type confusion")];
    } else {
        
$ret = ["code" => false];
    }

 function gen_key(){
     
$key uniqid("welcome to wargame.kr!_"true);
    
$key sha1($key);
     return 
$key;
 }


중요부분. POST방식으로 json값을 받아서 $json->key와 $key와 같으면 통과.


$key는 gen_key()함수로 값을 얻음. gen_key()의 리턴값은 랜덤한 문자열이 sha1로 인코딩된값.


$json->key== "abc~~"등과 같아야된다. $json은 json_decode로 내가 보낸 값을 디코딩하는데.


json_decode함수를 찾아보면 리턴값은 TRUE, FALSE, NULL 3개이다. json_decode함수


각각의 리턴값에 대해 실험을 해보았다. NULL==$key는 false로 if문 통과불가.


false==$key도 false로 if문 통과불과. TRUE==$key는 true로 if문이 통과가 되었다.


(사실 리턴되는 TRUE값은 해당되는 키의 문자열이지만 TRUE도 된다고 생각하고 실험해보았다.)


그러면 $json->key값을 TRUE로 만들어주면 된다는 소리이다. 우리가 폼에 입력된 값은


이렇게 변형된다. 


ex) admin 입력시 {"key":"admin"}이 url인코딩된값. -> %7B%22key%22%3A%22admin%22%7D


$json->key는 파이썬의 사전(사전이었나)과 같은 것으로 위와 같이 입력한 경우 $json->key는 admin을


출력한다.(궁금하면 직접 해보면 됨.) 어떻게 버그를 일으켜서 TRUE를 리턴하게 만들까.. 고민하고


고민하다가 그냥 TRUE를 넣었다. %7B%22key%22%3ATRUE%7D 그러면 


이렇게 변환된다. {"key":TRUE}.  $json->key의 리턴값은 TRUE가 되고 저 if문을 통과하게


되어 flag값이 나온다.

'webhacking > etc' 카테고리의 다른 글

overthewire natas 11  (0) 2014.11.24
overthewire natas 1~10  (0) 2014.11.24
wargame.kr login_with_crypto_but  (0) 2014.10.29
wargame.kr php? c?  (0) 2014.10.04
wargame.kr strcmp  (0) 2014.10.02