File Inclusion Attacks


File Inclusion Attack이란 공격자가 php script를 통해 웹서버에 파일을 올리게 하는 것을 가능하게 하는 공격기법이다.

이 취약점은 웹어플리케이션이 사용자에게 파일을 올리거나 업로드 시킬수 있게 할 때에 많이 일어난다.


이 공격은


1.Code execution on the web site

2.Cross Site Scripting Attacks(XSS)

3.Denial of Service(DOS)

4.Data Manipulation Attack


같은 공격에 사용되어 질 수 있다.


이 공격은 2가지로 나누어 지는데

1. Local File Inclusion(LFI)

2. Remote File Inclusion(RFI)

이다.


Local File Inclusion(LFI)

LFI는 PHP계정이 액세스한 파일이 PHP함수인 include 또는 require_once에 파라미터로 들어갈 때에 발생한다.



이 취약점은 페이지가 포함되어야 하는 자리에 파일에 대한 경로가 넣었을 때 필터링을 제대로 거치지 않아서 폴더의 위치를 나타내는 문자열이 들어갔을 때에 발생 할 수 있다.


예를 들어


page = file1.php를 넣었을 때에 이런 창이 뜬다면




?page=/etc/passwd를 넣었을 때에 이런 창을 return할 수 있게 된다.




Remote File Inclusion(RFI)

RFI는 다른 서버에 있는 파일의 위치의 URI가 PHP 함수 "include","include_once","require","require_once"들에 파라미터로 삽입이 될 때에 발생한다.

PHP는 페이지안에 content를 포함한다. 만약에 content가 php 소스코드를 실행시키면 php는 파일을 실행시킬것 이다.

PHP Remote File Inclusion은 취약한 PHP script안에 있는 PHP 코드안에 공격을 감행하여, 웹서버에서 원격으로 조종해 웹을 파괴시키거나 정보를 탈취 당할 수 있는 위험성이 있다.



예를 들면

http://192.168.1.8/dvwa/vulnerabilities/fi/?page=file1.php

http:// 192.168.1.8/dvwa/vulnerabilities/fi/?page=http://google.com

로 page 파라미터에 또 다른 실행을 넣어서 원격으로 조정가능하게 만든다.


사진 출처 및 참조 : http://www.hackingarticles.in/beginner-guide-file-inclusion-attack-lfirfi/

'Hacking' 카테고리의 다른 글

File Inclusion Attacks  (0) 2018.02.01
Oracle Padding Attack[실전편]  (0) 2018.01.31
XSS(Cross Site Scripting)  (0) 2018.01.15
Oracle Padding Attack[이론편]  (2) 2018.01.09
error based sql injection  (0) 2017.09.18

ORACLE PADDING ATTACK[실전편]


앞서 오라클 패딩에 관해서 알아보았다.

그래서 실제로 어떻게 이용되는지를 알아보자.


우선 https://www.vulnhub.com/entry/pentester-lab-padding-oracle,174/에서



동그라미 친 부분을 다운받는다.

그러면 iso파일이 받아지게 된다.


그렇다면 vmware에서 

debian 8.x로(32bit) 새로 virtual machine을 만든다.

이때 network adapter 에서 bridge로 바꾸어 준다.

이 머신을 돌려준 후에

kali linux로 들어간다.


일단 우리는 padbuster 프로그램을 써야하기 때문에

먼저 터미널을 열고

wget https://github.com/GDSSecurity/PadBuster.git

를 쳐서 엔터를 누르면 

padbuster가 깔린다.

그리고 새로만든 virtual machine에서

주소를 알아와야한다.

ifconfig를 치면 나오는 inet addr를 가지고 들어가야 한다.


이제 칼리리눅스 firefox에서

아까 그 주소를 치면

이런 페이지가 뜬다.

이때 register를 누르면

이런 가입 화면이 뜬다.

원하는 아이디를 만들고

log in 버튼을 누르면


로그인이 됐다고 나온다.

그러면 화면 왼쪽 상단에 로그아웃을 누르고




아이디와 비밀번호를 치고 log in 버튼을 누르기 전에,

우리는 burp suite을 사용해 주어야 하기 때문에

먼저 설정을 몇가지 해 주어야 한다.



그리고 burp suite을 쓰기위해서 프록시 설정을 해주어야 한다.

