'분류 전체보기'에 해당되는 글 438건

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

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

반응형

1. 문자열 내 한 문자씩 대문자로 변환

1
2
for i in range(0,len(string)):
    print(string[0:i]+string[i:i+1].upper()+string[i+1:len(string)])
cs



2. 해당 문자열로 가능한 모든 대소문자 배열 생성

1
2
3
for i in range(0,len(string)):
    for j in range(i,len(string)):
        print(string[0:i].upper()+string[i:j]+string[j:j+1].upper()+string[j+1:len(string)])
cs



반응형
블로그 이미지

rootable

,

IOS Pinning bypass

2020. 3. 4. 14:00

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

LDAP Injection

Hacking/Web 2020. 3. 4. 13:43
반응형

본 글은 blackhat.com에서 공개한 LDAP Injection & Blind LDAP Injection을 번역&정리한 것입니다.

생략된 부분이 많기 때문에, 자세히 알기 위하신 분들은 아래 pdf 파일을 참고하시기 바랍니다.


출처 : https://www.blackhat.com/presentations/bh-europe-08/Alonso-Parada/Whitepaper/bh-eu-08-alonso-parada-WP.pdf



1. LDAP 개요

LDAP 필터들은 RFC 4515에 다음과 같이 정의되어 있다. 이러한 필터들의 구조는 다음과 같이 요약될 수 있다 : 

Filter = ( filtercomp )

Filtercomp = and / or / not / item

And = & filterlist

Or = | filterlist

Not = ! filter

Filterlist = 1*filter

Item = simple / present / substring

Simple = attr filtertype assertionvalue

Filtertype = "=" / "~=" / ">=" / "<="

Present = attr = *

Substring  attr "=" [initial] * [final]

Initial = assertionvalue

Final = assertionvalue


모든 필터는 항상 괄호 안에 있어야하며, 오직 논리와 관계와 관련된 연산자들만 그것들을 구성할 수 있다.

특수한 문자인 "*"은 필터들의 구성에서 하나 혹은 많은 문자들을 대신하여 사용될 수 있다. 


논리연산자를 제외하고, RFC 4256에서 독립적으로 사용할 수 있도록 허용된 두 특수 상수들이 있다 :

 - (&) : 절대 참

 - (|) : 절대 거짓


2. 공통적인 LDAP 환경들

거의 모든 환경에서, LDAP 서비스를 기반으로 한 어플리케이션들은 다음의 목적들 중 하나의 디렉토리를 사용한다.

 - 접근제어(user/password 기반 검증, 사용자 인증거 관리)

 - 권한 관리

 - 자원 관리


3. Web Applications 에서의 LDAP Injection

가장 널리 사용되는 LDAP인 ADAM과 OpenLDAP에서  [1. LDAP 개요] 에서 설명한 LDAP 필터 구조의 구현에 대해 알아보자.

 

※ (attribute=value) 

 : 만약 쿼리 구조에 논리연산자(OR 또는 AND)가 존재하지 않다면, "value)(injected_filter"와 같은 injection은 두 필터에서 다음과 같은 결과일 것이다 : (attribute=value)(injected_filter) 

 : OpenLDAP에서는 두번째 필터가 무시되어 오직 첫번째 것만 실행될 것이다. 

 : ADAM에서는 두 필터를 가진 쿼리가 허용되지 않는다. 그러므로 injection은 불가능하다.


※ (|(attribute=value)(second_filter)) or (&(attribute=value)(second_filter))

 : 만약 쿼리 구조에 논리연산자(OR 또는 AND)가 존재한다면, "value)(injected_filter)"와 같은 injection은 다음과 같은 결과일 것이다 : (&(attribute=value)(injected_filter))(second_filter))

 : 비록 필터가 심지어 구문적으로 올바르지 않더라도, OpenLDAP은 첫번째 필터가 끝난 이후의 어떠한 문자든 무시를하며 왼쪽에서부터 오른쪽으로 처리를 시작할 것이다.

 : 일부 LDAP Client web components는 두번째 필터를 무시하고 ADAM과 OpenLDAP에 오직 첫번째 완성된 것만 보내어 injection이 허용될 것이다.


몇몇의 어플리케이션 프레임워크들은 그것을 LDAP 서버로 보내기 전에 필터가 올바른지 체크할 것이다. 이러한 경우, 필터들은 구조적으로 올바르게 되어있어야 하므로 injection은 다음과 같이 만들 수 있다 : "value)(injected_filter))(&(1=0"

이것은 결과적으로 두개의 다른 필터를 만들고, 두번째는 무시될 것이다 : (&(attribute=value)(injected_filter))(&(1=0)(second_filter))


