<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Php安全

    Posted on 2007-06-13 17:58 my 閱讀(726) 評論(0)  編輯  收藏 所屬分類: php5

    對于腳本安全這個話題好像永遠沒完沒了,如果你經常到國外的各種各樣的bugtraq上,你會發現有一半以上都和腳本相關,諸如SQL injection,XSS,Path Disclosure,Remote commands execution這樣的字眼比比皆是,我們看了之后的用途難道僅僅是抓肉雞?對于我們想做web安全的人來說,最好就是拿來學習,可是萬物抓根源,我們要的不是魚而是漁。在國內,各種各樣的php程序1.0版,2.0版像雨后春筍一樣的冒出來,可是,大家關注的都是一些著名的cms,論壇,blog程序,很少的人在對那些不出名的程序做安全檢測,對于越來越多的php程序員和站長來說,除了依靠服務器的堡壘設置外,php程序本身的安全多少你總得懂點吧。
    有人說你們做php安全無非就是搞搞注入和跨站什么什么的,大錯特錯,如果這樣的話,一個magic_quotes_gpc或者服務器里的一些安全設置就讓我們全沒活路了:(。我今天要說的不是注入,不是跨站,而是存在于php程序中的一些安全細節問題。OK!切入正題。
    注意一些函數的過濾
    有些函數在程序中是經常使用的,像include(),require(),fopen(),fwrite(),readfile(),unlink(),eval()以及它們的變體函數等等。這些函數都很實用,實用并不代表讓你多省心,你還得為它們多費點心。 :)
    1.include(),require()和fopen(),include_once(),require_once()這些都可以遠程調用文件,對于它們的危害,google搜一下你就會很明了,對于所包含調用的變量沒過濾好,就可以任意包含文件從而去執行。舉個例子,看print.php
    ...
    if (empty ($bn) ) { //檢查是變量$bn是否為空
    include ("$cfg_dir/site_${site}.php"); //把$cfg_dir這個路徑里的site_${site}.php包含進來
    ...
    不管存不存在$cfg_dir目錄,$site這個變量你可以很自然的去使用,因為他根本沒檢查$site變量啊。可以把變量$site指定遠程文件去調用,也可以是本地的一個文件,你所指定的文件里寫上php的語句,然后它就去包含執行這個含有php語句的文件了.就像這樣
    列出文件目錄
    甚至可以擴展到包含一些管理員文件,提升權限,典型的像以前phpwind,bo-blog的漏洞一樣。除了依靠php.ini里的allow_url_fopen設為off禁止遠程使用文件和open_base_dir禁止使用目錄以外的文件外,你還得事先聲明好只能包含哪些文件,這里就不多說廢話了。
    2.fopen(),file(),readfile(),openfile(),等也是該特別留意的地方。函數本身并沒什么,它們的作用是去打開文件,可是如果對變量過濾不徹底的話,就會泄露源代碼。這樣的函數文本論壇里會有很多。
    ...
    $articlearray=openfile("$dbpath/$fid/$tid.php"); //打開$dbpath/$fid這個路徑的$tid.php文件
    $topic_detail=explode("|",$articlearray[0]); //用分割符|讀出帖子的內容
    ...
    很眼熟吧,這是ofstar以前版本的read.php,$fid和$tid沒有任何過濾,$tid指定為某個文件提交,就發生了原代碼泄露。就像這樣。
    http://explame.com/ofstar/read.php?fid=123&tid=../index
    $tid會被加上php的后綴,所以直接寫index。這僅僅是個例子,接著看吧。
    3.fwrite()和它的變體函數這種漏洞想想都想得出,對于用戶提交的字符沒過濾的話,寫入一段php后門又不是不可以。
    4.unlink()函數,前段時間,phpwind里任意刪除文件就是利用這個函數,對于判斷是否刪除的變量沒過濾,變量可以指定為任意文件,當然就可以刪除任意文件的變量。
    5.eval(),preg_replace()函數,它們的作用是執行php代碼,如果字符串沒被經過任何過濾的話,會發生什么呢,我就常看見一些cms里面使用,想想,一句話的php木馬不就是根據eval()原理制作的嗎?
    6.對于system()這些系統函數,你會說在php.ini里禁止系統函數,對,這也是好辦法,可是象一些程序里需要,那是不是就不用了呢?就像上次我看到的一套很漂亮的php相冊一樣。另外對于popen(),proc_open(),proc_close()函數你也得特別注意,盡管他們執行命令后并沒有直接的輸出,但你想這到底對黑客們有沒有用呢。再這里php提供提供了兩個函數,escapeshellarg(),escapeshellcmd(),這兩個函數用來對抗系統函數的調用攻擊,也就是過濾。
    對于危害,來舉個例子,我們來看某論壇prod.php
    07 $doubleApp = isset($argv[1]); //初始化變量$doubleApp
    ...
    14 if( $doubleApp ) //if語句
    15 {
    16 $appDir = $argv[1]; //初始化$appDir
    17 system("mkdir $prodDir/$appDir"); //使用系統函數system來創建目錄$prodDir/$appDir

    本來是拿來創建$prodDir/$appDir目錄的,再接著看上去,程序僅僅檢測是否存在$argv[1],缺少對$argv[1]的必要過濾,那么你就可以這樣
    /prod.php?argv[1]=|ls%20-la或者/prod.php?argv[1]=|cat%20/etc/passwd
    (分割符 | 在這里是UNIX的管道參數,可以執行多條命令。)
    到這里,常見的漏洞類型應該知道點了吧。


    對于特殊字符的重視
    對于特殊字符,有句話叫All puts is invalid.外國人文章里這句話很常見的。所有輸入都是有害的。你永遠不要對用戶所輸入的東西省心,為了對付這些危害,程序員都在忙著過濾大把大把的字符,唯恐漏了什么。而有些程序員呢?好像從沒注意過這些問題,從來都是敞開漏洞大門的。不說廢話,還是先看看下面這些東西吧。
    1.其實程序的漏洞里最關鍵,最讓開發者放心不下的就是帶著$符號的美元符號,變量,對于找漏洞的人來說,抓著變量兩個字就是一切。就像目錄遍歷這個bug,很多郵件程序都存在,開發者考慮的很周全,有的甚至加上了網絡硬盤這個東西,好是好,就像
    http://mail.com/file.php?id=1&put=list&tid=1&file=./
    要是我們把file這個變量換成./../甚至更上層呢?目錄就這樣被遍歷了。
    2.尖括號"<>"跨站你不會不知道吧,一些搜索欄里,文章,留言,像前段時間phpwind附件那里的跨站等等。當然,對于跨站問題,你要過濾的遠遠不止尖括號。不怕過濾時漏掉什么,而是怕你想不起要去過濾。
    3.斜桿和反斜桿:對于/和\的過濾,記得魔力論壇的附件下載處的原代碼泄露嗎?
    attachment.php?id=684&u=3096&extension=gif&attach=.\..\..\..\..\..\..\includes\config.php&filename=1.gif
    對于過濾.. / \的問題,像windows主機不僅要過濾../還要過濾..\,windows主機對\會解析為/,這些細節跟SQL injection比起來,什么才叫深入呢?
    4.對于反引號(``),反引號在php中很強大,它可以執行系統命令,就像system()這些系統函數一樣,如果用戶的惡意語句被它所執行的話就會危害服務器,我想除了服務器設置的很好以外,對于它們,你還是老老實實的過濾好吧。
    5.對于換行符,NULL字符等等,像"\t,\x0B,\n,\r,\0這些,這些都是很有用的,像動網以前的上傳漏洞就是因為上傳中的NULL(\0)字符引起的,對于這些能隨意截斷程序流程的字符,你說我們在檢測的時候應該有多細心呢?
    6.分號(;)和分割符(|)
    分號截斷程序流程,就像這個
    shell_exec("del ./yourpath/$file"); //使用系統函數shell_exec刪除文件$file
    變量$file沒指定,那么直接寫zizzy.php;del ./yourpath ,這樣你的yourpath目錄也就被del了。
    分割符(|)是UNIX里自帶的管道函數,可以連接幾條命令來執行。有時候加在過濾不嚴的系統函數中執行。

    邏輯錯誤
    驗證不完全和一些邏輯錯誤在程序里也很容易找到,特別是現在的程序員,只顧深入的學習,而對于邏輯錯誤等等這樣的安全意識都沒有培養的意識,其實這是是靠自己去培養,而不是等著人來報告bug給你。對于邏輯錯誤的判斷,我們只能說,多練練吧,經驗才是最重要的。
    1.對于登陸驗證的問題。舉個例子:我們看某論壇的admin.php片斷
    它這里username 和 password好像不對勁吧,存在管理員的username和password就直接通過驗證,那就意味著沒有用戶名,沒密碼也行吧。我們提交
    GET /bbs/admin/index.php?page=general HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
    Accept-Language: zh-cn
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)
    Host: 127.0.0.1
    Connection: Keep-Alive
    Cookie: username=’or isnull(1/0) AND level=3/*; password=;

    這是我們偽造的一個數據包(你問我咋偽造地?抓包再修改唄),我們使用GET來提交數據,原理也就是在cookie這里構造欺騙語句。
    接著,整個SQL語句就成這樣
    SELECT * FROM users WHERE username=’’or isnull(1/0) AND level=3/*’ AND password=’’
    這里僅僅用一個’or’=’or’的原理,就把username和password的檢測給繞開了,而level=3則是偽造的等級。從而就饒過了檢測,進入了管理后臺。
    對于后臺的驗證不能這么馬虎,兩行代碼就算完事,你還得從SESSION(會話),Cookie這些地方來增強驗證。
    2.上傳漏洞
    有次我看到在一個程序config.php里對上傳文件類型限制是這樣的
    $IllegalExtentions = array(’exe’,’asp’,’php’,’php3’,’bat’,’cgi’,’pl’,’com’,’vbs’,’reg’,’pcd’,’pif’,’scr’,’bas’,’inf’,’vb’,’vbe’,’wsc’,’wsf’,’wsh’); //對于上傳文件的限制,只允許上傳exe,asp,php,php3,bat,cgi,pl,com,vbs,reg,pcd,pif,scr,bas,inf,vb,vbe,wsc,wsf,ws’這些文件。

    規定不許用戶上傳什么什么文件,其它都可以上傳,這種邏輯好不好呢?如果我上傳.inc, ,.php4 .phtml, .html, .pwml 這樣的類型呢?為什么你不把這種邏輯思維改為規定用戶除了這幾種文件能傳,其它的統統不允許上傳。就像這樣,數組改成逆向的思維。
    $IllegalExtentions = array(’rar’,’gif’,’jpg’,’bmp’,’pdf’)//只能上傳rar,gif,jpg,bmp,pdf幾種格式
    其實這個跟你們上傳cer,asa是一個道理。
    3.典型的邏輯錯誤
    在一些cms(整站程序)中隨便注冊個用戶,你會發現修改資料的地方不要求輸入原來的密碼,只通過判斷用戶id或者email,你把網頁保存到本地,把id或email改成管理員的,action 改為修改提交地址,提交你就成了管理員。解決辦法不太難,只要我們增加密碼驗證,增強那個mysql的update語句的過濾也就ok了。
    這些我們也沒辦法,多數程序員對于安全根本不去在意,本來一個人可以去做的事,為什么偏偏要分出搞web安全的和web開發兩種人呢?
    長度問題
    別以為找漏洞的就是為了拿個管理員密碼或者webshell,也有些不安分的人,也就是DDOSer(拒絕服務攻擊者),他們的花樣很多,但對于程序員來說,關鍵就在過濾。我所說的長度問題,不僅僅是個字符的長度,也包括時間的長度,你一定見過有人寫個腳本,一下就注冊成千上萬的用戶,或者純粹的寫垃圾數據把數據庫拖死。這個時候,限制數據提交時間和驗證碼就起作用了。不過要真的遇到狠毒的人,一個變量的過濾問題就可以把網站搞癱瘓,這比用什么網絡僵尸那些軟件來得更快。
    不大不小的問題
    1.絕對路徑的泄露
    這個問題可真是不大不小,很多程序都有,這也算安全的一部分。至少你玩注入loadfile()需要吧。當然,這時的php.ini中的display_errors也可以起作用了。
    2.對后臺的驗證
    不要說不信,我就曾看到一些程序這樣,你去測試,注冊個用戶,提交管理員編輯用戶的URL,比如admin_member.php?action=edit&id=55&level=4&username=zizzy&power=1這樣相應的添加管理員的URL,你會發現幾乎沒驗證,直接成功了。所以,對于后臺的檢測,也很有必要,就像剛出的Discuz的那個漏洞。

    過濾問題不知不覺就說了那么多,寫了好多處該過濾的提醒,現在也該說說了如何進行過濾。
    1.在用戶輸入任何數據,也就是提交變量進數據庫時,我們必須使用addslashes()進行過濾,像我們的注入問題,一個addslashes()也就搞定了。其實在涉及到變量取值時,intval()函數對字符串的過濾也是個不錯的選擇。
    2.在php.ini中開啟magic_quotes_gpc和magic_quotes_runtime。magic_quotes_gpc可以把get,post,cookie里的引號變為斜杠。magic_quotes_runtime對于進出數據庫的數據可以起到格式話的作用。其實,早在以前注入很瘋狂時,這個參數就很流行了。
    3.在使用系統函數時,必須使用escapeshellarg(),escapeshellcmd()參數去過濾,這樣你也就可以放心的使用系統函數。
    4.對于跨站,strip_tags(),htmlspecialchars()兩個參數都不錯,對于用戶提交的的帶有html和php的標記都將進行轉換。比如尖括號"<"就將轉化為 "<"這樣無害的字符。
    5.對于相關函數的過濾,就像先前的include(),unlink,fopen()等等,只要你把你所要執行操作的變量指定好或者對相關字符過濾嚴密,我想這樣也就無懈可擊了。

    服務器安全設置

    談服務器安全設置,我覺得很不實際的,我們大多數人都用虛擬主機,對于php.ini怎么設,那個只有網管自己看著辦了。不過我還是說下,
    1.設置“safe_mode”為“on”
    這對于廣大空間商來說是一個偉大的選項,它能極大地改進PHP的安全性。
    2.禁止“open_basedir” ,這個選項可以禁止指定目錄之外的文件操作,還能有效地消除本地文件或者是遠程文件被include()等函數的調用攻擊。
    3.expose_php設為off ,這樣php不會在http文件頭中泄露信息.
    4.設置“allow_url_fopen”為“off” 這個選項可以禁止遠程文件功能,極力推薦
    5“log_errors”為“on” 錯誤日至得帶上吧
    6..對于“display_errors,register_globals”兩項要視情況而定了,display_errors太消極了,錯誤全關,想調試腳本都不行。至于register_globals(全局變量)把它開起來,關了會很麻煩,現在大多數程序沒它支持就別想用了。
    這些是最必要的設置。關于php服務器更高的安全設置是門學問,也就不在本文探討范圍內了。

    這篇文章到這里就要結束了,也許你會說,你說的這些都是對開源的程序才有用,對那些zend加密的程序不就沒辦法可使了嗎?其實,對安全來說,固其根本才是重要的吧,你再怎么加密難道逃得過黑盒測試?總有一天會被發現的吧。
    限于篇幅也就到這里了,我們對于php程序安全也有了初步的探索。為廣大讀者朋友考慮,舉的例子也算是很容易去理解地,當然前提是你得會點php,要不然又是看天書了(哇,不要看到這里才問我啥是php?)。整篇文章并不是黑客教學,而是為那些想在php安全上發展的初學者和php程序員寫的。如果以后你又聽到誰誰又發現什么漏洞了,再怎么變也就是那些基本的東西而已。我希望本文能為你們開闊下思路,更好的發展下去。嗜酒成癡劍亦狂,重燃你的php安全之火,帶著對php的執著上路吧。

    PHP.ini的安全設置
    談服務器安全設置,我覺得很不實際的,我們大多數人都用虛擬主機,對于php.ini怎么設,那個只有網管自己看著辦了。不過我還是說下,
    1.設置“safe_mode”為“on” 
    這對于廣大空間商來說是一個偉大的選項,它能極大地改進PHP的安全性。
    2.禁止“open_basedir” ,這個選項可以禁止指定目錄之外的文件操作,還能有效地消除本地文件或者是遠程文件被include()等函數的調用攻擊。 
    3.expose_php設為off ,這樣php不會在http文件頭中泄露信息.
    4.設置“allow_url_fopen”為“off” 這個選項可以禁止遠程文件功能,極力推薦
    5“log_errors”為“on” 錯誤日至得帶上吧
    6..對于“display_errors,register_globals”兩項要視情況而定了,display_errors太消極了,錯誤全關,想調試腳本都不行。至于register_globals(全局變量)把它開起來,關了會很麻煩,現在大多數程序沒它支持就別想用了。
    這些是最必要的設置。關于php服務器更高的安全設置是門學問,也就不在本文探討范圍內了。

    posts - 63, comments - 45, trackbacks - 0, articles - 99

    Copyright © my

    主站蜘蛛池模板: 午夜亚洲AV日韩AV无码大全| 永久免费观看黄网站| 亚洲国产成人一区二区精品区| 青苹果乐园免费高清在线| 99精品全国免费观看视频..| 精品韩国亚洲av无码不卡区| 97久久国产亚洲精品超碰热| 亚洲欧洲在线观看| 亚洲综合网站色欲色欲| 亚洲 小说区 图片区 都市| 毛片免费在线播放| 最近高清中文字幕无吗免费看| 国产一级片免费看| 国产一区二区三区免费观在线| 香蕉视频免费在线| 日韩国产欧美亚洲v片| 亚洲永久网址在线观看| 亚洲区视频在线观看| 久久国产亚洲高清观看| 亚洲嫩模在线观看| 亚洲AV日韩AV天堂一区二区三区| 亚洲精品无码MV在线观看| 四虎影视在线永久免费观看| 日韩黄色免费观看| 处破痛哭A√18成年片免费| av无码免费一区二区三区| 19禁啪啪无遮挡免费网站| 91香蕉在线观看免费高清| 久久aa毛片免费播放嗯啊| 久久久久久久99精品免费观看| 在线看片免费人成视频福利| 你懂的免费在线观看| 任你躁在线精品免费| 在线观看特色大片免费网站| 免费国产成人午夜在线观看| 免费国产午夜高清在线视频| 一级毛片在线观看免费| 亚洲一区二区三区免费在线观看| 最近2018中文字幕免费视频| 亚洲无砖砖区免费| 欧美三级在线电影免费|