일단 파이어폭스에 들어간 후에

주소창 왼쪽에 줄 버튼을 누르고

거기에 preferences를 누른다.



그리고 옆에 Advanced를 누르고

setting에 들어간다.



거기서 manual proxy configuration을 선택후

http proxy : 127.0.0.1/ 8080을 setting한다.



그리고

burp suite에서 이렇게 설정을 해 주고



burp suite에서 intercept on으로 설정 해주고

홈페이지에서 log in을 누르면


이렇게 패킷을 받을 수 있다.

이 패킷을

위에서 repeater창에 들어가서

아까 받은 패킷을 복사 붙여넣기 해준후

오른쪽 상단의 펜 버튼을 부른다.


그러면 이렇게 configure target details가 뜨고

host에 아까 들어간 홈페이지 주소를

port는 http 포트인 80을 넣어준다.

그리고 go를 누르면 이렇게 화면이 뜬다

이때 밑줄 친 auth를 복사하고

이렇게 터미널에 자신의 auth를 넣고 이런 명령문을 치면된다.

이때 입력창이 뜨면 2를 넣어주면 된다.

그러면 이렇게 user=hi로 해석이 된다.



그렇다면 우리는 admin으로 들어가고 싶기 때문에

맨 끝에

-plaintext user=admin을 처넣어 주면



이렇게 

value 값이 나온다.

이 값을


파라미터에 쿠리 라는 칸을 만들고 value값에다 위에서 얻은 값을 넣어주고

forward를 누르면

이상한 창이 뜬다.(안뜨는 경우도 있는것 같다)


그러면 한번더 forwart를 누르면

params창이 나오고

여기에 다시 우리가 얻은 값을

요렇게 넣어주고

forward시키면


admin으로 접속이 된다.


이렇게 oracle padding attack을 실습 해 볼 수 있다.


물론 이건 단적인 예이지만 이렇게 쓰인다는 것을 알 수 있기 때문에 한번쯤 해보면

감을 잡는 데는 유용할 것 같다.




'Hacking' 카테고리의 다른 글

File Inclusion Attacks  (0) 2018.02.01
Oracle Padding Attack[실전편]  (0) 2018.01.31
XSS(Cross Site Scripting)  (0) 2018.01.15
Oracle Padding Attack[이론편]  (2) 2018.01.09
error based sql injection  (0) 2017.09.18


XSS(Cross Site Scripting)


XSS Cross Site Scripting의 약자로 웹 어플리케이션에서 자주 나타나는 취약점 중 하나로, 웹 사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입 할 수 있는 취약점 이다. 이 취약점으로 해커가 사용자의 정보(쿠키, 세션 등)를 탈취하거나 비정상 적인 기능을 수행 할 수 있게 한다. 주로 다른 사이트와 정보를 교환하는 식으로 작동하므로 Cross Site Scripting이라는 이름을 가지게 되었다.


예를 보자.


인터넷 사이트의 게시판에 이같이 <script>alert(1)</script>라는 스크립트 문을 작성해 올렸다.


그리고 게시물을 클릭하면

1이 뜨는 것을 볼 수 있다.


이와 같이 어떠한 게시글에다가 스크립트문을 삽입해 이용자가 의도하지 않은 사이트, 아니면 다운로드 링크로 빠지게 만들수 있고 쿠키, 세션을 탈취할 수 도 있다.


이것을 막는 방법으로는, 대개 filtering하는 방법이 제일 보편적이고 확실하다.


이것들을 우회하는 방법으로는


1. 대소문자를 구분하는 함수를 이용해 보안을 해 놓았을 경우

 

공격 코드 : ex) <ScripT>alert(1)</SCRipT>

 

  

 

2. 금지어의 값을 Null 처리하는 함수를 이용해 보안을 해 놓았을 경우

 

공격 코드 : ex) <sscriptcript>alert(1)</sscriptcript>

 

  

 

 

3. HTML 태그 속성을 이용한 우회

 

특정 문자열만을 치환하는 방식의 함수가 쓰였을 때에 onmouseover 옵션을 사용하여 우회할 수 있다.

 