두번째 필터가 LDAP Server에서 무시되게 될 경우, 일부 구성요소들은 두 필터를 가진 LDAP query를 허용하지 않을 수 있다. 이러한 경우 단일필터 LDAP query를 얻기 위해서는 특별한 injection이 만들어져야 한다.

injection이 "value)(injected_filter"와 같으면 결과는 다음과 같을 것이다 : (&(attribute=value)(injected_filter)(second_filter)).



이후 상세한 쿼리 및 예제들은 그림과 함께 보는 것이 이해가 빠르므로 출처 PDF를 참고해주시기 바랍니다.

반응형

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

[root-me] NoSQL injection - Blind  (0) 2020.03.05
[root-me] Local File Inclusion - Wrappers  (0) 2020.03.05
Study of XXE  (0) 2020.03.03
PHP wrapper  (0) 2020.03.02
JWT Signature - RS256 to HS256  (3) 2020.02.27
블로그 이미지

rootable

,

Study of XXE

Hacking/Web 2020. 3. 3. 00:03
반응형

root-me의 XML-External-Entity 문제를 풀다가 XEE가 발생되는 취약한 소스코드는 어떻게 이루어져 있는지, 그렇다면 어떻게 대응해야하는지 연구해보았다.


일단, 해당 문제의 소스코드는 다음과 같이 이루어져 있다. 이 중 처음보거나 헷갈리는 코드에 대해서 상세히 알아보자.


1. 코드분석

<?php


echo '<html>';

echo '<header><title>XXE</title></header>';

echo '<body>';

echo '<h3><a href="?action=checker">checker</a>&nbsp;|&nbsp;<a href="?action=auth">login</a></h3><hr />';



if ( ! isset($_GET['action']) ) $_GET['action']="checker";


if($_GET['action'] == "checker"){


libxml_disable_entity_loader(false);

libxml_use_internal_errors(true);


echo '<h2>RSS Validity Checker</h2>

<form method="post" action="index.php">

<input type="text" name="url" placeholder="http://host.tld/rss" />

<input type="submit" />

</form>';



if(isset($_POST["url"]) && !(empty($_POST["url"]))) {

$url = $_POST["url"];

echo "<p>URL : ".htmlentities($url)."</p>";

try {

                    $ch = curl_init("$url");

                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

                    curl_setopt($ch, CURLOPT_TIMEOUT, 3);

                    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0); 

                    $inject = curl_exec( $ch );

                    curl_close($ch);

                    $string = simplexml_load_string($inject, null, LIBXML_NOENT);

                    if ( ! is_object($string)) throw new Exception("error"); 

                    

                    foreach($string->channel->item as $row){

        print "<br />";

        print "===================================================";

        print "<br />";

        print htmlentities($row->title);

        print "<br />";

        print "===================================================";

        print "<br />";

        print "<h4 style='color: green;'>XML document is valid</h4>";

                    }

                } catch (Exception $e) {

                    print "<h4 style='color: red;'>XML document is not valid</h4>";

                }

                    

}

}


if($_GET['action'] == "auth"){

echo '<strong>Login</strong><br /><form METHOD="POST">

<input type="text" name="username" />

<br />

<input type="password" name="password" />

<br />

<input type="submit" />

</form>

';

if(isset($_POST['username'], $_POST['password']) && !empty($_POST['username']) && !empty($_POST['password']))

{

$user=$_POST["username"];

$pass=$_POST["password"];

if($user === "admin" && $pass === "[FLAG]"){


print "Flag : [FLAG]<br />";


}


}


}


echo '</body></html>';

?>


(1) libxml 함수

libxml_disable_entity_loader(false);

libxml_use_internal_errors(true);

 - libxml_disable_entity_loader 함수는 외부 entities를 로그하는 능력을 disable 할 것인지에 대한 설정이다. 여기서는 false로 하였기 때문에 외부의 entities를 가져올 수 있으며 이로 인해 XEE가 가능하다. 보안을 위해서라면 true로 해야한다.

 - libxml_use_internal_errors 함수는 기본 libxml error 처리를 비활성화하고 사용자가 에러를 핸들링할지를 정하는 함수이다. 여기서는 true로 하였으므로 코드 상에서 try~catch 문을 이용하여 에러를 핸들링해주었다.


(2) curl 함수

$ch = curl_init("$url");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_TIMEOUT, 3);

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0); 

$inject = curl_exec( $ch );

