$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 |