<?
 function XSSFilter($inputString)
 {
  $content = str_replace("<","&lt;",$content);
  $content = str_replace(">","&gt;",$content);
  return $content;
 
?>                                                                       

 

위와 같은 코드가 있다고 가정하자. 위 코드는  '<'와  '>' 문자열에 대해서 필터링을 한다.  예를들어 ?file=<script>alert(1)</script>   와 같은 형태로 공격구문을 넣었을 때 필터링과정을 거쳐    &lt;script&gt;alert(1)&lt;/script&gt;  와 같이 출력될 것이다.

 

 

공격 코드 : ex) <img scr="hello" onmouseover="alert(1)l">

 

"hello"라는 이미지 파일에 마우스를 올려 놓았을 경우 스크립트가 실행된다.

 

 

  

 

4. 문자열 분리를 통한 우회


자바 스크립트의 eval 함수를 이용하여 우회한다.

여기서 eval 함수에 대해 짚고 넘어가겠다.

 

eval() 함수의 인자는 기본적으로 문자열이다. 만약 문자열이 표현식을 나타낸다면 eval()은 표현식을 실행하지만, 인자가 있는 경우에는 문장을 반환한다.

 

예를 들어 eval("1+2") 는 3을 반환하지만, eval(new String("2+2")); 는 "2+2" 인 문자열 객체를 반환한다.

이때 변수를 선언하고 그 변수에 객체를 저장한 다음 toString()을 사용하면 이 제약을 피할 수 있다.

ex) var A = new String("1+2");

    eval(A.toString());  => 3을 반환!

 

공격 코드 : var inputString="aler" + "t(al" + "ert" + "(1));" ;

               eval(inputString);


등이 있다.



참조 사이트: http://4rgos.tistory.com/18?category=694721

:https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8C%85

'Hacking' 카테고리의 다른 글

File Inclusion Attacks  (0) 2018.02.01
Oracle Padding Attack[실전편]  (0) 2018.01.31
XSS(Cross Site Scripting)  (0) 2018.01.15
Oracle Padding Attack[이론편]  (2) 2018.01.09
error based sql injection  (0) 2017.09.18


Oracle Padding Attack


oracle padding attack에서 오라클은 흔히 알려진 데이터베이스의 이름으로 쓰여진 것이 아니라 "응답에 대한 판독" 과 같은 뜻으로 쓰였다.

즉 padding이 올바르게 되었는지 여부에 따라 서버의 응답이 다르기 때문에 이것을 이용한 공격을 말한다.

흔히들 알고있는 것 처럼 padding이란 블록암호화에서 모자른 부분들, 즉 틀에서 채우고 남은 부분을 채워주는 것을 말한다.

그 예로,


EX 1을 보면 평문이 3바이트 일 경우 나머지 5바이트를 패딩(0X05)로 채우고 있다.

EX 2 또한 평문이 BANANA인 6바이트 일 경우 나머지 2바이트를 패딩 (0X02)로 채우고 있다.

EX 4인 8바이트 일 경우 나머지 8바이트를 padding으로 채운다는 것이 중요하다.

즉 모든 블록암호화에서는 적어도 한 바이트 이상의 패딩이 들어간다는 것을 알 수 있다.


여기서 CBC모드를 알아야 하는데 CBC란 (Cipher-Block Chaining)의 약자로 서로 엮여 있는 암호 블록이라는 의미이다.


그 예를 그림으로 보자.


위의 그림은 CBC방식으로 암호화 하는 방법이다.


위의 그림은 CBC방법으로 복호화 하는 방법이다.

위의 그림들과 같이 암호화,복호화시 첫 블록의 암호화 값이 두번째 블록에 영향을 미친다.

그리고 첫번째 블록을 암호화 복호화 할 때에는 IV(이니셜 벡터)가 암호문 대신 사용되는 것을 볼 수 있다.



서버응답의 종류


패딩 오라클 공격을 성공하기 위해서는 서버의 응답을 구별하는 능력이 필수적이다.

예로 CBC모드의 블록 암호화를 사용하는 어플리케이션에 조작된 암호문 값을 입력 하였을 경우 서버는 각기 다른 반응을 보이게 된다.


1. 어플리케이션에서 올바른 암호화 값을 받았을 경우(200 OK)

2. 어플리케이션에서 패딩이 올바르지 않은 암호문을 받았을 경우(500 Internal Server Error)

3.어플리케이션에서 패딩은 올바르나 잘못된 암호문을 받았을 경우(암호화된 값을 평문으로 복호화 하였더니 잘못된 값이 있을 경우)

