티스토리 뷰

WEB/WEB HACKING

2-5) RFI, SQL Injection

chrisysl 2018. 3. 21. 18:08

PHP 취약점 중 RFI에 대해 알아보자.


RFI ( Remote File Include )

 : 파일을 include 할 때 생기는 취약점


include

require 'db.php';

등 위와같이 php코드로 작성된 외부의 파일을 읽어오는 경우 생기는 취약점중 하나로 RFI 가 있다.


 - 원격 파일도 include 가능(로컬파일에 있는 php코드 뿐 아니라 원격지에 있는 파일도 include 가능)

 - URL 형태로 include 가능(PHP 기능중 하나)



# 위와같이 기능하려면 php설정 중 url_include설정을 On 으로 켜줘야 한다.

그다음 restart를 해줘서 설정이 적용되게 해준다.






# zboard/skin/zero_vote 경로에 접근하여 파일을 봐보면 객체에 접근이 가능한 것을 알 수 있다.






1). 객체에 대한 직접 접근


/var/www/html/zboard/skin/zero_vote 는 웹 루트의 하위디렉토리이기 때문에 접근이 가능하다.

즉, 객체에 대한 직접접근이 가능하다는 것.


# error.php 파일을 열어 확인해보면 최상단에 어떤걸 인클루드 하고 있다.


$dir 과 같이 표시된것을 통해 변수임을 알 수 있다.

즉, 외부에서 어떤 변수를 인클루드 하고있다는얘기.



2). 입력값에 대한 검증이 되어있지 않음 


외부에서 들여온 값이기때문에, 해당 변수를 사용할 수 있다는 말이 된다.



이 두가지가 합쳐저서 심각한 보안 허점을 만들어낸다는것.







# echo로 변수를 출력하여 실제로 외부변수에 대한 제어가 가능한지 확인해보자.

URL의 뒷부분에 dir=test를 입력하여 변수에 값을 대입해보자.

위에서 설정한대로 url 옵션이 켜져있으면, 이 위의 결과가 test/value.php3로 dir변수에 값의 대입이 가능한 것을 알 수 있다.

이게 RFI 이다.






# value.php3 파일을 html 디렉토리 경로에 만들어주고






# 위와같이 작성하여 이 php파일을 실행시 해당 파일에 접근할 수 있는 코드를 작성해두자.






# 변수인 dir에 value.php3 이 저장된 url값을 준다.

다시말해 100.100.100.110의 홈 디렉토리에 있는 value.php3 파일을 읽어들이게 되고

그 value.php3 파일에는 좌측과 같은 코드가 들어있으므로 이 결과값이 출력되게 된다.


즉, 파일을 업로드해야만 타겟서버에서 내 프로그램이 실행되게 할 수 있는것은 아니다. 






#)_ 참고

NAT 로 통신이 설정되어있으면 통신이 안되기때문에 URL 을 입력해도 먹히지 않는다.

bridge로 설정하는법에 대해 알아보자



# 먼저 vm웨어의 설정을 변경해주어야 한다. 






# 네트워크 설정을 bridged로 바꿔준다. 






그다음 IP 를 수동으로 잡아줘야한다.

#> cd /etc/sysconfig/network-scripts/ 경로의 ifcfg-eth0 파일을 수정해준다.

BOOTPROTO = static 으로 변경

그리고 하단 다섯줄을 추가해줘야한다.

윈도우즈 IP의 로컬영역연결 IPv4 주소 중 맨 마지막자리 3자리에 100을 더한 주소를

IPADDR=000.000.000.여기에 이어서 작성해준다.



즉, 네번째 세자리숫자 영역에 기존 window IPv4 주소의 100을 더한 값을 대입시켜준다.

NETMASK=255.255.255.0

GATEWAY=192.168.3.1

DNS1=168.126.63.1

DNS2=168.126.63.2

이렇게 작성해주면 된다. 환경에 따라 다르니 본인의 환경에 맞게 설정할 수 있어야 한다.



# 참고



다시 NAT로 바꾸려면 vm웨어 설정을 NAT로 돌리고 BOOTPROTO를 dhcp로 바꿔주고 reboot 하면 된다.






이거 말고 동일한 취약점을 가지고있는 파일들이 존재한다.

소스코드를 알고있다고 가정하면, grep 명령어를 통해 include, require 등의 키워드를 검색하여 확인 가능하다.






SQL Injection

 - SQL을 이용한 공격기법


PHP file download 취약점도 SQL Injection 을 이용한 공격기법중 하나다.

파일을 다운로드할때 취약할 수 있는 인젝션이 존재한다. 


다운로드 링크를 클릭하면 어떤일이 벌어지는가? 부터 먼저 봐야한다.

# 링크를 클릭하면 download.php 가 실행된다는걸 알 수 있다.






정확하게는 다운로드 횟수를 늘려주는 부분에 취약점이 존재한다.

download.php 가 실행이되면 update 쿼리가 실행이 될 것이다. 

download.php를 확인해보자.






update 쿼리를 실행하는 부분을 찾아본다.

# 변수에 할당된 값이 뭔지 알아보자.






mysql_query("update $t_board"."_$id set download".$filenum."=download".$filenum."+1 where no='$no'");

이 쿼리는 DB에 입력될 때

UPDATE zetyx_board_vul SET download1=download1+1 WHERE no='$no'

이렇게 입력이 될 것이다.



그렇다면 이게 왜 취약한가?

zetyx_board_vul은 값을 변경할 수 없다.

단, 외부에서 정의되는 $id, $filenum, $no은 얼마든지 조작이 가능하다.


입력값을 조작하면 쿼리가 바뀐다. 그래서 인젝션이라 부르고 '삽입한다' 라는 의미이다.

변수를 조작해서 쿼리에 특정값을 주입 하는 것이다.

원래 쿼리가 아닌 특정값을 주입하여 변화를 주는것을 말한다.


그래서 어떤입력값을 조작했을때 에러가났다는 의미는 내가 프로그램에 개입하고있다 는 의미가 된다.

모든 취약점은 에러다. 모든 에러가 취약점이 될수는 없지만 모든 취약점은 에러의 한 종류다.

변수가 외부에서 정의되는데, 검증을 하지않고 있기에 쿼리를 바꿀 수 있다.


그럼 이러한 정보를 바탕으로 의미있는 즉, 내가 원하는 정보를 얻어내려면?

주석을 이용해서 내가 원하는 정보를 얻어낼 수 있다.


mysql 이 사용하는 주석은 3가지다

--, #, /* */

url 내에서는 #이 구분자이기때문에 URL에 입력해도 무시된다.


그럼 어떻게 url에 주석을 입력할까?

url에 아스키코드값을 넣어 입력해주면 쿼리안에서는 #으로 입력이 된다.

그러므로, url에서는 %23이 #이 된다. 


이어서 SQL injection에 대해 더 알아보도록 하자.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함