手机版

PHP代码审计详细介绍

时间:2021-11-19 来源:互联网 编辑:宝哥软件园 浏览:

概述代码审计是对应用程序源代码的系统检查。其目的是发现和修复应用程序开发阶段的一些漏洞或程序逻辑错误,避免非法利用程序漏洞带来不必要的风险。代码审计不是简单的检查代码,而是检查代码的原因是为了确保代码能够安全地保护信息和资源,因此熟悉整个应用程序的业务流程对于控制潜在风险非常重要。审计员可以用类似下面这样的问题采访开发人员,以收集应用程序信息。应用程序包含哪些敏感信息,应用程序如何保护这些信息?应用程序是在内部还是外部提供服务?谁会用?他们都是可信用户吗?应用程序部署在哪里?应用对企业有多重要?最好的方法是做一个清单,让开发人员填写。检查表可以直观地反映应用程序的信息和开发人员制定的编码安全性。它应该涵盖可能存在严重漏洞的模块,如:数据验证、身份认证、会话管理、授权、加密、错误处理、日志、安全配置和网络架构。输入验证和输出表明,大多数漏洞主要是由于未能安全验证输入数据或未能安全处理输出数据造成的。严格的数据验证方式是:精确匹配数据,接受白名单中的数据,拒绝黑名单中的数据,对匹配黑名单的数据进行编码。PHP中用户可以输入的变量列表如下: $ _ server $ _ get $ _ post $ _ cookie $ _ request $ _ files $ _ env $ _ http _ cookie _ vars $ _ HTT。p _ env _ vars $ _ http _ get _ vars $ _ http _ post _ files $ _ http _ post _ vars $ _ http _ server _ vars我们应该检查这些输入变量。命令注入攻击是通过将HTML代码输入输入机制(如缺乏有效验证限制的表字段)来改变网页动态生成的内容,可能导致恶意。以下函数:system、exec、passthru、`、shell_exec、popen、proc_open、pcntl_exec可用于PHP执行系统命令。通过在所有程序文件中搜索这些函数,我们可以确定这些函数的参数是否会因为外部提交而发生变化,并检查这些参数是否已经安全处理。代码示例1:复制代码如下://ex1.php?PHP $ dir=$ _ GET[' dir '];if(isset($ dir)){ echo ' pre ';系统(' ls -al '。$ dir);回声'/pre ';}?我们提交的复制代码如下:http://localhost/ex1.php?Dir=| cat /etc/passwd提交后,命令变成以下:系统(' ls-al | cat/etc/passwd ');

注意事项:1。尽量不要执行外部命令;2.使用自定义函数或库来替换外部命令的函数;3.使用擒纵函数处理命令参数;4.使用safe_mode_exec_dir指定可执行文件的路径。esacpeshellarg函数将转义任何导致参数或命令结束的字符。单引号“'”被替换为“\”,双引号“'”被替换为”。替换为“\”,使用safe_mode_exec_dir指定可执行文件的路径,您可以将将要使用的命令提前放入该路径。复制代码如下: safe _ mode=onsafe _ mode _ exec _ dir=/usr/local/PHP/bin/Cross Site Scripting安全威胁跨站点脚本编写(XSS),跨站点脚本编写威胁。攻击者利用应用程序的动态数据显示功能,在html页面中嵌入恶意代码。当用户浏览页面时,这些嵌入在html中的恶意代码就会被执行,用户的浏览器就会被攻击者控制,从而达到攻击者的特殊目的。输出函数经常使用:echo、print、printf、vprintf、%=$test%进行跨站点脚本攻击。攻击形式有三种:(1)反射式跨站点脚本攻击。攻击者会向用户发送一个URL,通过社会工程手段打开。当用户打开页面时,浏览器将执行嵌入在页面中的恶意脚本。(2)存储的跨站点脚本攻击攻击者使用web应用程序提供的数据输入或修改功能将数据存储在服务器或用户cookie中。当其他用户浏览显示数据的页面时,浏览器将执行嵌入在页面中的恶意脚本。所有访客都会受到攻击。(3) DOM跨站点攻击由于在html页面中定义了一个JS,并根据用户的输入显示一个html代码,攻击者可以在输入时插入恶意脚本,在最终显示时执行恶意脚本。DOM跨站点攻击与以上两种跨站点攻击的区别在于,DOM跨站点攻击是纯页面脚本的输出,只有规范使用JAVASCRIPT才能防御。恶意攻击者可以利用跨站点脚本攻击实现:(1)窃取用户cookie和伪造用户身份登录。(2)让查看者被迫执行页面操作,以用户身份向服务器发送请求,达到攻击目的。(3)结合浏览器漏洞,将病毒木马下载到浏览器的电脑上执行。(4)派生网址跳转漏洞。(5)让钓鱼页面出现在官方网站上。(6)蠕虫攻击代码示例直接在html页面显示“用户可控数据”,会直接导致跨站点脚本威胁。复制代码如下:echo“span $ news name/span”;echo " a href=" $ gif URL " $ gif name/a ";echo“输入类型=文本名称=用户值=\ " $ username \echo“span style=' $ style layout '”。htmlentities($context)。"/span ";这些显示模式可能导致用户浏览器执行“用户可控数据”为JS/VBS脚本,或者页面元素被插入“用户可控数据”的页面HTML代码控制,从而引发攻击。解决方案a)在HTML中显示“用户可控数据”之前,应该先进行htmlescape。复制代码如下: html specialchars($ output string,ent _ quotes);Html转义要按照以下列表进行: Copy代码如下:-'-''-'b)“用户可控数据”以javascript输出,需要javascript转义。要转义的字符包括:复制的代码如下:/-\/'-\ ' '-\ ' \-\ ' c)对于输出到富文本的“用户可控数据”,做富文本安全过滤(当允许用户输出HTML时),防止富文本编辑器中脚本代码的存在。SQL注入安全威胁当应用程序将用户输入的内容拼接成SQL语句并提交给数据库执行时,就会出现SQL注入威胁。由于用户的输入也是SQL语句的一部分,攻击者可以利用这个可控的内容注入自己定义的语句,改变SQL语句的执行逻辑,让数据库执行他需要的任何指令。通过控制一些SQL语句,攻击者可以查询数据库中需要的任何数据,并利用数据库的一些特性,直接获得数据库服务器的系统权限。

原来,SQL注入攻击要求攻击者对SQL语句非常了解,所以对攻击者的技术有一定的要求。但在几年前,大量的SQL注入和利用工具出现,可以让任何攻击者只需点击几下鼠标就能达到攻击效果,大大增加了SQL注入的威胁。sql注入攻击的一般步骤:1。攻击者访问带有sql注入漏洞的站点并寻找注入点。2.攻击者构造注入语句,注入语句与程序中的SQL语句相结合,生成新的SQL语句。3.新的SQL语句被提交给数据库执行。4.数据库执行新的SQL语句,导致SQL注入攻击。

该示例没有充分检查输入,这导致SQL语句执行用户作为语句一部分提交的非法数据。示例:复制代码如下。$ id=$ _ GET[' id '];$ name=$ _ GET[' name '];$sql='从新闻中选择* ',其中` id`=$id和` username`=' $ name?解决方案a)安全配置和编码,PHP配置选项在php.ini文件中指定。以下配置方法可以增强php的安全性,并保护应用程序免受sql注入的影响。1)safe _ mode=onhp,将通过file函数或其目录检查当前脚本的所有者是否与要操作的文件的所有者匹配。如果当前脚本的所有者与文件操作的所有者不匹配,则操作是非法的。2)magic _ quotes _ GPC=开/关。如果激活此选项,请求参数中包含的任何单引号、双引号、反斜杠和空字符都将自动用反斜杠转义。3)magic _ quotes _ Sybase=开/关。如果该选项被禁用,PHP将用一个单引号转义所有单引号。请验证数字变量$ id=(int)$ id;注意:PHP6删除了魔法引号选项b)通过预处理执行SQL语句,并绑定传入SQL语句中的所有变量。这样,用户拼接的变量,无论其内容如何,都将被视为替代符号“?”。数据库不会将恶意用户拼接的数据解析为SQL语句的一部分,而是解析该值。示例:复制代码如下: $ stmt=mysqli _ stmt _ init($ link);如果(mysqli_stmt_prepare($stmt),'从名称=?'所在城市选择地区')){/*标记的绑定参数*/mysqli_stmt_bind_param($stmt,' s ',$ city);/*执行查询*/MySQL _ stmt _ execute($ stmt);/*绑定结果变量*/mysqli _ stmt _ bind _ result($ stmt,$ district);/* fetch value */mysqli _ stmt _ fetch($ stmt);MySQL _ stmt _ close($ stmt);}/* close connection */MySQL _ close($ link);文件上传威胁安全威胁PHP文件上传漏洞主要在于验证文件类型时没有正确处理文件变量导致的攻击,导致程序判断逻辑被绕过,攻击者上传脚本文件被服务器解析,从而在上传时任意获取SHELL或复制文件,甚至将脚本木马上传到web服务器直接控制web服务器。示例处理用户上传文件请求的代码。此代码不过滤文件扩展名。复制代码如下://oldUpload.php if(isset($ upload)$ my file!='none '检查($myfile_name)) { copy($myfile,/var/www/upload/'。$ my file _ name);回显“文件”。$file_name。上传成功!单击a href=\'$PHP_SELF '继续上载/a ';退出;}//CheckUpload . php $ DenieDendeXtensions=array(' html ',' htm ',' PHP ',' php2 ',' php3 ',' php4 ',' php5 ',' ph tml ',' pwml ',' inc ',' asp ',' aspx ',' ascx ',' jsp ',' cfm ',' cfc ',' pl ',' bat ',' exe ',' com ',' dll ',' vbs ',' js ',' reg ',' cgi ',' htaccessif($ checkUpload($ _ FILE[' my FILE '][name],$ DeniedExtensions)){ copy($ _ FILE[' my FILE '][tmp _ name],' upload/'。$ _ FILE[' my FIle '][name]);} ?上传标题文件/标题元http-equiv=' content-type ' content=' text/html;charset=GB 2312/head body bgcolor=' # FFFFFF ' Form enctype=' multipart/Form-data '方法='post '上传文件: Input type=' file ' name=' my file ' size=' 30 ' Input type=' submit ' name=' upload ' value=' upload '/Form/body/html该解决方案处理用户上传的文件,需要做以下检查3360 (1。(2)将文件以随机文件名的形式保存在服务器上。(3)上传目录脚本文件不可执行(4)注意。

要从该站发起CSRF攻击,必须使用网站自己的服务,如“自定义头像”功能。恶意用户将其头像网址指定为修改用户信息的链接。当其他登录用户浏览恶意用户头像时,会自动向该链接发送修改信息的请求。从站外发送请求需要恶意用户将自动提交和修改个人信息的htm页面放在自己的服务器上,并将页面地址发送给受害用户,受害用户在打开页面时会发起请求。如果恶意用户可以在网站管理的后台知道某个功能的URL,就可以直接攻击管理员,强制管理员执行恶意用户定义的操作。代码示例一个没有CSRF安全防御的代码如下:复制代码如下:$ user=CheckSqL($ user);$ pass=CheckSqL($ pass);$ SQL=" update UserTB set password=$ user Where user=$ pass ";MySQL _ stmt _ execute($ SQL);代码接收用户提交的参数“user,pass”,然后修改用户的数据。一旦收到用户的请求,就执行修改操作。提交表单代码:复制代码如下:表单动作=' http://localhost/servlet/modify '方法=' post '输入名称=' email '输入名称=' tel '/表单当用户点击提交时,会触发修改操作。攻击示例如果“代码示例”中的代码是xxx.com的web应用程序,则恶意用户可以构建两个HTML页面来攻击xxx.com的登录用户。(1)在页面的a.htm中,iframe查看both,并将宽度和高度都设置为0。复制代码如下: iframe src=' http 3360 b . htm ' width=' 0 ' height=' 0 '/frame。这是因为当攻击发生时,受害者无法看到成功提交结果的页面。(2)在b.htm的页面中,有一个表单和一个脚本。脚本的作用是在页面加载时自动提交表单。复制代码如下: form id=' modify ' action=' http://xxx.com/servlet/modify'方法=' post ' input name=' email ' input name=' tel '/formscriptdocument . getelementbyid(' modify ')。submit();/script(3)攻击者只需将页面a.htm放在自己的web服务器上,并将其发送给登录用户。打开a.htm后,用户将自动提交表单,并将其发送到xxx.com下具有CSRF漏洞的web应用程序,因此用户的信息将被修改。CSRF防御的原理是在用户登录时生成一个随机令牌,并将其存储在cookie中(默认情况下,它也可以放在会话中)。生成表单时,会生成一个隐藏字段,该隐藏字段的值等于token的值。如果用户提交此表单,则可以判断隐藏域的TOKEN值是否与接收用户请求的web应用程序中用户COOKIE中的TOKEN值一致。如果不一致或者没有这个值,就会判断为CSRF攻击。攻击者无法预测每个用户登录时生成的随机TOKEN值,因此无法伪造此参数。常见问题(1)为什么不直接验证推荐人?因为有站内发来的csrf,而且引用者可以被篡改,这是不可靠的数据。(2)如果xss攻击最先发生,如果攻击者可以获得用户页面的令牌怎么办?没有解决办法,请先防范xss。包括PHP可执行文件包:中包含的函数包括,include_once,require,require_once,show_source,highlight_file,readfile,file_get_contents,fopen .文件防止方法:精确匹配输入数据,例如,语言en.php和cn.php是根据变量值确定的,因此这两个文件被放在同一个目录“language/”中。$ _ post ['lang']。PHP ',所以检查提交的数据是en还是cn是最严格的,检查是否只包含字母也不错。通过过滤字符/,在参数中。HTTP响应拆分在PHP中,能够导致HTTP响应拆分的情况有:使用header函数:使用$_SERVER变量。请注意,较高版本的PHP将禁止在HTTP头中出现换行符,因此这个类可以直接跳过这个测试。

预防方法:与输入数据精确匹配。如果输入输出中有\r或\n,在以下情况下会直接拒绝变量覆盖率PHP变量覆盖率: Traverse初始化变量示例3360 Copy代码代码如下: foreach($ _ get as $ key=$ value)$ $ key=$ value;该函数覆盖变量:parse_str、mb_parse_str、import_request_variables,当Register_globals=ON时,GET提交的变量将直接覆盖预防性方法:设置寄存器全局=关。不要用这些函数来获取变量的动态函数。使用动态函数时,如果用户可以控制变量,攻击者就可以执行任意函数。示例:复制代码如下。PHP $ my func=$ _ GET[' my func '];$ my func();防御方法:不要以这种方式使用会话安全功能。当session.cookie_httponly=ON时,客户端脚本(JavaScript等。)无法访问cookie。打开此指令可以有效防止通过XSS攻击劫持会话IDdomain设置。检查session.cookie_domain是否只包含此域。如果它是父域,其他子域可以获得此域的cookiespath设置。请检查session.cookie_path。如果网站本身应用在/app中,则必须将Path设置为/app/以确保安全cookies的持续时间。请检查session.cookie_lifetime。如果时间设置过程过长,即使用户关闭浏览器,攻击者也会危及账户的安全设置。如果使用HTTPS,应该设置会话。确保使用HTTPS传输cookies。如果权限级别发生变化(例如验证用户名和密码后,普通用户晋升为管理员),我们应该修改要重新生成的会话ID,否则程序将面临会话固定攻击的风险。以明文加密和存储密码将严重威胁用户、应用程序和系统的安全。密码的弱加密使用一种易于破解的加密算法。md5加密可以部分使用MD5破解网站破解参考方案。复制代码如下: D5(MD5($ password)。$salt)密码存储在攻击者可以访问的文件中,例如:将密码保存在txt、ini、conf、inc、xml等文件中。或者直接在HTML注释中写认证和授权用户认证校验码的位置,是否可以绕过认证,例如:登录码可能有表单注入。检查登录码是否使用验证码等。防止蛮力破解。有些管理页面禁止普通用户访问,有时开发人员忘记验证这些文件的权限,导致出现漏洞。有些页面使用参数调用函数,但是没有经过权限验证,比如index.php。动作=上传密码硬编码有些程序会把数据库链接账号和密码直接写入数据库链接功能。随机函数rand() VS mt_rand()rand()的最大随机数为32767。当使用rand处理会话时,攻击者可以轻松破解会话,因此建议使用mt_rand()。样本拷贝代码的代码如下。PHP//on window sprint mt _ getrandmax();//2147483647 print getrandmax();//32767?可以看到rand()的最大随机数是32767,很容易被我们的暴力破解。复制代码如下:PHP $ a=MD5(rand());for($ I=0;$ i=32767$i ){if(md5($i)==$a ) {print $i.' -好的!br ';退出;} else { print $ i. ' br}}?当我们的程序使用rand处理会话时,攻击者很容易暴力破解你的会话,但是mt_rand很难做到纯粹的暴力。

版权声明:PHP代码审计详细介绍是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。