PHP 코드 인젝션?

웹 애플리케이션을 통해서 PHP 코드를 입력하면, 웹 애플리케이션의 입력을 정상적으로 인식하여 개발자가 의도한 바와 다르게 내부에 있는 PHP 코드를 실행하는 기법이다.
모르면 직접 해보도록 하자.


    실습

PHP로 이동하고

위와 같은 내용이 뜬다.
저기서 message...는 하이퍼링크이다. 일단 눌러보자.


이제 척하면 감이 온다.

우리가 해야하는 것은 PHP 인젝션이므로 message파라미터에 PHP 함수를 쓴다면 ??
pwd명령을 불러와 보자.

입력할 명령어는 system("pwd");

바로 결과가 뜬다.
그런데 왜 2개가 뜨는건지는 소스코드를 봐야할 것같다.

(가독성을 위해 Bee-Box서버의 소스코드를 notepad++로 옮겨온 것)
위가 메인 소스코드이다.

빨간사각형은 Low레벨, 파란사각형은 Medium, High레벨의 함수이다.

Low레벨의 소스코드를 해석해보면
php코드를 실행시키는 eval함수를 사용하는데, echo [message파라미터값];
이렇게 끝나게 된다.

내가 message값으로 system("pwd")를 주었기 때문에
실행되는 php코드는 echo system("pwd");가 된다.
값이 2번 출력되는 이유는 우선 system("pwd")함수를 통해 pwd의 결과를 출력하고,
그 결과를 echo함수가 또 출력해주는 식이라 2번 출력이 되는 것이다.


    보안방법

위에 그림을 또 재탕해서(..) 파란사각형에 있는 내용이 보안방법이 되겟다.
htmlspecialchars함수를 통해 필터링과정을 거친다.
htmlspecialchars함수에 있는 2번째 파라미터에 ENT_QUOTES가 있는데, 이 녀석의 역할은 XSS(Cross Site Scripting)에 사용되는 특수문자들을 HTML문자로써만 인식하게 만든다.


    공격 시나리오

공격자PC(192.168.80.134) 칼리리눅스에 netcat모드를 1234포트를 이용하여 listen상태로 만들어둔다.
netcat에 대한 설명은 생략하겠다. 찾아보면 금방나온다.


바로 브라우저에 입력값을 아래와 같이 입력한다.


그리고 아까의 터미널로 돌아가면

이렇게 자유롭게 bash쉘을 쓸 수 있는 것을 볼 수 있다.
여기까지 우리는 Bee-Box의 쉘을 따낸것이라고 보면된다. (root는 아니지만)

여기서 파일을 생성과 삭제를 하거나 백도어를 심음으로써 지속적으로 Bee-Box서버를 괴롭힐 수 있게된다.

나는 예시로 파일을 만들어 보았다.

빨간색사각형이 필자가 입력한 명령어
이제 브라우저 들어가서 직접 찾아가면..

예상대로 조건부로 서버를 주물럭거릴수 있게되었다.


'Penetration Testing > Bee-Box' 카테고리의 다른 글

PHP - addslashes 함수  (0) 2018.02.21
[Bee-Box] SSI 인젝션  (0) 2018.02.21
[Bee-Box] OS 커맨드 인젝션  (0) 2018.02.14
htmlspecialchars 함수에 대해  (0) 2018.02.13
[Bee-Box] iframe Injection  (1) 2018.02.13

    OS 커맨드 인젝션

취약한 변수를 이용하여 시스템 명령어를 주입하고 운영체제에 접근하는 공격이다.
이를 이용하여 보통 웹 페이지에서 서버의 시스템 셸을 호출할 때 관리자가 의도한 명령어가 아닌 다른명령어를 주입하여 시스템의 정보를 얻어낸다.
실습을 통해 알아보도록 하자.


    OS 커맨드 인젝션 실습

Bee-Box에서 이동하는 방법은 이제부터 생략하겠다. 

첫 실행하면 위와 같이 뜬다.
간략하게 DNS lookup의 역할을 설명하자면, 도메인을 입력하면 매칭되는 IP를 보여주는 역할을 한다.


저기서 Lookup 버튼을 눌러보면

위와 같이 리눅스에서 DNS Lookup의 결과가 출력되게 된다.



추가적으로 GET방식으로 데이터를 전송하지도 않고, Burpsuite를 통해 POST 방식인 것을 알 수 있다.



그렇다면 이번에는 리눅스 시스템 명령어인 ls -l을 입력해보자.

위와 같이 입력하고 Lookup버튼을 누르면 상당한 시간이 걸리고


위와 같은 결과가 뜬다


