본문 바로가기

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
댓글