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

반응형

1. open_basedir 지시어란?

 - open_basedir란 설정된 디렉토리 및 하위 디렉토리에서만 파일을 열 수 있도록 제한하는 지시어이다.

 - 상세한 설정 및 이에 따른 설명은 아래 [2. 세팅 방법]에서 다루도록 하겠다.



2. 세팅 방법

 - 필자는 CentOS 6.0 기준으로 작성하였다. 다른 버전의 경우 검색을 통해 알아보길 바란다.

 

- vi /etc/httpd/conf/httpd.conf


- 아래 내용 추가 후 저장

<Directory /var/www/html/test/*>

<IfModule php5_module>

php_admin_value open_basedir  /var/www/html/test:/tmp

</IfModule>

</Directory>


- service httpd restart


여기서 php_admin_value 옵션은 ini_set() 혹은 set_include_path()와 같은 방법으로 어플리케이션에서 직접적으로 설정 정보를 변경하지 못하도록 하는 옵션이다.


open_basedir로 경로를 설정할 때 : 를 기준으로 여러 디렉토리를 설정해줄 수 있으며 어플리케이션 경로 및 세션 정보와 파일 업로드 시 필요한 tmp 디렉토리만 설정해준다.

이렇게 설정해줄 경우 Directory에 표기된 /var/www/html/test/ 하위에 정의된 파일들은 open_basedir에 설정된 /var/www/html/test 를 벗어나 상위 디렉토리에 접근할 수 없다.


설정 후 httpd service를 restart해주면 적용이 완료된다.


(참고) php.ini에서도 open_basedir 설정이 가능하다.



3. open_basedir 우회

 - 올해 3월달에 @Blaklis_ 라는 분께서 open_basedir이 설정되어있을 때 우회하는 PoC를 공개하였다.


 - 그리고 이에 대한 상세한 설명 및 방법은 shpik 님께서 블로그에 잘 정리해 놓으셨다. 

https://blog.shpik.kr/2019/PHP_Open_basedir_Bypass/ )

 - 개인적으로 테스트를 해보며 첨언을 하자면 위에 내가 세팅한 방법인 httpd.conf 파일에 세팅하는 경우에는 위의 방법으로 우회가 되지 않는다. 왜냐하면 php_admin_value 옵션이 들어가있기 때문이다. 위의 경우는 php.ini 파일에서 open_basedir을 설정하였을 경우 우회되는 방법이다.


- 추후 관련 CTF가 출제될 수 있으므로 Final payload만 저장해둔다.

http://91.121.31.50/phuck3/?eval=chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');echo(file_get_contents('flag'));


※ 참고

 - https://idchowto.com/?p=22531

 - https://ma.ttias.be/php-php_value-vs-php_admin_value-and-the-use-of-php_flag-explained/


반응형

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

PHP wrapper  (0) 2020.03.02
JWT Signature - RS256 to HS256  (3) 2020.02.27
Sqlite Sql Injection Prevention  (0) 2019.12.30
HTTP 인증 우회  (0) 2019.12.16
데이터 평문전송 대응방안  (2) 2019.12.06
블로그 이미지

rootable

,
반응형

데이터베이스에는 MySQL, MSSQL, Oracle이 대표적이지만 안드로이드와 IOS에서 주로 사용되는 SQLite 가 존재한다.


데이터베이스 관련 취약점인 SQL Injection이 해당 데이터베이스에서도 발생되는데 이에 대한 대응방안을 찾아보았다.


PERL이나 PHP같은 스크립팅 언어에서는 쿼리를 종료하는 모든 문자열에 대해 다룰 수 있다. PHP 언어의 경우 SQLite에 특별한 입력 문자열에 대해 다루는 sqlite_escape_string()이라는 함수를 제공해준다.


아래는 해당 함수를 사용하는 예시이다.

// addslashes() 함수를 거친 데이터를 사용할 경우 결과가 이상하게 나옴

if(!get_magic_quotes_gpc()) {

$name = sqlite_escape_string($name);

}


$result = @$db->query("SELECT * FROM users WHERE username='{$name}'");





나의 경우 해당 함수를 사용하였는데 다음과 같은 에러가 발생하였다.

Fatal error: Call to undefined function sqlite_escape_string() in [파일명] on line 9


왜 그런지 알아보았는데 결론은 테스트 환경인 CentOS의 문제였다.

동일한 에러가 발생한다면 아래 Step대로 진행하면 해결될 것이다.


아래 php-5.X.X.tar.gz 부분은 버전정보를 입력하면 된다. ( "php -v" 명령어를 통해 확인 가능 )


wget http://museum.php.net/php5/php-5.X.X.tar.gz

tar xzvf php-5.2.XX.tar.gz

cd php-5.2.XX/ext/sqlite/

phpize

./configure

make

make install

echo extension=sqlite.so >> /etc/php.d/sqlite.ini

service httpd restart


* 만약 진행하다가 phpize 명령어가 안된다면 다음 명령어를 통해 php-devel를 설치 

yum install php-devel*


참고 )

 - https://www.tutorialspoint.com/sqlite/sqlite_injection.htm

 - https://www.php.net/manual/en/function.sqlite-escape-string.php

 - https://www.serveradminblog.com/2013/07/centos-5-call-to-undefined-function-sqlite_escape_string/

 - https://medium.com/@a.m./solved-phpize-command-not-found-in-centos-6-4-6ee253419053

반응형

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

JWT Signature - RS256 to HS256  (3) 2020.02.27
open_basedir setting and bypass  (0) 2019.12.31
HTTP 인증 우회  (0) 2019.12.16
데이터 평문전송 대응방안  (2) 2019.12.06
0.0.0.0 의 의미  (0) 2019.11.20
블로그 이미지

rootable

,
반응형
아래는 8자리 숫자형 리스트 파일를 생성하는 파이썬 코드이다.

길이가 길어지던지, 문자열이 포함된 리스트를 생성할 때도 코드를 조금만 변형하면 생성할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
length=8
character="0123456789"
 
temp_list = [0 for x in range(0,length)]
crack_list=[]
 
text = open('list.txt','w')
 
for i in range(0,pow(10,8)):
    stringGen="".join([character[x] for x in temp_list])
    text.write(stringGen+"\n")
 
    temp_list[-1]+=1
 
    for x in range(length-1,0,-1):
        if temp_list[x] == len(character):
            temp_list[x-1]+=1
            temp_list[x]=0
 
 
text.close()
cs



반응형
블로그 이미지

rootable

,
반응형

회원가입하고 로그인을 하면 [플래그 받기] 버튼이 있다.


해당 버튼을 누르면 응답으로 단순히 403 코드가 출력된다.


문제에서 제공해준 소스코드 중 config.js를 보면 jwt의 key가 0~9로 이루어진 8자리 길이 숫자임을 알 수 있다.



이에 따라 파이썬으로 00000000 ~ 99999999 까지 이루어진 파일을 생성하고 jwttool을 통해 brute forcing하여 40906795가 올바른 key 값임을 알 수 있다.



이제 해당 key를 이용하여 admin을 true로 변경한 jwt를 넣으면 FLAG가 출력된다.


FLAG : XMAS{bru73-f0rc3-jw7_^^7}

반응형

'Hacking Contest' 카테고리의 다른 글

UTCTF 2020  (1) 2020.03.08
[Christmas CTF 2019] watermelon  (0) 2019.12.26
[Kipod After Free CTF 2019]  (0) 2019.12.24
2019 X-MAS CTF  (0) 2019.12.18
[Rooters CTF] baby web  (0) 2019.10.10
블로그 이미지

rootable

,
반응형

크리스마스 당일에는 약속이 있어 대회가 끝난 다음날 문제를 풀어보았다.


문제에 접근하면 음악을 업로드하는 페이지와 음악리스트, 순위 등등 페이지가 존재한다.


음악 업로드는 mp3와 wav로 화이트리스트 기반으로 되어있어 웹쉘 업로드 문제는 아니였다.


음악을 업로드하고 여기저기 돌아다니다가 robots.txt 파일을 요청하여 /xmas/.git 경로가 존재한다는 것을 획득하였다.


 .git이란?

 - git init을 통해 새로운 git 저장소를 생성하였을 때 생기는 폴더로 해당 폴더 안에는 버전 정보, 커밋 정보, 로그 정보 등등이 들어있다.


이제 git cat-file 명령어를 통해 하나씩 로그 파일을 읽어볼 수 있지만 간단한 파이썬 모듈이 있다.


이는 GitHack 모듈로 간단히 명령어 한 줄로 해당 git repository의 파일들을 다운받을 수 있다.


명령어 : GitHack.py http://ch4n3.me:8080/xmas/.git/


이를 통해 php 파일들을 받을 수 있고, 이 중 flag.php 파일을 확인해보았다.



$flag 변수에 flag가 들어가있지만 다운받은 소스코드 상에는 마스킹처리가 되어 있는 상황이다.

따라서 if 구문의 끝에 die($flag)를 통해 flag를 획득해야하는데 이를 위한 조건은 내가 업로드한 음악이 1225개 이상 투표를 받으면 flag를 획득할 수 있다.


이를 위해 user_no를 변경해가며 jwt 를 생성하여 내가 올린 음악을 투표하도록 하는 php code를 만들어 flag를 획득하였다.



FLAG : XMAS{Last Christmas~ I gave you my heart~ <3}

반응형

'Hacking Contest' 카테고리의 다른 글

UTCTF 2020  (1) 2020.03.08
[Christmas CTF 2019] JWT  (0) 2019.12.26
[Kipod After Free CTF 2019]  (0) 2019.12.24
2019 X-MAS CTF  (0) 2019.12.18
[Rooters CTF] baby web  (0) 2019.10.10
블로그 이미지

rootable

,

[Kipod After Free CTF 2019]

2019. 12. 24. 17:40

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

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