왜냐하면 입력칸에 입력하는 문구는 
lookup 명령어로써 인자의 역할을 하기 때문이다.
nslookup을 예로 들어 내가 저기에 ls -l을 입력했다는 것은


"nslookup ls -l"이 입력이 된걸로 인식하게 된다.
ls -l은 도메인이 아니기 때문에 오류를 뿜는 것이다.


그렇다면 생각을 더해봐서, nslookup도 하나의 시스템 명령어이고, 결국 저기에 넣는 것은 어쨋든 시스템 명령어를 통해 실행되지 않는가?
그러면 저 입력칸에 시스템 명령어를 악의적으로 삽입한다면 내가 원하는 결과를 뽑을 수 있을 듯 하다.



리눅스상에서 명령어를 여러개 입력할 때 세미콜론(;)이 있다.
이를 이용하여 이번에는 ;ls -l을 입력해 보았다.

Wow...


그렇다면 현재 경로는 ?

경로도 바로 표시해준다.
만약 이를 악용하여 해커가 웹 시스템을 쥐었다폈다한다면...? 생각만해도 끔찍할 것이다.



    보안방법

난이도 중(Medium),상(High)로 설정해놓고 똑같이 실행하면 당연히 안 될 것이다.
Bee-Box서버로 가서 commandi.php 소스코드를 열람해보자.

위 스크린샷이 필터링을 하는 부분이고, 중과 상 난이도가 각각 commandi_check_1, commandi_check_2함수를 사용한다.
마찬가지로 필터링 함수들이 담겨진 소스코드 functions_external.php를 보도록 하자

위와 같은 필터링 함수들이 보인다.

우선 중 난이도에는 str_replace함수를 통해 기본적인 문자를 필터링 하는 것이 보였다.
str_replace 함수란 세번째 인자가 가리키는 변수내의 내용중에 첫번째 인자를 두번째 인자값으로 바꿔다시 저장하는 것이라고 보면 된다.

상 난이도에서는 escapeshellcmd라는 함수를 쓰는데 이 함수의 역할은 세미콜론(;)을 포함한 쉘 명령어로 보이는 문구들을 죄다 회피처리를 시켜주는 역할을 한다.
회피하는 특수 문자들로는 #,&,;,',|,*,?,~,<,>,^,(,),[,],{,},$,\,\x00,\xFF 등 너무너무 많다.


bee-box 문제들을 보면서 정말 많이 나오는 필터링 관련 함수라서 따로 문서를 작성한다.


우선 역할부터 적자.


문장내에 HTML코드가 들어가는 특수문자를 포함시켜 입력하고 화면으로 출력할 때, HTML의 특수문자가 HTML태그로 적용되는 것이아니라 일반 문자로 인식되어 그대로 출력되게 해주는 역할이다.


바꾸는 문자로는 예시로


&는 &amp;로 바꾼다.

"는 &quot;로 바꾼다.

'는 &#039;로 바꾼다.

<는 &lt로 바꾼다.

>는 &gt로 바꾼다.


의 기능들이 있다.



'Penetration Testing > Bee-Box' 카테고리의 다른 글

[Bee-Box] PHP 코드 인젝션 (PHP Code Injection)  (0) 2018.02.20
[Bee-Box] OS 커맨드 인젝션  (0) 2018.02.14
[Bee-Box] iframe Injection  (1) 2018.02.13
[Bee-Box] HTML Injection (GET, POST)  (0) 2018.02.12
Bee-Box 사용하기  (0) 2018.02.11

    iframe Injection ?

iframe에 대해서 먼저 알아야 할 거 같다. 쉽게말해 웹 페이지 하나가 있으면 그안에 여러개의 웹 페이지로 또 나눠서 표시해 주는 틀 역할을 한다고 생각하면 된다.

iframe Injection은 별다를것 없다. 나눠진 틀에 웹 페이지가 여러개이니 그 중 한곳이상 공략하면 해커가 원하는 공격에 성공하게 된다.
(너무 간단한가?)

주요 공격방법으로는 악성 URL을 특정 iframe영역에 심어두고 size를 0으로 조정함으로써 숨기는 방법을 사용한다.



    iframe Injection 실습

실습페이지 이동

위와 같은 화면만 덩그러니 출력된다.
이럴경우 일단 소스코드를 열람해보면

파이어 폭스의 개발자 도구를 이용하여 소스코드를 본 모습이다.
<div id="main">
    <h1>iFrame Injection</h1>
    <iframe src="robot.txt" frameborder="0" height="250" width="250"></iframe>
