./upload/ChU92oQ7XoBb/index.php?view_source=1 를 클릭했더니 php코드가 나왔다.
$result 쿼리문에서 값이 출력되면 /flag를 보여준다는 내용이다.
그런데 이전 SQL Injection문제들과 다르게 쿼리문에 우리가 직접 삽입할 수가 없다.. (,,•ㅅ•,,)
파일 업로드 취약점인가 하고 py,php 확장자를 가진 파일을 업로드해봤지만 아무 반응도 없었다.
소스코드 외에는 취약점을 찾을만한게 없어서 계속 구글링해보니, mysqli_connect 함수에 아무런 파라미터값이 없는 것이 문제라는 것을 알게 되었따...ㄟ( ・◇・ )ㄏ
먼저 mysqli_connect 함수를 알아보자 !
mysqli_connect함수는 host, username, passwd, dbname, socket 인자로 구성된 php에서 MySQL과 연결해주는 함수이다. 만약 해당 함수에 인자 값을 지정해주지 않으면, ini_get함수를 통해 디폴트 값을 가져오게 된다.
그리고 ini_get함수는 php.ini 파일에서 값을 가져오게 되는데, 이 때 php.ini에 있는 값들은 .htaccess에서 지정해줄 수 있다.
php공식 사이트(https://www.php.net/manual/en/ini.list.php)에 가서 디폴트 값을 확인해보니, port번호는 3306이고 socket, host, user, pw는 모두 NULL값으로 설정되는 것을 볼 수 있었다.
이제 개인서버에 데이터베이스 'chall30'를 만들고, flag 칼럼을 가진 chall30_answer테이블을 만들어야한다.
그 다음, 이 테이블에 접근하기 위한 계정을 생성해야한다.
계정 생성 명령어는 GRANT ALL PRIVILEGES ON DB명.TABLE명 TO '계정아이디(접속계정)'@'host(접속IP)' IDENTIFIED BY '비밀번호'; 구조이다.
계정을 생성하고, .htaccess파일을 만들어 업로드시키면 된다 !!
php_value mysqli.default_host "IP주소:3306"
php_value mysqli.default_user "계정명"
php_value mysqli.default_pw "계정 비밀번호"
FLAG값 등장 (*•̀ᴗ•́*)و
+) 사실 이 문제 푸는데 엄청 헤맸다..,.,(´•̥ω•̥`)
.htaccess파일 업로드하면 계속 권한이 없다고 Forbidden 메세지가 출력됨..ㅜㅠㅠ
외부 서버가 DB에서 데이터를 가져갈 수 있게 해주려면, 계정 생성할 때 어떤 IP에서도 mysql 로그인이 가능하도록 host를 %로 바꿔줘야한다고 한다. 또 grant all privileges를 해줘야 어떤 IP(%)에서든 접근한 계정에서 DB내부의 데이터에 접근할 수 있다고 한다.
그리고, /etc/mysql/mysql.conf.d/mysqld.cnf로 가서 bind-address=127.0.0.1을 주석처리해줘야 한다.
출처
'WEB > webhacking.kr (old)' 카테고리의 다른 글
webhacking.kr 57번 (0) | 2020.03.29 |
---|---|
webhacking.kr 45번 (0) | 2020.03.22 |
webhacking.kr 44번 (0) | 2020.03.19 |
webhacking.kr 40번 (0) | 2020.03.19 |
webhacking.kr 4번 (0) | 2020.02.23 |