curl_close($ch);

 - curl_init 함수는 cURL 세션을 초기화하는 함수이다. 해당 함수curl_setopt(), curl_exec(), curl_close() 함수에서 사용할 수 있는 cURL handle이 리턴된다.

 - curl_setopt 함수는 cURL transfer을 위한 옵션을 설정해주는 함수이다. 여기서 설정하는 옵션은 다수가 있지만, 소스 내에 존재하는 옵션들에 대해서만 알아보았다.

 CURLOPT_RETURNTRANSFER 

 TRUE일 경우 curl_exec()의 결과를 문자열로 리턴해준다.

 CURLOPT_TIMEOUT

 cURL 함수가 실행될 최대 초단위의 시간이다.

 CONNECTTIMEOUT

 연결을 시도하기 위해 대기하는 시간이다. 0일 경우 즉시 시도한다.

 - curl_exec 함수는 주어진 cURL 세션을 실행하는 함수이다. 기본적으로는 결과가 성공일 땐 TRUE, 실패일 땐 FALSE를 출력하지만 CURLOPT_RETURNTRANSFER 옵션이 설정되어 있을 경우, 성공일 때 그 결과가 출력된다.

 - curl_close 함수는 cURL 세션과 모든 자원들을 닫는다. cURL handle인 ch 또한 삭제된다.


(3) simplexml_load_string 함수

$string = simplexml_load_string($inject, null, LIBXML_NOENT);

 - simplexml_load_string 함수는 XML 형식의 문자열을 object로 변환해주는 함수이다. XML 형식의 문자열은 $inject로 들어가며 LIBXML_NOENT FLAG를 통해 &var;와 같은 ENTITY reference를 모두 실행 결과로 대체한다. 만약 해당 FLAG를 주지 않으면 external entity가 노출되지 않는다.


2. 결론

※ XXE 취약점이 trigger되기 위한 조건

 1. simplexml_load_string에 LIBXML_NOENT FLAG가 설정되어 있어야 한다.

 2. libxml_disable_entity_loader가 true로 설정되어 있어야 한다. 이는 1의 설정이 되어있어도 false로 되어있다면 trigger되지 않는다.


참고

https://umbum.dev/475

https://security.stackexchange.com/questions/133906/is-php-loadxml-vulnerable-to-xxe-attack-and-to-other-attacks-is-there-a-list

반응형

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

[root-me] Local File Inclusion - Wrappers  (0) 2020.03.05
LDAP Injection  (0) 2020.03.04
PHP wrapper  (0) 2020.03.02
JWT Signature - RS256 to HS256  (3) 2020.02.27
open_basedir setting and bypass  (0) 2019.12.31
블로그 이미지

rootable

,

PHP wrapper

Hacking/Web 2020. 3. 2. 23:28
반응형

1. 이론

(1) expect://

 : system command 실행 가능

ex) www.test.com?page=expect://ls


(2) php://filter

 : I/O 스트림을 다루는데 사용하는 wrapper로 encode/decode를 이용하여 서버 내 파일을 읽을 수 있다. 대표적으로 base64를 이용한다.

ex) www.test.com?page=php://filter/convert.base64-encode/resource=/etc/passwd


(3) zip://

 : zip:// wrapper는 압축을 풀고 그 안에 있는 파일의 코드를 실행시켜주는 wrapper이다.

ex) www.test.com?page=zip://file.zip#shell.php



2. 실습

(1) test.php 코드

<?php

include($_GET['page']);

?>




(2) expect wrapper 실습

 - 오류가 떴으며, 검색해본 결과 expect wrapper를 이용하기 위해서는 따로 설치하는 과정이 필요한 것으로 보인다.

 - 기본적으로 설치되어 있지 않는 모듈일 가능성이 커 실제로 이용하기에는 제한적이라 생각들어 여기서 stop

 - 더 진행해보고자 하는 분들은 아래 출처 페이지를 참고하여 설치 후 진행해보길 바란다.



(3) php://filter 실습

 - resource에 지정한 파일이 다음과 같이 base64로 인코딩된 상태로 출력된다.

 - 출력된 base64를 디코딩하면 해당 파일의 내용을 볼 수 있다.



(4) zip:// 실습

 - shell.php 코드

<?php

echo "SUCCESS";

?>

 - zip 명령어 : zip rootable.zip shell.php

 - 해당 wrapper 또한 expect 처럼 세팅이 필요해보인다.



3. 결론

 - php://filter가 짱짱맨이다

 - php://filter의 경우 base64가 유명하여 막힐 가능성이 있으므로, string.rot13으로 암호화하여 진행하는 경우도 생각해놓자

ex) www.test.com?page=php://filter/string.rot13/resource=/etc/passwd




(출처)

https://www.opentutorials.org/module/4291/26819

http://linux-problem-solver.blogspot.com/2014/02/solution-to-installation-of-expect.html

https://www.php.net/manual/en/filters.string.php

반응형

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

LDAP Injection  (0) 2020.03.04
Study of XXE  (0) 2020.03.03
JWT Signature - RS256 to HS256  (3) 2020.02.27
open_basedir setting and bypass  (0) 2019.12.31
Sqlite Sql Injection Prevention  (0) 2019.12.30
블로그 이미지

rootable

,

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