</div>
위의 소스코드가 코어가 될 듯하다.
그리고 파란색으로 친 부분 중 제목을 제외한 내용들은 robot.txt의 파일임을 알 수 있다.

이제 이 iframe을 내가 원하는 페이지로 바꿔보도록 하겠다.
우선 그전에 맨 상단에 있는 그림을 보면

그렇다 iframei.php라는 페이지는 GET방식이고 이를 통해 ParamUrl을 통해 가져올 페이지, 그리고 iframe의 크기로 예상되는 값들(ParamWidth, ParamHeight)을 가져오는 것을 확인할 수 있다.
음.. 간단히 robot.txt를 www.naver.com으로 바꿔보자
(네이버 성애자)

당연히 되지 않는다.
왜냐하면 이 녀석은 로컬에 있는 페이지만 가져오기 때문이다.
네이버는 로컬에 있는 페이지가 아니기 때문에 실패한 것이다.

그렇다면 내가 원하는 페이지를 만들고 그것의 경로를 지정해 주면 어떻게 될까?

바로 ㄱㄱ해보자

우선 공격자가 Bee-Box 서버를 쥐고있다는 가정하에 직접 접속하여 파일을 만들어 주었다.
참고로 /var/www/bWAPP은 bee-box의 웹 홈 디렉토리

ㅇㅋ 준비되써

공격 성공

에엥? 그러면 이건 단순히 HTML 인젝션 아니냐? 

그래서 더 해보았다.
적어도 닉값은 해야하니깐

바로.. 직접 iframe 태그를 사용하여 URL에 삽입해보는 것이였다.
입력 코드는 아래와 같다.
http://192.168.80.128/bWAPP/iframei.php?ParamUrl=robots.txt"></iframe><iframe src="attack.php" width="250" height="250"></iframe>&ParamWidth=250&ParamHeight=250
위의 빨간색으로 칠한 코드를 해석하면 "></iframe>까지에 대해서 설명해보겠다.
처음 원조 소스코드를 보면

위와 같은데, 이때 원래 페이지는 robot.txt와 각각 높이,너비를 GET방식으로 파라미터에 전달하여 robot.txt를 iframe으로 표시를 하게된다.
하지만 내가 저기서 "></iframe>을 입력한 순간
<iframe src="robot.txt"></iframe>"hieght="250" witth="250">
원래 코드는 위와 같이 바뀌게 되고 뒤의 "hieght="250" witth="250">는 그냥 문자처리가 되어버리게 된다.
(frameborder="0"은 어디로 갔는지 모르겠다. 아시는분 좀 알려주세요.)
이후에 새로운 iframe을 추가하여 attack.php를 추가하였다.

이제 직접 공격해보면


두개의 iframe으로 나누어지고 각각 robot.txt와 attack.php가 출력됨으로써 성공한 것을 볼 수 있다.


여기서 실제로 공격을 한다면 공격페이지의 iframe의 크기를 전부 0으로 해버리면
http://192.168.80.128/bWAPP/iframei.php?ParamUrl=robots.txt"></iframe><iframe src="attack.php" width="0" height="0"></iframe>&ParamWidth=250&ParamHeight=250

이렇게 가릴수 있어. 피해자는 정상적인 반응이라고 생각하고 피해를 입게된다.
또 추가적으로 아래의 "hieght="250" witth="250">가 거슬린다면
robot.txt의 iframe영역을 길게 늘려줘보자. 스크롤을 내리지 않는한 피해자는 모를것이다.






    보안방법

보안방법을 알기 위해 난이도를 medium 또는 high로 올려서 확인해보자
똑같이 공격을 시도해보면

아무일도 없었다.

iframei.php소스코드를 보기 위해 bee-box 서버로 이동해서 확인하자.

전체적인 코드는 직접 보면 알겠지만 길지는 않다
처음에 php언어로 상단과 같은 코드파일들을 include하고 주 역할이 보안레벨을 체크하는 것으로 보였다.

아랫줄로 더 내려가면

위와 같은 코드가 나오게 된다. 각각 레벨이 높을수록 보안레벨이 있는 것으로 보인다.
case 2일 경우가 high인 경우이므로 xss_check_3($data)함수로 이동을 해보기로했다.
저 함수는 functions_external.php라는데에 정의되어 있다고 한다.


찾은 함수를 보면 HTML의 특수문자들을 변환한다고 되어있다.
이후 htmlspecialchars함수를 통해 utf-8로 반환한다.

정리하자면, iframe Injection을 방어하기 위해서는 평문으로 오는 악의적인 HTML태그들을 HTML태그들로 인식되지 않게 UTF-8 등으로 인코딩하는 과정이 필요하다.



