본문 바로가기

18번 문제에요.

배점은 362점, 이름은 SimpleBoard 네요.

 

SimpleBoard

 

Simple Union SQL injection Challenge.

 (but you need script... maybe?)

 

문제 이름에 맞게 BBS가 있어요.

소스코드를 보면

 

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
    if (isset($_GET['view-source'])){
        if (array_pop(split("/",$_SERVER['SCRIPT_NAME'])) == "classes.php") {
            show_source(__FILE__);
            exit();
        }
    }
    Class DB {
        private $connector;
        function __construct(){
            $this->connector = mysql_connect("localhost""SimpleBoard""SimpleBoard_pz");
            mysql_select_db("SimpleBoard"$this->connector);
        }
        public function get_query($query){
            $result = $this->real_query($query);
            return mysql_fetch_assoc($result);
        }
        public function gets_query($query){
            $rows = [];
            $result = $this->real_query($query);
            while ($row = mysql_fetch_assoc($result)) {
                array_push($rows$row);
            }
            return $rows;
        }
        public function just_query($query){
            return $this->real_query($query);
        }
        private function real_query($query){
            if (!$result = mysql_query($query$this->connector)) {
                die("query error");
            }
            return $result;
        }
    }
    Class Board {
        private $db;
        private $table;
        function __construct($table){
            $this->db = new DB();
            $this->table = $table;
        }
        public function read($idx){
            $idx = mysql_real_escape_string($idx);
            if ($this->read_chk($idx== false){
                $this->inc_hit($idx);
            }
            return $this->db->get_query("select * from {$this->table} where idx=$idx");
        }
        private function read_chk($idx){
            if(strpos($_COOKIE['view'], "/".$idx!== false) {
                return true;
            } else {
                return false;
            }
        }
        private function inc_hit($idx){
            $this->db->just_query("update {$this->table} set hit = hit+1 where idx=$idx");
            $view = $_COOKIE['view'] . "/" . $idx;
            setcookie("view"$viewtime()+3600"/SimpleBoard/");
        }
        public function get_list(){
            $sql = "select * from {$this->table} order by idx desc limit 0,10";
            $list = $this->db->gets_query($sql);
            return $list;
        }
    }
 
cs

이렇게 생겼어요.

대충 쿠키에 "/" . $idx

가 존재하면 값을 읽어오고 아니면 에러를 띄우게 되어있는것같네요.

이것때문에 스크립트가 필요하다고 한걸까요?

 

아무튼 1번글을 누르면

readme.php?idx=1

로 이동하긴 하네요.

그리고 쿠키도 구워지고요.

저기에 구문을 집어넣으려면

 

이런식으로 쿠키까지 구워야 된다는거네요.

 

쿠키를 굽고 구문을 넣으면

작동해요.

 

아무튼 information_schema.table 와 limit를 사용해서 수상한 테이블을 찾아야되는데

limit 0,1

떡하니 README 라는게 튀어나오네요.

보통 이런거 가장 끝에 있던데

:thinking:

 

아무튼 column_namelimit 0,1 를 써서 뽑아내면

flag 네요.

너무 정직한 이름들이네요.

 

아무튼 flag를 읽어보면

6b09d887003faff2a39164a8c632280b68524756

 

빠밤!

 

키가 나왔네요.

 

뭐야 이게

'연구글 > wargame.kr' 카테고리의 다른 글

wargame.kr 17 / pyc decompile  (0) 2020.11.03
wargame.kr 16 / web chatting  (0) 2020.11.02
wargame.kr 14 / php? c?  (0) 2020.10.27
wargame.kr 13 / img recovery  (0) 2020.10.26
wargame.kr 12 / type confusion  (0) 2020.10.23
댓글

17번 문제에요.

배점은 356점, 이름은 pyc decompile 네요.

 

pyc decompile

 

bughela.pyc

:D

 

일단 시작하기전에 .pyc 파일이 뭐냐면요...

python을 컴파일 해놓은 파일이에요.

 

암튼 들어가보면 서버시간과 파일이 있네요.

다운로드 받아서

 

.pyc 디컴파일러를 쓸거에요.

EasyPythonDecompiler.exe

구글링하면 쉽게 찾으실거에요.

암튼 저걸로 디컴파일 해보면

 

이런 코드가 나와요.

대충 현재시간을 가지고 해시를 만들어서 서버시간이랑 비교하는거같은데...

위에서 준 서버시간이 현재시간이랑 다른네요?

 

서버시간이 115초 빠르니깐

 

지금시간에 115초를 더한만큼의 시간으로 해시를 만들어서 돌려보면?

 

해시가 떠요.

 

저걸 ?flag= 에 집어넣어보면?

 

Congratulations!!

Flag is c642ec3384fdd7795279dddb594cbe38b47d969e

 

빠밤!

 

문제가 풀렸네요.

'연구글 > wargame.kr' 카테고리의 다른 글

wargame.kr 18 / SimpleBoard  (0) 2020.11.04
wargame.kr 16 / web chatting  (0) 2020.11.02
wargame.kr 14 / php? c?  (0) 2020.10.27
wargame.kr 13 / img recovery  (0) 2020.10.26
wargame.kr 12 / type confusion  (0) 2020.10.23
댓글

16번 문제에요.

배점은 341점, 이름은 web chatting 이에요.

왜 갑자기 16번이냐고요?

리버싱은 사람이 하는거 아니거든요.

ㅈㅅ

 

아무튼

 

web chatting

 

Simple SQLi Challenge.

How can I set in order to reduce the traffic?

Please try looking at a developer's perspective.

 

아무튼 이름 입력부분이 있어요.

 

아무거나 입력하고 넘어가보면 역시나 채팅창이 있어요.

 

아무거나 넣고 엔터를 누르면

 

채팅이 기록되요.

 

이상한 request와 함께요.

 

그러니 저길 직접 들어가보면?

 

방금 입력했던 내용이 있어요.

 

저 뒤의 숫자를 조작해보니

 

이전사람이 쳐둔 채팅이 있네요.

 

저기에다가 구문을 넣어보면

 

정상적으로 작동해요.

 

그러니 저기에

union select 를 넣어서 컬럼의 숫자를 찾아보면?

 

컬럼의 숫자가 5개네요.

 

그런데 where 절을 사용할수 없으니 limit로 테이블명을 찾아내볼거에요.

information_schema 의 뒷부분에 유저가 생성한 테이블들이 있더라고요.

그러니 길이를 알아내고 가장 뒤에서부터 읽어서 수상한 데이터는 전부 확인해두는식으로 했어요.

 

그렇게 table_name 를 찾아보니

chat_log_secret

네요.

 

같은방법으로 column_name 도 찾아보면

readme

 

그러니 select readme from chat_log_secret 를 넣어보면?

 

2 (5..*.) : e32f1efb1a17572a6388229248d181f1be866ae0

 

빠밤!

 

키가 나왔네요.

'연구글 > wargame.kr' 카테고리의 다른 글

wargame.kr 18 / SimpleBoard  (0) 2020.11.04
wargame.kr 17 / pyc decompile  (0) 2020.11.03
wargame.kr 14 / php? c?  (0) 2020.10.27
wargame.kr 13 / img recovery  (0) 2020.10.26
wargame.kr 12 / type confusion  (0) 2020.10.23
댓글

wargame.kr 14 / php? c?

2020. 10. 27. 13:46

14번 문제에요.

배점은 293점, 이름은 php? c? 네요.

 

php? c?

 

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

 

입력칸이 두개 있어요.

 

소스를 보면 1번 입력을 /tmp/p7 의 인자에 넘겨주고

/tmp/p7 의 출력이 1이 아니고 2번 입력값과 같으면 문제가 풀리네요.

 

그러니 저기에 적혀있는 ./p7.c 파일에 접근해보면?

 

파일이 다운로드되요.

 

소스를 보죠.

 

첫번째 인자에서 값을 읽어와서, 값이 음수면 1을 띄워요.

그리고 그 값에 5를 더한 뒤, 4보다 크면 1을 띄우고,

5보다 작으면 i 를 출력하고 끝나네요.

 

일단 컴파일부터 하고...

 

위에서 말했던 32비트 어플리케이션의 정수형은 이렇게 생겼어요.

 

0000 0000 0000 0000   0000 0000 0000 0000

부호비트                                                 

 

가장 첫번째 비트가 부호비트이니 INT_MAX 즉 2147483647 을 집어넣으면

 

0111 1111 1111 1111   1111 1111 1111 1111

이 되겠죠.

 

그리고 거기에 + 5 를 하니

 

1000 0000 0000 0000   0000 0000 0000 0100

부호비트가 1이 되서 음수로 바뀌게 되요.

 

당연히 -2147483644 는 4보다 크지 않으니 10번라인을 통과할수 있고,

5보다도 작으니 11번 라인도 통과할수 있어요.

 

그러니 1번 입력창의 글자수 제한을 풀어버리고

 

2147483647 / -2147483644

를 집어넣으면?

 

36fc3053f368d3886c0ed30a054b847e9c31139e

 

빠밤!

 

키가 나왔네요.

'연구글 > wargame.kr' 카테고리의 다른 글

wargame.kr 17 / pyc decompile  (0) 2020.11.03
wargame.kr 16 / web chatting  (0) 2020.11.02
wargame.kr 13 / img recovery  (0) 2020.10.26
wargame.kr 12 / type confusion  (0) 2020.10.23
wargame.kr 11 / tmitter  (0) 2020.10.22
댓글

13번 문제에요.

배점은 287점, 이름은 img recovery 네요.

 

img recovery

 

Recovery the PNG image file!

but.. is this really "PNG" file?

(NO STEGANOGRAPHY. THIS IS FORENSIC CHALLENGE)

 

들어가보면 입력버튼이 있어요.

 

엄청 눈아픈 배경과 함께요.

 

F12를 눌러보면 저 패턴의 조각을 딸수있어요.

 

저 파일을 다운로드해보면

 

엥?

생긴게 바꼈네요.

저거 두개를 합쳐보면 QR코드처럼 될거같은데

 

웹의 이미지를 복사해서

 

두개를

 

합치면 QR코드가 나오네요.

 

WHAT!@#$?

찍어보면 저게 뜨네요.

저게 code 인가봐요.

넣어보면?

747b731219b6c8f83acd2ff63de570079d73a78

 

빠밤!

 

키가 나왔네요.

 

으악 눈아파

'연구글 > wargame.kr' 카테고리의 다른 글

wargame.kr 16 / web chatting  (0) 2020.11.02
wargame.kr 14 / php? c?  (0) 2020.10.27
wargame.kr 12 / type confusion  (0) 2020.10.23
wargame.kr 11 / tmitter  (0) 2020.10.22
wargame.kr 10 / md5_compare  (0) 2020.10.21
댓글

12번 문제에요.

배점은 283점, 이름은 type confusion 이네요.

 

type confusion

 

Simple Compare Challenge.

hint? you can see the title of this challenge.

:D

 

입력창이 있어요.

 

먼저 소스를 보면

JSON을 입력받아서 key에서 값을 읽어오는데

$key = uniqid("welcome to wargame.kr!_", true);

$key = sha1($key);

로 만들어진 난수와 비교를 해서 같으면 문제가 풀리게 되어있어요.

 

{"key":"test"}

그래서 입력칸에 test 를 집어넣으면 자동으로 JSON으로 변환되서 전송되고,

 

nope... 를 띄워요.

 

다시 코드로 돌아가보면

 

if ($json->key == $key) {

    $ret = ["code" => true, "flag" => auth_code("type confusion")];

 

비교를 == 로 하네요.

$key 는 문자열일테고 $json->key 에 true 를 집어넣어서 bool 형식으로 만들어버리면 무조건 참이되어 통과할수 있겠네요.

 

{"key":true}

피들러로 전송되는 데이터를 중간에서 바꿔주면?

 

Congratulations! flag is 81dc1cb6f68eda916810cd9ac4a7c0d1e029a74f

 

빠밤!

 

문제가 풀렸네요.

'연구글 > wargame.kr' 카테고리의 다른 글

wargame.kr 14 / php? c?  (0) 2020.10.27
wargame.kr 13 / img recovery  (0) 2020.10.26
wargame.kr 11 / tmitter  (0) 2020.10.22
wargame.kr 10 / md5_compare  (0) 2020.10.21
wargame.kr 9 / DB is really GOOD  (0) 2020.10.19
댓글

wargame.kr 11 / tmitter

2020. 10. 22. 16:10

11번 문제에요.

배점은 264점, 이름은 tmitter 에요.

트짹이네요.

 

tmitter

 

you need login with "admin"s id!

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

create table tmitter_user(

    idx int auto_increment primary key,

    id char(32),

    ps char(32)

);

들어가보면 로그인과 가입버튼이 있네요.

저기 위에 적혀있는

TMITTER is not fake twitter! :p

는 무시하자고요~

가입으로 들어가서

id testttttt / ps testttttt

로 가입을 하고,

로그인을 해보면?

입력창이 있네요.

당연히 입력하면 밑에 기록이 되고요.

그러면 이제 가입부분을 잘 살펴보면 저런게 있어요.

<!--hint : you need join with admin-->

 

맨 처음 테이블 만들때 썼던 쿼리에

id char(32),

가 있었잖아요?

저기에 32글자가 넘어가는 무언가를 집어넣으면 32글자 뒤로는 잘라내고 집어넣게 되요.

그리고 DB에는 adminadmin     는 같은 문자열 취급이라는 특징도 있죠.

 

그러니 id 입력부분의 글자수 제한을 풀어버리고

 

id에 admin                           a / ps 에 12345678 을 집어넣으면

admin                           aadmin 은 다른 문자열이라서 아이디 중복검사를 통과하게 되는데

입력된 문자열의 길이가 33글자여서 가장 뒤의 a가 잘려나가게 되요.

그러면 DB에 들어가는 문자열은 admin                            인데

DB의 특성상 저거랑 admin 은 같은 문자열로 취급을 하게 되요.

그러니 id admin / ps 12345678 로 로그인을 하면?

 

this flag is only for [???.???.???.???] ->
5d3d2388850b18052485aeaae9e60f55c8e3261d
This admin account will be deleted now...

 

빠밤!

 

키가 나왔네요.

'연구글 > wargame.kr' 카테고리의 다른 글

wargame.kr 13 / img recovery  (0) 2020.10.26
wargame.kr 12 / type confusion  (0) 2020.10.23
wargame.kr 10 / md5_compare  (0) 2020.10.21
wargame.kr 9 / DB is really GOOD  (0) 2020.10.19
wargame.kr 8 / md5_password  (0) 2020.10.13
댓글

10번 문제에요.

배점은 235점, 이름은 md5_compare 에요.

 

md5_compare

 

JUST COMPARE ONLY.

with the other value :D

 

들어가면 입력칸 두개가 있어요.

 

소스를 보면

먼저

if (!ctype_alpha($v1)) {$chk = false};

라인떄문에 첫번째 입력은 무조건 알파벳 집합이어야 해요.

그다음

if (!is_numeric($v2)) {$chk = false};

라인때문에 두번째 입력은 숫자 집합이어야 해요.

그리고

if (md5($v1) != md5($v2)) {$chk = false};

라인으로 두 입력값을 md5해싱해서 같은지 비교를 해요.

 

php에서의 md5에는 유명한 취약점이 있어요.

매직해시라는건데...

해시가 0e 로 시작하고 그 뒤의 문자열이 전부 숫자일경우 0.0 으로 인식을 해요.

 

그러니 첫번째 입력의 알파벳으로만 이루어진 매직해시와

두번째 입력의 숫자로만 이루어진 매직해시를 넣으면 문제가 풀리겠네요.

 

구글링을 통해서 두 해시값을 찾았어요.

QNKCDZO

24061078

이에요.

 

echo ($v1 == $v2);

의 출력이 1 이죠?

 

그러니 저 두 값을 집어넣으면?

 

Congratulations! FLAG is : 7f462c3a5ab9cc7defd7cdcb52ac35f8e4f619c0

 

빠밤!

 

키가 나왔네요.

'연구글 > wargame.kr' 카테고리의 다른 글

wargame.kr 12 / type confusion  (0) 2020.10.23
wargame.kr 11 / tmitter  (0) 2020.10.22
wargame.kr 9 / DB is really GOOD  (0) 2020.10.19
wargame.kr 8 / md5_password  (0) 2020.10.13
wargame.kr 7 / strcmp  (0) 2020.10.07
댓글

9번 문제에요.

배점은 220점, 이름은 DB is really GOOD 이라네요.

DB is really GOOD

 

what kind of this Database?

you have to find correlation between user name and database.

들어가보면 이름 입력하는 공간이 있어요.

입력하고 넘어가면

메모를 입력하는 칸이 나와요.

뭔가를 입력하면

메모가 되는 기능이네요.

그러면 이름에 admin 을 집어넣어볼게요.

admin의 메모에 뭔가가 있겠죠.

dont access with 'admin'

admin으로는 로그인이 안된대요.

여기에다 인잭션을 해야되나 하고 여러 특수문자들을 넣어봤어요.

이것저것 다 넣어보니

????

에러가 뜨네요.

DB 환경이 SQLite 여서 입력받은 / 때문에 오류가 나나봐요.

 

SQLite는 대충 파일 형태의 DB인데,

메모를 입력하면 wkrm_{이름}.db 의 데이터베이스에 저장이 되나봐요.

맞네요.

 

그러니 처음 썼던 test 의 db에 접근해보면

파일이 다운로드 되죠.

그러니 아까 막혀있던 admin의 db에 접근하면?

admin의 DB가 다운로드되요.

그리고 파일을 메모장으로 열어보면?

 

Here is flag!

 

./dhkdndlswdzltng.php

래요.

직접 저쪽으로 가보면?

FLAG is a08cac5bf724573cd5b0fb13f7c94167ef864b06

 

빠밤!

 

키가 나왔네요.

'연구글 > wargame.kr' 카테고리의 다른 글

wargame.kr 11 / tmitter  (0) 2020.10.22
wargame.kr 10 / md5_compare  (0) 2020.10.21
wargame.kr 8 / md5_password  (0) 2020.10.13
wargame.kr 7 / strcmp  (0) 2020.10.07
wargame.kr 6 / fly me to the moon  (0) 2020.09.02
댓글

8번 문제에요.

배점은 213점, 이름은 md5 password네요.

md5 password

md5('value', true);

md5 함수의 두번째 인자 true

어디서 많이 본거같죠?

역시 비밀번호 입력칸이 있어요.

그리고 소스보기 버튼도 있네요.

문제 이름에서 알려줬듯

"select * from admin_password where password='".md5($ps,true)."'"

식으로 쿼리를 날리네요.

이거랑 같은방식으로 풀리는 문제가 webhacking.kr 에 있어요.

두번째 인자가 true 일경우

RAW 형태로 던져주는데

md5("test") 일때
098f6bcd4621d373cade4e832627b4f6
라면,
md5("test", true) 일때
..kÍF!ÓsÊÞNƒ&'´ö
식으로 나오는거에요.

그리고 쿼리문에

where pw='!@%#%!Q@#$'='(*&)%()%&'

같은게 들어오면

1=1 처럼 동작해서 모든값을 뽑아주게 되요.

07001lab.tistory.com/entry/webhackingkr-Challengeold-51-DB

 

webhacking.kr Challenge(old) 51 / DB

51번 문제에요. 배점은 250점, 분야는 DB에요. 어드민 페이지래요. 오른쪽에 소스보기 버튼이 있네요. 눌러보면 id 는 addslashes() 로, pw 는 md5() 로 만들어서 넣는데 md5() 함수의 두번째 인자가 true 네..

07001lab.tistory.com

아무튼 여기서 썼던 스크립트를 그대로 들고와서

돌려보면?

1839431

이래요.

집어넣으면?

hello admin!

Password : dca1a041b3ce1c635e7648df30c75a9fcd7ef1dc

 

빠밤!

 

키가 나왔네요.

'연구글 > wargame.kr' 카테고리의 다른 글

wargame.kr 10 / md5_compare  (0) 2020.10.21
wargame.kr 9 / DB is really GOOD  (0) 2020.10.19
wargame.kr 7 / strcmp  (0) 2020.10.07
wargame.kr 6 / fly me to the moon  (0) 2020.09.02
wargame.kr 5 / WTF_CODE  (0) 2020.09.01
댓글