乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Perl CGI編程安全點滴

       老莊走狗 2006-06-14
      【編者按】
          CGI在現(xiàn)在的互聯(lián)網(wǎng)應(yīng)用越來越廣泛,CGI編程的安全問題也得到越來越多的重視。Perl作為CGI編程的主要語言之一,其安全性也受到很大的關(guān)注。在 W3C組織的 "WWW Security FAQ" 之 "CGI Scripts"一章中,Perl安全編程就整整占了一節(jié)。由此可見 Perl CGI 安全編程的重要性。

      ---------------------
      1、“有毒”的NULL字符
      ---------------------

        如果我說:"root"=="root",相信沒有什么人反對。但同時我也這樣說:
      "root"!="root"!還有多少人會認為我是個“正常人”?:)
        但在各種不同的編程語言中,確實存在著這種情況。
        對于每一個希望發(fā)現(xiàn)CGI漏洞的安全專家或黑客來說,最常用的方法之一是
      通過傳遞特殊字符(串),繞過CGI限制以執(zhí)行系統(tǒng)級調(diào)用或程序。如果你仔細
      留意的話,或許也會發(fā)現(xiàn)NULL字符確實有它的“妙用”。:)
        閱讀以下例子:

      # parse $user_input
      $database="$user_input.db";
      open(FILE "<$database");

      這個例子用于打開客戶端指定的數(shù)據(jù)庫文件。例如客戶端輸入"backend",則系
      統(tǒng)將打開"backend.db"文件考只讀方式)。(注:在這里我們暫且不討論"../"
      的安全問題。)這種處理方式在互聯(lián)網(wǎng)中是很常見的。
        現(xiàn)在,讓我們在客戶端輸入"backend%00",在該PERL程序中$database=
      "backend.db",然后調(diào)用open函數(shù)打開該文件。但結(jié)果是什么呢?系統(tǒng)會打
      開"backend"文件(,如果該文件存在)!
        出現(xiàn)這種情況的原因是由于PERL允許在字符串變量中使用NULL空字符,而
      在C語言中字符串則不允許包含空字符。因此,也就有了"root"!="root"(在
      PERL中)和"root"="root"(在C語言中)。由于系統(tǒng)內(nèi)核/調(diào)用等都是使用C
      語言編寫,因此當(dāng)PERL將"backend.db"字符串傳遞到(C語言的)鏈接庫/程序
      時,空字符以后的字符將被忽略?(或許還有利用價值?我還沒發(fā)現(xiàn)。:))
        這種編程缺陷的影響可大可小。試想一下,如果利用以上編程原理編寫一個
      給系統(tǒng)其他管理員修改除了root外的其他用戶口令的PERL程序:

      $user=$ARGV[1] # user the jr admin wants to change
      if ($user ne "root"){
      # do whatever needs to be done for this user }

      那么,聰明的你應(yīng)該知道如何繞過這個限制修改root用戶口令了吧?對了,只要
      使 $user="root",則PERL會執(zhí)行上面程序中花括號內(nèi)的語句。除非所有處理
      過程均使用PERL,否則一旦該變量傳遞給系統(tǒng),則會造成安全問題。如修改root
      用戶口令等。
        也許你認為很難遇到這種會造成嚴重安全問題的情況,那么我們能否將它作
      為一種尋找網(wǎng)站源程序漏洞的間接手段呢?;-)
        不知你有沒有經(jīng)常遇到這種類型的CGI程序,該程序用于打開客戶端(提交
      的表單中)要求的頁面?如:

      page.cgi?page=1

      然后網(wǎng)站是否返回頁面"1.html"呢?;-) 好,現(xiàn)在將其改為:

      page.cgi?page=page.cgi%00 (%00 == ‘‘ escaped)

      這樣,我們就可以得到我們感興趣的文件內(nèi)容了!這種方法連PERL的"-e"參數(shù)也
      可繞過:

      $file="/etc/passwd.txt.whatever.we.want";
      die("hahaha! Caught you!) if($file eq "/etc/passwd");
      if (-e $file){
      open (FILE, ">$file");}

      繞過這段程序的后果你應(yīng)該想像得到吧?:)
        解決方法?最簡單地,過濾NULL空字符。在PERL程序中,

      $insecure_data=~s///g;


      ------------------------
      2、漏網(wǎng)之魚--反斜杠()
      ------------------------

        對于每一個關(guān)心CGI安全的人,也許都看過 W3C 的 WWW Security FAQ 中關(guān)
      于CGI安全編程一節(jié)。其中列出了建議過濾的字符:

      &;`‘" *?~<>^()[]{}$nr

      但我在很多時候發(fā)現(xiàn)反斜杠()往往被遺忘了。以下是正確的過濾表達式:

      s/([&;`‘\ "*?~<>^()[]{}$nr])/\$1/g;

      但在很多商業(yè)的CGI程序中反斜杠卻沒有被包含進去,這可能是程序員們寫程序
      時被這些過濾用的匹配表達式搞迷糊了?
        那么,沒有過濾反斜杠會造成安全問題嗎?試想一下,如果向你的程序中發(fā)
      送如下一行內(nèi)容:

      user data `rm -rf /`

      大多數(shù)情況下,程序員編寫的程序會將以上內(nèi)容過濾為:

      user data `rm -rf /`

      從而保護了系統(tǒng)。但如果PERL程序中忘記過濾了反斜杠,當(dāng)客戶端向該程序提交
      如下內(nèi)容時:

      user data `rm -rf / `

      經(jīng)過匹配表達式后為:

      user data \`rm -rf / \`

      怎么樣,看出危險了嗎?由于兩個反斜杠經(jīng)系統(tǒng)解釋后為一個字符"",但`字符
      卻因此沒有被過濾掉,`rm -rf / `將被系統(tǒng)執(zhí)行!不過,由于其中還含有一個
      反斜杠字符,執(zhí)行時系統(tǒng)會出錯。你自己想辦法繞過這個限制吧?;-)
        利用反斜杠的另一個應(yīng)用--繞過系統(tǒng)目錄進入限制。請看以下表達式:

      s/..//g;

      這個匹配表達式的作用非常簡單,就是過濾字符串中的".."。當(dāng)輸入為:

      /usr/tmp/../../etc/passwd

      將被過濾為:

      /usr/tmp///etc/passwd

      這樣,你將無法訪問/etc/passwd文件。(注:*nix系統(tǒng)允許///,試一下‘ls -l
      /etc////passwd‘命令就知道了。)
        現(xiàn)在,讓我們的“好伙伴”反斜杠來幫忙。將輸入改為:

      /usr/tmp/../../etc/passwd

      則由于反斜杠的存在而不符合過濾表達式。當(dāng)PERL中存在如下程序段時,

      $file="/usr/tmp/.\./.\./etc/passwd";
      $file=s/..//g;
      system("ls -l $file");

      當(dāng)運行到執(zhí)行系統(tǒng)調(diào)用時,執(zhí)行的命令會是"ls -l /usr/tmp/../../etc/
      passwd"。想知道會得到什么輸出嗎?自己在機器上試試吧。;-)
        然而,以上方法只適用于系統(tǒng)調(diào)用或``命令中。無法繞過PERL中的‘-e‘命令
      和open函數(shù)(非管道)。如下程序:

      $file="/usr/tmp/.\./.\./etc/passwd";
      open(FILE, "<$file") or die("No such file");

      執(zhí)行時將顯示"No such file"并退出。我還沒有找出繞過這個限制的方法。:(

        解決方法:只要別忘了過濾反斜杠字符(),就已足夠了。


      --------------------------------
      3、暢通無阻的“管道”--字符" "
      --------------------------------

        在PERL的open函數(shù)中,如果在文件名后加上" ",則PERL將會執(zhí)行這個文件,
      而不是打開它。即:

      open(FILE, "/bin/ls")

      將打開并得到/bin/ls的二進制代碼,但

      open(FILE, "/bin/ls ")

      將執(zhí)行/bin/ls命令!
        以下過濾表達式

      s/( )/\$1/g

      可以限制這個方法。PERL會提示"unexpected end of file"。如果你找到繞過這
      個限制的方法,請告訴我。:-)


      綜合應(yīng)用

        現(xiàn)在讓我們綜合以上幾種編程安全漏洞加以利用。先舉個例子,$FORM是客
      戶端需要提交給CGI程序的變量。而在CGI程序中有如下語句:

      open(FILE, "$FORM")

      那我們可以將"ls "傳遞給$FORM變量來獲得當(dāng)前目錄列表?,F(xiàn)在讓我們考慮如下
      程序段:

      $filename="/safe/dir/to/read/$FORM"
      open(FILE, $filename)

      如何再執(zhí)行"ls"命令呢?只要能使$FORM="../../../../bin/ls "即可。如果系
      統(tǒng)對目錄操作加入了".."過濾,則可利用反斜杠的漏洞繞過它。
        在這段程序中,我們還可以在命令中加入?yún)?shù)。如"touch /backend ",將
      建立/backend文件。(但我不會使用這個文件名,因為它是我的名字。:-))
        現(xiàn)在,讓我們在程序段中加入更多的安全限制:

      $filename="safe/dir/to/read/$FORM"
      if(!(-e $filename)) die("I don‘t think so!")
      open(FILE, $filename)

      這樣我們還需要繞過"-e"的限制。由于我們在$FORM變量中使用了" "字符,當(dāng)
      "-e"運算符檢查"ls "文件時,因為不存在此文件而退出程序。如何當(dāng)"-e"檢查
      時去掉管道符,而調(diào)用open函數(shù)時又含有管道符呢?回憶一下在前面談到的NULL
      字符的利用,我們就知道應(yīng)該如何做了。只要使$FORM="ls "(注:在客戶端
      提交的表單中為"ls%00 ")即可。其中的原理復(fù)習(xí)一下前面提到的內(nèi)容就會明白
      了。
        需要說明的是,以上程序段中,我們無法象再上一段程序那樣執(zhí)行帶參數(shù)的
      命令,這是因為"-e"運算符的限制所致。舉例如下:

      $filename="/bin/ls /etc "
      open(FILE, $filename)

      將顯示/etc目錄下文件列表。

      $filename="/bin/ls /etc "
      if(!(-e $filename)) exit;
      open(FILE, $filename)

      將導(dǎo)致因不存在文件而退出。

      $filename="/bin/ls /etc "
      if(!(-e $filename)) exit;
      open(FILE, $filename)

      將只顯示當(dāng)前目錄下文件列表。


      【責(zé)任編輯 李旭?!?/span>

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多