정리 끝났고 난 High레벨을 풀어야지.. 헤헤


'Penetration Testing > Bee-Box' 카테고리의 다른 글

[Bee-Box] OS 커맨드 인젝션  (0) 2018.02.14
htmlspecialchars 함수에 대해  (0) 2018.02.13
[Bee-Box] HTML Injection (GET, POST)  (0) 2018.02.12
Bee-Box 사용하기  (0) 2018.02.11
공부하면서 사용할 책  (0) 2018.02.10

    인젝션의 정의

공격자가 어플리케이션에 악의적인 쿼리를 넣으면 그것이 정상적인 동작으로 어플리케이션이 인식하여 악의적인 동작이 수행되게 하는 공격이다.



    그렇다면 HTML 인젝션은 무엇?

코드 인젝션 종류의 하위 개념
취약한 매개변수에 악의적인 HTML 코드를 삽입하여 공격


    HTML Injection - Reflected (GET) 공격 실습

Bee-Box에 bee/bug로 각각 ID. PW로 입력하여 로그인한다.

이후에 choose your bug를 통해 아래와 같이 설정


우선 HTML 인젝션이란 개발자가 입력된 검증값을 넣어두지 않아서
해커가 HTML관련 태그들을 브라우저를 통해 삽입함으로써 개발자가 의도하지않은 행위가 일어나는 공격기법이다.



정의는 여기까지 하고 우선 레벨 Low로 실습을 해보자.
위와 같이 HTML Injection - Reflected (GET) 그리고 low로 셋팅하면 아래와 같이 이미지가 뜬다.


여기서 First name에는 123, Last name에는 abc를 입력하고 Go를 눌러보면


위와 같이 Welcome 123 abc이라고 뜬다.

우리가 해야할 것은 HTML 인젝션이라고 했으니 HTML 태그들을 섞어보자.
이번에는 <h1>Hello</h1> 그리고 <img src="https://lh3.googleusercontent.com/DjUgn0hqwzO0hw4NchiE4r66I5vutBFZQWsL0nct8gFTkzRhBIAZmyXPdtyzD4-hKGM=w300"> 를 입력해보자(네이버로고 이미지 주소)

그러면

아래와 같이 HTML 인젝션이 성공된 것으로 확인할 수 있다.

이어서 이제 레벨을 Medium, High로 올려서 따로 풀어보도록 하자.



    HTML Injection - Reflected (POST) 공격 실습

앞서서 한 GET과 POST 방식에는 차이점이 있다.

GET방식은 위와 같이 URL을 통래 값이 전달된다는 점이고 POST방식은 데이터를 통해 전달된다는 점이다.
데이터를 통해 전달된다는 것은 즉 Burpsuite같은 프록시 도구로 데이터를 볼 수 있다는 점이다.
(물론 GET도 볼 수 있지만 굳이 그러는 경우는 없다고 한다.)

이번에는 아래 그림과 같이 설정해 페이지를 바꿔주자.


그러면 아래와 같이 화면이 출력될 것이다.
이번에도 마찬가지로 <h1>Hello</h1> 그리고 <img src="https://lh3.googleusercontent.com/DjUgn0hqwzO0hw4NchiE4r66I5vutBFZQWsL0nct8gFTkzRhBIAZmyXPdtyzD4-hKGM=w300" width="100px" height="100px"> 를 입력해보자
(짜잘하게 그림이 너무커서 크기를 조절했다.)

동일하게 잘 출력되는 것을 확인.
이제 이것을 버프 슈트로 보기 위해서 프록시 설정을 해주고 burpsuite를 대기시켜놓자.

필자는 Kali Linux를 사용하므로 위와 같이 설정

대기중인 burpsuite

이제 준비는 되었으니 아까와 같이 입력을 해보자.

그렇게 위와 같이 데이터가 캡쳐가 되는 것을 확인할 수 있다.
아래 firstname과 lastname의 값이 들어가있고 각 특수문자들은 URL인코딩이 되어 있는 것을 확인할 수 있다.
위 값은 수정해서 얼마든지 forward시킬 수 있다.

이 방법을 이용하여 Medium과 High레벨도 풀어보도록 하자.


'Penetration Testing > Bee-Box' 카테고리의 다른 글

[Bee-Box] OS 커맨드 인젝션  (0) 2018.02.14
htmlspecialchars 함수에 대해  (0) 2018.02.13
[Bee-Box] iframe Injection  (1) 2018.02.13
Bee-Box 사용하기  (0) 2018.02.11
공부하면서 사용할 책  (0) 2018.02.10

+ Recent posts