¹ÏÀ»°ÍÀº ¾ø´Ù
¸¹Àº CGI ÀÛ¼ºÀÚ°¡ ¹üÇϴ ù¹ø° ½Ç¼ö´Â »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹ÏÀ» ¼ö ÀÖ´Ù°í °¡Á¤ÇÏ´Â °ÍÀÌ´Ù. »ç½Ç ¹ÏÀ» ¼öÀÖ´Â °ÍÀº °ÅÀÇ ¾Æ¹«°Íµµ ¾ø´Ù - ÀÌ ½ºÅ©¸³Æ®¸¦ È£ÃâÇÏ´Â httpd Á¶Â÷ ¹ÏÀ» ¼ö ¾ø´Ù.
ÆûÀÇ ÀÔ·Â
°áÄÚ ÆûÀÇ ÀÔ·ÂÀ» ¹ÏÁö ¸¶¶ó. ´ÙÀ½°ú °°Àº °ÍµéÀº ¸ðµÎ °ÅÁþÀÌ´Ù:
- ¸¸¾à ¼±Åà ¸ñ·ÏÀ» ¸¸µç´Ù¸é ÀÌ Çʵ忡´ëÇÑ ÀÔ·ÂÀº Option ű×ÀÇ °ªÁß ÇϳªÀÏ °ÍÀÌ´Ù.
- ÀÔ·Â ÇʵåÀÇ ÃÖ´ë±æÀ̸¦ ¼³Á¤ÇÑ´Ù¸é ºê·Î¿ìÀú´Â ±â²¯ÇØ¾ß ÁöÁ¤µÈ °ª¸¸ÅÀÇ ¹®ÀÚ¸¦ º¸³¾ °ÍÀÌ´Ù.
- QUERY_STRING º¯¼ö³»ÀÇ Çʵå´Â ÀÚ½ÅÀÇ ÆäÀÌÁö³»ÀÇ Çʵå¿Í ÀÏÄ¡ÇÒ °ÍÀÌ´Ù.
ÆÄÀϸí
ÆÄÀÏ ¿±â
¾Æ¸¶ ¾î¶°ÇÑ ÆÄÀϸíÀÌ´ø CGI¿¡¼ Á÷Á¢ ó¸®ÇÑ °ÍÀº ¾ÈÀüÇÏ´Ù. Æû, PATH_INFO¿Í ´Ù¸¥ ¼Ò½º·ÎºÎÅÍ °¡Á®¿Â ÆÄÀϸíÀº ÀǽÉÇغÁ¾ßÇÑ´Ù. ¶§¶§·Î ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Â ÆÄÀϸíÀ» À¯ÁöÇÏ´Â °ÍÀÌ ½Ç¿ëÀûÀÌ´Ù. ±×·¸Ä¡ ¾ÊÀ¸¸é /¸¦ »ç¿ëÇÏÁö ¾Ê°Å³ª ¾Æ¸¶ ..¿Í ·çÆ®¸¦ ³ªÅ¸³»´Â /ÀÇ »ç¿ëÀ» ±ÝÁöÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. º¸Åë CGI ÀÛ¼ºÀÚ´Â ¹Þ¾ÆµéÀÏ ÆÄÀÏÀÇ À§Ä¡¸¦ Á¤È®È÷ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
ÆÄÀÏÀÇ »ý¼º
ÀϹÝÀûÀ¸·Î °£´ÜÇÑ À̸§À» °®´Â ÆÄÀÏÀ» »ý¼ºÇÏ·Á°í ÇÑ´Ù¸é ¹®ÀÚ¸¦ A-Za-z0-9_·Î Á¦ÇÑÇÏ´Â °ÍÀÌ »ó´çÈ÷ ¾ÈÀüÇÑ´Ù. Unix ÇÏ¿¡¼ ÆÄÀϸíÀº .·Î ½ÃÀÛÇÒ ¼ö ¾ø´Ù. °ø¹é°ú -¿Í ½© ¸ÞŸ¹®ÀÚ ¶ÇÇÑ ÆÄÀϸíÀ¸·Î´Â ÁÁÁö¾Ê´Ù. Ÿ´çÇÏÁö¾ÊÀº ¹®ÀÚÀÇ ¸ñ·ÏÀ» »ç¿ëÇÏ´Â °Íº¸´Ù Ÿ´çÇÑ ¹®ÀÚ ÁýÇÕÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÈξÀ ³´´Ù.
º¸¾ÈÀ» °ÆÁ¤ÇÏ´Â CGI ÀÛ¼ºÀÚ´Â ´©±¸³ª ¾µ ¼ö ÀÖ´Â µð·ºÅ丮(/tmp)¿¡ ¾²´Â °ÍÀº ÇÇÇØ¾ß ÇÑ´Ù. /tmp³»¿¡ µð·ºÅ丮¸¦ ¸¸µëÀ¸·Î¼ ÇÁ·Î±×·¥ÀÌ CGI È£ÃâÇÏ°í ´ÙÀ½ CGI¸¦ È£ÃâÇÏ´Â »çÀÌ¿¡ ³ªÅ¸³ªÁö ¾Ê´Â µð·ºÅ丮¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ °ÍÀº ¾ÇÀÇÀûÀÎ »ç¶÷µéÀÌ Áß¿äÇÑ ÆÄÀÏÀ̳ª µð·ºÅ丮¿¡´ëÇØ ½±°Ô ¸µÅ©ÇÒ ¼öÀÖµµ·Ï ÇÑ´Ù. µû¶ó¼ Ç×»ó ¿Àº ÆÄÀÏÀÌ º¯°æÇÏ·Á´Â ÆÄÀÏÀÎÁö °ËÁõÇØ¾ß ÇÑ´Ù.
umask ¼³Á¤
¸¹Àº httpdÀÇ ±âº» umask´Â 0ÀÌÀ¸·Î CGI¿¡ÀÇÇØ »ý¼ºµÈ ÆÄÀÏÀº ±âº»ÀûÀ¸·Î Àü¼¼°è ¸ðµç »ç¶÷ÀÌ ÀÐ°í ¾µ ¼öÀÖ´Ù. umask¸¦ 022·Î ¼³Á¤(Àб⸸ °¡´É)Çϰųª 077(ÀڽŸ¸ ÀÐ°í ¾²±â)·Î ¼³Á¤ÇØ¾ß ÇÑ´Ù.
ÇÁ·Î±×·¥ È£Ãâ
¸¹Àº À¯¿ëÇÑ CGI ÇÁ·Î±×·¥Àº »ç¿ëÀÚ°¡ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥À̳ª Ç¥ÁØ Unix ÇÁ·Î±×·¥À» È£ÃâÇÑ´Ù. fortuneÀ¸·Î °Ë»öÇÁ·Î±×·¥À» ¾ó¸¶³ª ½±°Ô ±¸ÇöÇÒ ¼ö Àִ°¡¸¦ »ý°¢Çغ¸ÀÚ. ºÒÇàÇÏ°Ôµµ ´ëºÎºÐÀÇ CGI º¸¾È¹®Á¦´Â ´Ù¸¥ ÇÁ·Î±×·¥À» È£ÃâÇÔÀ¸·Î¼ ¹ß»ýÇÑ´Ù.
´ÙÀ½Àº CGI ÇÁ·Î±×·¡¸Ó°¡ Á÷¸éÇÑ ¹®Á¦°¡ ¹«¾ùÀÌ°í, ¿©·¯ ÇüÅÂÀÇ ¿À¿ëÀ» ¸·´Â ±â¹ý¿¡´Â ¾î¶² °ÍÀÌ Àִ°¡ ¾Ë¾Æº¸ÀÚ. °¢ ¿¹´Â PERL·Î ÀÛ¼ºµÇ¾ú´Ù.
±âº»ÀûÀÎ ¹®Á¦
CGI´Â ¹®ÀÚ¿ °Ë»öÀ» À§ÇØ grepÀ» È£ÃâÇϸç Æû¿¡¼ Á¤±Ô½ÄÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. PERLÀÇ °æ¿ì »ç½Ç Á¤±Ô½ÄÀ» ÅëÇØ grepÀ» ±¸ÇöÇÏ´Â °ÍÀÌ º¸´Ù °£´ÜÇÏ´Ù(¶ÇÇÑ ÈξÀ ¾ÈÀüÇÏ´Ù)´Â °Í¿¡ ÁÖÀÇÇÑ´Ù.
system("grep $exp database");
À̳ª
sprintf(tmp, "grep %s database", exp); system(tmp);
¿Í °°Àº Á¢±Ù¹ýÀº ¸¹Àº ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù. "root /etc/passwd;rm"ÀÇ °ªÀ» °®´Â expÀ» °í·ÁÇÏÀÚ. ½ÇÁ¦ À߸øµÈ ÆÄÀÏÀ» ÀÐÀ» »Ó¸¸¾Æ´Ï¶ó database¸¦ »èÁ¦ÇϰԵȴÙ. °¡Àå °£´ÜÇÑ ÇØ°áÃ¥Àº ÀοëºÎÈ£¸¦ Ãß°¡ÇÏ´Â °ÍÀÌ´Ù.
ÀοëºÎÈ£¸¸À¸·Î´Â ÃæºÐÇÏÁö ¾Ê´Ù.
system("grep "$exp" database");
À̳ª
sprintf(tmp, "grep "%s" database", exp); system(tmp);
ÀÛÀº µû¿ÈÇ¥µç Å« µû¿ÈÇ¥µç ¹®Á¦´Â ÇØ°áµÈ´Ù. ¿¹¸¦µé¾î Å« µû¿ÈÇ¥·Î exp´Â ""rm -rf /"¿Í °°ÀÌ µÉ ¼ö ÀÖ´Ù. ÀÛÀº µû¿ÈÇ¥·Îµµ ÀÌ °ÍÀ» ÇØ°áÇÒ ¼ö ÀÖÁö¸¸ µÑ´Ù ``'root /etc/passwd;rm'''¿Í °°Àº ¹®Á¦¸¦ ¹ß»ýÇÑ´Ù. µû¿ÈÇ¥´Â º¯¼ö¸¦ °¨½Î´Â °Í°ú ÀÏÄ¡Çϸç, °á±¹ À̵éÀÇ È¿°ú¸¦ ¾ø¾Ö¹ö¸°´Ù.
°³°³ÀÇ ¹®ÀÚ¸¦ EscapeÇÏ´Â °ÍÀÌ ÈξÀ ³´´Ù
Ư¼ö¹®ÀÚ¾Õ¿¡ ""¸¦ µÎ´Â °ÍÀº »ó´çÈ÷ ½±´Ù.
$exp =~ s/[^\w]/\\&/g;
system("grep "$exp" database");
ÀÌ ¹æ¹ýÀ¸·Î Áö±Ý±îÁö ³íÀÇÇÑ ¸ðµç ¹®Á¦¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª exp°¡ "-i"¶ó¸é ¾ÆÁ÷µµ ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù. "grep"Àº Ç¥ÁØÀԷ¿¡¼ ¹®ÀÚ¿ "database"¸¦ ãÀ¸·ÁÇÒ °ÍÀÌ´Ù(´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÏÁö ¾Ê°í).
grep¿¡ "-e" ¿É¼ÇÀ» »ç¿ëÇÔÀ¸·Î¼ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ¸·À» ¼ö ÀÖ´Ù. ÀϹÝÀûÀ¸·Î exp¿¡´ëÇØ °¡´ÉÇÑ °ªÀ» Á¦ÇÑÇÏ´Â °æ¿ì¸¦ Á¦¿ÜÇÏ°í, ÁÖ¾îÁø º¯¼ö°¡ ½ºÀ§Ä¡°¡ ¾Æ´Ï¶ó´Â °ÍÀ» Å뺸ÇÒ ¼ö ¾ø´Â ÇÁ·Î±×·¥À» È£ÃâÇÏ°í ½ÍÁö ¾ÊÀ» °ÍÀÌ´Ù. GNU À¯Æ¿¸®Æ¼¸¦ »ç¿ëÇÏ´Â °ÍÀº ½ºÀ§Ä¡ Ç¥½ÄÀÇ ³¡À¸·Î¼ "--"¸¦ Çã¿ëÇϱ⶧¹®¿¡ »ç½Ç ¾ÆÁÖ ÈǸ¢ÇÑ ¹æ¹ýÀÌ´Ù.
´õ ³ªÀº ¹æ¹ý
´ÙÀ½ ¹æ¹ýÀ¸·Î ÇÁ·Î±×·¥À» È£ÃâÇÑ´Ù¸é ¹®ÀÚµéÀ» Escape ½Ãų ÇÊ¿ä°¡ ¾ø´Ù.
system("grep", "-e", $exp, "database");
ÀÌ ¹æ¹ýÀ¸·Î grep¸¦ È£ÃâÇÔÀ¸·Î¼ ½©ÀÌ È£ÃâµÇ´Â °ÍÀ» ¸·À» ¼ö ÀÖ´Ù. ºñ·Ï globbing°ú °°Àº ½© Ư¡À» ¿ä±¸ÇÏ´Â °æ¿ì ±×·¸°Ô Æí¸®ÇÑ ¹æ¹ýÀº ¾Æ´Ï´Ù.
À§¿Í°°Àº °æ¿ì¿¡ ¶Ç´Ù¸¥ Á¢±Ù¹æ¹ýÀÌ »ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº ½©ÀÇ Æ¯Â¡À» ÃëÇÒ ¼ö ÀÖ´Ù´Â ÀÕÁ¡ÀÌ ÀÖ´Ù.
$ENV{'FOO'} = $exp;
system 'grep -ei "$FOO" *.c';
¾ÈÀüÇÏ°Ô ¿ÜºÎ ÇÁ·Î±×·¥À» È£ÃâÇÏ´Â ¹æ¹ý
ÆÞ¿¡¼´Â ¿ÜºÎÇÁ·Î±×·¥À» È£ÃâÇÏ´Â ¹æ¹ýÀÌ ¿©·¯ °¡Áö°¡ ÀÖ´Ù. ù ¹ø°·Î ¹éƽÀ» »ç¿ëÇÏ´Â ¹æ¹ý,
$date = `/bin/date`;
ÆÄÀÌÇÁ¸¦ ¾²´Â ÆÄÀÏ ÇÚµéÀ» open()ÇÏ´Â ¹æ¹ý,
open (SORT, " | /usr/bin/sort | /usr/bin/uniq");
system() ¸í·É¾î¸¦ »ç¿ëÇؼ ÇÁ·Î±×·¥ ¼öÇàÀÌ ³¡³¯ ¶§±îÁö ±â´Ù¸®´Â ¹æ¹ý,
system "/usr/bin/sort < foo.in";
exec() ¸í·É¾î¸¦ »ç¿ëÇؼ ¸®ÅÏÇÏÁö ¾Ê´Â ¹æ¹ý,
exec "/usr/bin/sort < foo.in";
³× °¡Áö°¡ ÀÖ´Ù. ÀÌ ³×°¡Áö ¹æ¹ý ¸ðµÎ ÀԷ¿¡ ½© ¸ÞŸ¹®ÀÚ°¡ ÀÖÀ» °æ¿ì º¸¾È ÇêÁ¡À» ¸¸µé °¡´É¼ºÀÌ ÀÖ´Ù. system()°ú exec()À» »ç¿ëÇÒ °æ¿ì ½©À» ÅëÇؼ ÇÁ·Î±×·¥À» ¼öÇàÇÏÁö ¾Ê°í ¹Ù·Î ¿ÜºÎÇÁ·Î±×·¥À» ¼öÇàÇϵµ·Ï ÇÒ ¼ö ÀÖ´Ù.
¿ÜºÎ ÇÁ·Î±×·¥À¸·Î ÀÎÀÚ¸¦ º¸³»¾ß ÇÒ °æ¿ì ÇѲ¨¹ø¿¡ ÇÑ ¹®ÀÚ¿·Î ÇÁ·Î±×·¥°ú ÀÎÀÚ¸¦ ¹Áö ¾Ê°í °¢°¢ µû·Î ¹®ÀÚ¿·Î ¸¸µé¾î¼ ¸®½ºÆ®¸¦ º¸³»¸é ½©À» »ç¿ëÇÏÁö ¾Ê°Ô µÈ´Ù. ¿¹¸¦ µé¸é
system "/usr/bin/sort","foo.in";
°ú °°´Ù. ÀÌ ¹æ¹ýÀº ÆÄÀÌÇÁ¸¦ ¾²´Â ÆÄÀÏ ÇÚµéÀ» open()ÇÒ ¶§µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°ÀÌ ÇÏ¸é ¸¶Âù°¡Áö·Î ½©À» °ÅÄ¡Áö ¾Ê°í ¹Ù·Î ÇÁ·Î±×·¥ÀÌ ¼öÇàµÈ´Ù.
open (SORT,"|-") || exec "/usr/bin/sort",$uservariable;
while $line (@lines) {
print SORT $line,"\n";
}
close SORT;
½©À» ¼öÇàÇÏÁö ¾Ê°í ÆÄÀÌÇÁ·ÎºÎÅÍ ÇÁ·Î±×·¥ÀÇ ÀÔ·ÂÀ» ¹Þ°í ½ÍÀº °æ¿ì¿¡´Â ´ÙÀ½°ú °°ÀÌ '-|'¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
open(GREP,"-|") || exec "/usr/bin/grep",$userpattern,$filename;
while (<GREP>) {
print "match: $_";
}
close GREP;
ÆÞÀÇ taint üŷ
Áö±Ý±îÁö »ìÆ캻 ´ë·Î CGI ÇÁ·Î±×·¥ÀÇ º¸¾È¿¡ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ÒÁö°¡ ÀÖ´Â °÷Àº »ç¿ëÀÚ ÀÔ·ÂÀ» °Ë»çÇÏÁö ¾Ê°í ½©·Î º¸³»´Â °æ¿ìÀÌ´Ù.
ÆÞÀº ÀÌ·± °ÍµéÀ» ¹æÁöÇϱâ À§ÇØ taint üŷÀ̶ó´Â ¸ÞÄ«´ÏÁòÀ» Á¦°øÇÑ´Ù. ÇÁ·Î±×·¥ ¿ÜºÎ(ȯ°æ º¯¼ö, Ç¥ÁØ ÀÔ·Â, ¸í·ÉÇà ÀÎÀÚ¸¦ Æ÷ÇÔÇؼ)·ÎºÎÅÍ ÀÔ·Â ¹ÞÀº ¸ðµç º¯¼öµéÀº "tainted"·Î °£Áֵǰí "tainted" º¯¼öµéÀº ¿ÜºÎ ÇÁ·Î±×·¥À» ½ÇÇàÇϴµ¥ ÀÌ¿ëµÉ ¼ö ¾ø´Ù.
ÀÌ "tainted" º¯¼öÀÇ °ªÀÌ ´Ù¸¥ º¯¼öÀÇ °ªÀ» ¼³Á¤Çϴµ¥ »ç¿ëµÇ¸é ±× º¯¼öµµ ¸¶Âù°¡Áö·Î "tainted"·Î °£ÁֵȴÙ. ÀÌ·± "tainted" º¯¼öµéÀº eval(), system(), exec(), ÆÄÀÌÇÁ open()À» À§Çؼ´Â »ç¿ëµÉ ¼ö ¾ø´Ù.
¶ÇÇÑ, ÇÁ·Î±×·¥ ¾È¿¡¼ ¸í½ÃÀûÀ¸·Î PATH ȯ°æ º¯¼ö¸¦ ¼³Á¤ÇÏÁö ¾Ê°í ¿ÜºÎÇÁ·Î±×·¥À» ¼öÇàÇÏ·Á°í ÇÒ °æ¿ì ÆÞÀº °æ°í¸Þ¼¼Áö¸¦ ³»°í Á¾·áÇÏ°Ô µÈ´Ù. ÆÞ ¹öÀü 4¿¡¼ "taint" üŷÀ» »ç¿ëÇϱâ À§Çؼ´Â taintperlÀ̶ó´Â ÆÞÀÇ Æ¯º° ¹öÀüÀ» »ç¿ëÇÏ¸é µÇ°í, ¹öÀü 5¿¡¼´Â ´ÙÀ½°ú °°ÀÌ -T ¿É¼ÇÀ» ÁÖ¸é µÈ´Ù.
#!/usr/local/bin/perl -T
ÀÏ´Ü "taint" üŷÀ» ÄÑ ³õÀ¸¸é "Insecure $ENV{PATH} at line XX"¶ó´Â ¸Þ½ÃÁö¸¦ ÀÚÁÖ º¸°Ô µÈ´Ù. ÀÌ°ÍÀº ¹æ±Ý ¸»ÇÑ °Í°ú °°ÀÌ PATH ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÏÁö ¾ÊÀº »óÅ·Π¿ÜºÎ ÇÁ·Î±×·¥À» È£ÃâÇ߱⠶§¹®ÀÌ´Ù. ÀÌ ¿¡·¯¸Þ¼¼Áö¸¦ ÇÇÇÏ°í ½Í´Ù¸é ÇÁ·Î±×·¥ ¾È¿¡¼ Á÷Á¢ PATH ȯ°æ º¯¼ö¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù.
$ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin';
ÀÏ´Ü ¾î¶² º¯¼ö°¡ "tainted"·Î °£ÁֵǸé system(), exec(), ÆÄÀÌÇÁ open(), eval(), ¹éƽ ¸í·É¾î, unlink¿Í °°Àº ¿ÜºÎ¿¡ ¿µÇâÀ» ¹ÌÄ¡°Ô µÇ´Â ÇÔ¼öµéÀ» ¼öÇàÇϴµ¥ ÀÌ¿ëµÉ ¼ö°¡ ¾ø´Ù.
"tainted" º¯¼ö¿¡ tr/// ¿¬»êÀÚ¸¦ »ç¿ëÇϰųª s/// ¿¬»êÀÚ¸¦ »ç¿ëÇؼ´Â "tainted"¸¦ ¾ø¾Ù ¼ö°¡ ¾ø´Ù. "tainted" ¼Ó¼ºÀ» ¾ø¾Ö´Â ¹æ¹ýÀº "tainted" º¯¼ö¿¡ ´ëÇؼ ÆÐÅÏ ¸ÅÄ¡¸¦ ¼öÇàÇÑ ´ÙÀ½¿¡ ¸ÅÄ¡µÈ ¹®ÀÚ¿À» ²¨³»¼ ¾²´Â ¹æ¹ý¹Û¿¡ ¾ø´Ù. ¿¹¸¦ µé¾î e-mail ÁÖ¼Ò¸¦ ¾ò¾î³½´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ´Ù.
$mail_address=~/([\w-.]+\@[\w-.]+)/;
$untainted_address = ;