免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

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

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

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

這個(gè)例子用于打開客戶端指定的數(shù)據(jù)庫(kù)文件。例如客戶端輸入"backend",則系
統(tǒng)將打開"backend.db"文件考只讀方式)。(注:在這里我們暫且不討論"../"
的安全問(wèn)題。)這種處理方式在互聯(lián)網(wǎng)中是很常見(jiàn)的。
  現(xiàn)在,讓我們?cè)诳蛻舳溯斎?backend%00",在該P(yáng)ERL程序中$database=
"backend.db",然后調(diào)用open函數(shù)打開該文件。但結(jié)果是什么呢?系統(tǒng)會(huì)打
開"backend"文件(,如果該文件存在)!
  出現(xiàn)這種情況的原因是由于PERL允許在字符串變量中使用NULL空字符,而
在C語(yǔ)言中字符串則不允許包含空字符。因此,也就有了"root"!="root"(在
PERL中)和"root"="root"(在C語(yǔ)言中)。由于系統(tǒng)內(nèi)核/調(diào)用等都是使用C
語(yǔ)言編寫,因此當(dāng)PERL將"backend.db"字符串傳遞到(C語(yǔ)言的)鏈接庫(kù)/程序
時(shí),空字符以后的字符將被忽略?(或許還有利用價(jià)值?我還沒(méi)發(fā)現(xiàn)。:))
  這種編程缺陷的影響可大可小。試想一下,如果利用以上編程原理編寫一個(gè)
給系統(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)該知道如何繞過(guò)這個(gè)限制修改root用戶口令了吧?對(duì)了,只要
使 $user="root",則PERL會(huì)執(zhí)行上面程序中花括號(hào)內(nèi)的語(yǔ)句。除非所有處理
過(guò)程均使用PERL,否則一旦該變量傳遞給系統(tǒng),則會(huì)造成安全問(wèn)題。如修改root
用戶口令等。
  也許你認(rèn)為很難遇到這種會(huì)造成嚴(yán)重安全問(wèn)題的情況,那么我們能否將它作
為一種尋找網(wǎng)站源程序漏洞的間接手段呢?;-)
  不知你有沒(méi)有經(jīng)常遇到這種類型的CGI程序,該程序用于打開客戶端(提交
的表單中)要求的頁(yè)面?如:

page.cgi?page=1

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

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

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

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

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

$insecure_data=~s///g;


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

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

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

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

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

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

user data `rm -rf /`

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

user data `rm -rf /`

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

user data `rm -rf / `

經(jīng)過(guò)匹配表達(dá)式后為:

user data \`rm -rf / \`

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

s/..//g;

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

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

將被過(guò)濾為:

/usr/tmp///etc/passwd

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

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

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

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

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

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

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

  解決方法:只要?jiǎng)e忘了過(guò)濾反斜杠字符(),就已足夠了。


--------------------------------
3、暢通無(wú)阻的“管道”--字符" "
--------------------------------

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

open(FILE, "/bin/ls")

將打開并得到/bin/ls的二進(jìn)制代碼,但

open(FILE, "/bin/ls ")

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

s/( )/\$1/g

可以限制這個(gè)方法。PERL會(huì)提示"unexpected end of file"。如果你找到繞過(guò)這
個(gè)限制的方法,請(qǐng)告訴我。:-)


綜合應(yīng)用

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

open(FILE, "$FORM")

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

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

如何再執(zhí)行"ls"命令呢?只要能使$FORM="../../../../bin/ls "即可。如果系
統(tǒng)對(duì)目錄操作加入了".."過(guò)濾,則可利用反斜杠的漏洞繞過(guò)它。
  在這段程序中,我們還可以在命令中加入?yún)?shù)。如"touch /backend ",將
建立/backend文件。(但我不會(huì)使用這個(gè)文件名,因?yàn)樗俏业拿帧?-))
  現(xiàn)在,讓我們?cè)诔绦蚨沃屑尤敫嗟陌踩拗疲?

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

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

$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>

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Web安全技術(shù)與防火墻
apache+php+mysql常見(jiàn)集成環(huán)境安裝包
在shell中調(diào)用sed中替換斜杠的問(wèn)題
Perl程序調(diào)試命令
那一片海----漂泊的靈魂‘Blog - IIS下支持CGI、PERL
PHP是什么?
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服