(200 OK - 커스텀 에러 메시지)


위의 3가지 반응을 통해 우리는 암호문의 패딩이 올바른지, 올바르지 않은지에 대해 알수있다.



그 예로 암호분이 7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 라고 예를 들어 보자.

해당 암호문은 다음과 같이 총 3개의 블록으로 나누어 진다.


여기서 첫번째 블록은 이니셜 벡터로 사용되며 나머지 두개의 블록이 평문에 대한 암호문으로 사용되는 것을 볼 수 있다.

여기서 이를 순서대로 IV, 암호문1, 암호문2 로 명명한다.

다음은 평문을 암호화 하는 과정이다.

위의 그림과 같이 IV값에 평문을 XOR하여 Intermediary 값을 만들고 이를 3DES로 암호화 하여 암호문 1이 생성된다.

또한 이때 생성된 암호문1과 나머지 평문(평문+패딩)을 XOR 하여 Intermediary값을 생성한 후 이를 3DES로 암호화 하여

암호문 2를 얻는다. 즉, 암호문은 IV + 암호문1 + 암호문2로 구성된다.

\

이번에는 반대로 복호화 하는 과정이다.

암호문1을 3DES 복호화 한 뒤 나온 Intermediary값을 IV와 XOR 하여 평문 1을 얻었다.

그리고 암호문2를 3DES 복호화 한 뒤 나온 Intermediary 값을 암호문 1 과 XOR하여 평문 2를 얻는다.


이제 패딩 오라클 공격을 통해 암호화된 값을 복호화 하는 방법에 대해 알아 보자.

위에서 사용한 암호문 7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6에서

IV + 암호문1 만 사용하여 7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 까지만 사용하겠다.

먼저, 다음과 같이 IV값을 0으로 채운 암호문을 서버에 전송해보자.


요청 : http://sampleapp/home.jsp?UID=0000000000000000F851D6CC68FC9537858795A28ED4AAC6

응답 : 500 - Internal Server Error

위의 요청에 대한 응답이 500 에러가 뜬다.

왜 그런걸까?


암호문 1을 3DES 복호화 한 뒤 나온 Intermediary 값과 IV 값(0으로 채운) 을 XOR 하여 나온 평문의 마지막 바이트가 올바르지 않은 패딩 값이 되어 에러가 나온 것 이다.

왜냐하면 패딩은 0X01 ~ 0X08 까지 범위이며 해당 수 만큼의 개수가 와야 하기 때문이다.(0X01이면 1개, 0X08이면 8개)

즉, 0X3D는 올바르지 않은 패딩 값으로 인식하여 에러가 나온 것 이다.


이제 패딩이 1개 일 경우를 가정하여, IV의 마지막 바이트를 0X00부터 0XFF 까지 브루트포싱으로 200 OK 응답이 나오는 부분을 확인해 보자

요청 : http://sampleapp/home.jsp?UID=00000000000000003CF851D6CC8FC9537

응답 : 200 OK


IV의 마지막 바이트가 0X3C일 때 패딩이 0X01이 되어 올바른 패딩으로 인식 되었다.

이로써 우리는 결론이 나온다.


[Intermediary 값] ^ 0x3C == 0X01 이므로

[Intermediary 값] == 0x3C ^ 0x01 

그러므로 [Intermediary 값] == 0x3D

패딩에 대한 서버의 반응을 통해 8번째 [Intermediary 바이트 값]을 알아낸다.


이제 패딩이 2개일 경우를 가정해 IV의 7번째 바이트를 0X00~0XFF까지 브루트포싱 해보자.

이때 주의할 점은 IV의 8번째 바이트는 0X3D ^ 0X02 == 0X3F가 된다는 점이다.

서버응답이 200 OK일 때, IV의 값을 살펴 보면 0X0000000000000000243F가 되게 된다.

이로써 7번째 Intermediary 값을 알 수 있게 되었다.

(0x24 ^ 0x02 == 0x26)


이렇게 계속 한바이트씩 브루트 포싱으로 결과를 뽑아내면 된다.

그렇다면 이렇게 Intermediary값을 모두 획득 가능하다. Intermediary값을 모두 획득한다면 암호화 과정에서 최초의 IV 값과 평문을 XOR 하여

