Natas Level 10 → Level 11
Username: natas11
URL: http://natas11.natas.labs.overthewire.org
<div id="content">
<body style="background: <?=$data['bgcolor']?>;">
Cookies are protected with XOR encryption<br/><br/>
<?
if($data["showpassword"] == "yes") {
print "The password for natas12 is <censored><br>";
}
?>
<form>
Background color: <input name=bgcolor value="<?=$data['bgcolor']?>">
<input type=submit value="Set color">
</form>
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
정작 실행하는 코드는 3줄이다.
$data = loadData($defaultdata);
if(array_key_exists("bgcolor",$_REQUEST)) {
if (preg_match('/^#(?:[a-f\d]{6})$/i', $_REQUEST['bgcolor'])) {
$data['bgcolor'] = $_REQUEST['bgcolor'];
}
}
saveData($data);
암호화된 값을 풀었다가 색설정하고 다시 암호화해서 쿠키에 저장하는 코드같다.
값의 의미는 중요하지 않은 것 같고 XOR만 잘해주면 될 거같다.
{
"showpassword": "yes,
"bgcolor": #111111
}
이렇게 끝나면 된다.
나는 현재 키를 모르므로 키부터 알아내야한다. 색깔을 #111111로 했을 때 돌아오는 쿠키 값을 획득한 뒤 파이썬 코드로 실행한다.
import base64
import json
enc_Key = "ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSRgl7QEYJaAw="
enc_Key = base64.b64decode(enc_Key)
enc_Text = {"showpassword" : "no", "bgcolor" : "#111111"}
enc_Text = json.dumps(enc_Text)
enc_outText = ""
for i in range(0, len(enc_Text)) :
enc_outText += chr(ord(enc_Text[i]) ^ ord(enc_Key[i % len(enc_Key)]))
print enc_outText
이 코드를 실행하면 반복되는 문자열이 있는데 이 값이 키다 : qw8J
이제 다시 쿠키값을 만들기 위해 파이썬코드를 작성했다
import base64
import json
key = "qw8J"
text = {"showpassword" : "yes", "bgcolor" : "#111111"}
text = json.dumps(text)
outText = ''
for i in range(0, len(text)) :
outText += chr(ord(text[i]) ^ ord(key[i % len(key)]))
print base64.b64encode(outText)
출력된 값을 넣은 결과 정상적으로 12번답을 알 수 있었다.
답은 EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3 이다,
'보안 > Natas' 카테고리의 다른 글
Natas Level 13 - 웹셀, 시그니처 체크 (0) | 2017.02.09 |
---|---|
Natas Level 12 - 웹셀 업로드 (0) | 2017.02.08 |
Natas Level 10 - 커맨드 인젝션2 (0) | 2017.02.08 |
Natas Level 9 - 커맨드인젝션 (0) | 2017.02.08 |
Natas Level 8 - php코드가 존재할 때 2 (0) | 2017.02.08 |