Intermediary 값을 생성하게 되는데 이미 Intermediary 값을 알고 있고 IV값도 알고 있기 때문에 그 뒤 작업이 가능하다.

그러므로 획득한 Intermediary 값들과 최초의 IV값을 XOR 하면 평문을 얻을 수 있다.


평문을 조작하여 암호화 하려면 

(원래 평문) XOR (IV) == ( Intermediary 값) 이 되고

(Intermediary) XOR (조작한 평문) == (조작된 IV값) 이 나오기 떄문이다.

즉, (원래 평문) ^ (IV) ^ (조작한 평문) 을 하게 되면, 조작된 IV값이 나오게 되어, 이 조작된 IV값으로 암호문을 복호화 하게 되면 조작한 평문이 나오게 된다.



출처 및 참고:

http://netifera.com/research/poet/PaddingOracleBHEU10.pdf

http://blog.gdssecurity.com/labs/2010/9/14/automated-padding-oracle-attack-with-padbuster.html

http://www.troyhunt.com/2010/09/fear-uncertainty-and-padding-oracle.html

laughfool.tistory.com/attachment/cfile7.uf@135D7C3F4F799B14313DAA.pdf



'Hacking' 카테고리의 다른 글

File Inclusion Attacks  (0) 2018.02.01
Oracle Padding Attack[실전편]  (0) 2018.01.31
XSS(Cross Site Scripting)  (0) 2018.01.15
Oracle Padding Attack[이론편]  (2) 2018.01.09
error based sql injection  (0) 2017.09.18
  1. 질문자 2018.05.02 14:17

    그런데 원래 IV값은 보통 알려져 있는건가요?
    원래 IV값을 모르면 (원래평문)^(원래IV)에서 원래평문을 도출하지 못할텐데 말이죠.
    아니면 어쩌다보니 원래 IV값을 알게 되었다고 가정하는건가요

    • 상감자 상감자 2018.05.02 18:49 신고

      위의 설명을 보면 우리는 iv값을 모르기 때문에 iv값부터 도출해내는 작업해야하죠. 애초에 iv값을 모르기 때문에 우리가 값을 하나하나 넣어서 iv값을 만들어요

error based sql injection 참과 거짓을 error로 구분하는 것인데 보통 if문으로 공격하는 기법.


일단 mysql에서의 if문을 보면

if(조건 , 참 , 거짓) 으로 나타냅니다.

이것으로 참일때 또는 거짓일 때 에러를 출력하게 하면 됩니다.

에러는 서브쿼리를 이용하면 됩니다


예시:

<?php
  
include "./config.php"
  
login_chk(); 
  
dbconnect(); 
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~");
  if(
preg_match('/sleep|benchmark/i'$_GET[pw])) exit("HeHe");
  
$query "select id from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  
$result = @mysql_fetch_array(mysql_query($query));
  if(
mysql_error()) exit(mysql_error());
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>";
  
  
$_GET[pw] = addslashes($_GET[pw]);
  
$query "select pw from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  
$result = @mysql_fetch_array(mysql_query($query));
  if((
$result['pw']) && ($result['pw'] == $_GET['pw'])) solve("iron_golem");
  
highlight_file(__FILE__);

?>

출처 : lord of sqlinjection


위의 예시를 보면 if문에

mysql에서 (select 1 union select 2)를 넣게 되면 Subquery returns more than 1 row 라는 에러가 뜨게 됩니다.

따라서 url에 " ' or id = 'admin' and (if(length(pw)>숫자,(select 1 union select 2),1)#"를 넣으면

숫자에 해당되는 수에서만 error를 띄우지 않습니다.

물론 select 1 union select 2 와 1 의 자리를 바꾸어 준다면 error가 참일때만 발생할 것입니다.

이렇게 알게된 길이를 범위로 잡고

비밀번호를 계속해서 대입시켜준 다음 화면을 txt로 받아 Subquery가 있을 때의 값으로 비밀번호를 찾을수 있습니다. 




'Hacking' 카테고리의 다른 글

File Inclusion Attacks  (0) 2018.02.01
Oracle Padding Attack[실전편]  (0) 2018.01.31
XSS(Cross Site Scripting)  (0) 2018.01.15
Oracle Padding Attack[이론편]  (2) 2018.01.09
error based sql injection  (0) 2017.09.18

+ Recent posts