当前位置: 首页 > 后端技术 > PHP

PHP开发人员如何进行代码审查?

时间:2023-03-30 00:56:15 PHP

GitChat作者:唐庆松原文:PHP开发者是如何做代码审查的?关注微信公众号:《GitChat技术谈》一本正经的技术谈【文末彩蛋不要错过】前言工欲善其事,必先利其器。在我们做代码审计之前,选择一个好的工具也是非常有必要的。下面给大家介绍两款比较好用的代码审计工具。一、审计工具介绍PHP代码审计系统——RIPS功能介绍RIPS是一款基于PHP开发的用于PHP代码安全审计的软件。此外,它还是一款开源软件,由国外安全研究员JohannesDahse开发,程序只有450KB,可下载的最新版本为0.55。在写这篇文字之前,作者特意阅读了它的源代码。它最大的亮点是调用了PHP内置的parser接口token_get_all,使用Parser进行语法分析,实现了跨文件的变量和函数跟踪。扫描结果非常直观地展示了漏洞形成和变量传递的过程,误报率非常低。RIPS可以发现SQL注入、XSS跨站、文件包含、代码执行、文件读取等各种漏洞,并支持多种风格的代码高亮显示。有趣的是,它还支持自动生成漏洞。安装方法下载地址:https://jaist.dl.sourceforge.....解压到任意PHP运行目录,在浏览器中输入相应的网址即可。下图中可以看到一个路径,填上你要分析的Project文件路径,点击扫描。界面截图seay源代码审计系统功能介绍这是seay第一版的一些功能,目前最新版本是2.1。傻瓜自动审计。支持PHP代码调试。功能/变量定位。生成审计报告。自定义审计规则。mysql数据库管理。黑盒敏感信息泄露一键审计。支持正则匹配调试。编辑保存文件。POST数据包提交。安装方法安装环境需要.NET2.0以上版本环境才能运行。下载安装包后,点击下一步进行安装,非常简单。安装包下载地址:http://enkj.jb51.net:81/20140...运行界面截图二、代码审计实战前言运行刚刚安装的两个审计工具后,我们可以发现很多隐藏的东西都会被分析完了漏洞,接下来我们来看SQL注入、XSS、CSRF的成因,通过原因分析如何审计代码。SQL注入前言SQL注入漏洞一直是web系统漏洞中非常大的一个漏洞。下面我们来看看SQL注入的几种方式。SQL注入漏洞的分类从利用方式上可以分为两种:常规注入和宽字节注入。在常规的注入方式中,通常没有过滤,参数直接存储在SQL语句中,如下图所示。很容易发现,开发者一般都会做一些过滤,比如使用addslashes(),但有时候过滤并不总是那么容易。编码注入方式宽字节注入,这是怎么回事?在实际环境中,程序员一般不会写上面类似的代码,一般会使用addslashes()等过滤器来过滤从web传来的参数。但有道高一尺,魔高十尺之说。让我们看看白帽子是如何突破的。使用PHP连接MySQL时,设置character_set_client=gbk时,会造成编码漏洞。我们知道addslashes()会将参数1'转换为1',而当我们提交参数1%df'时,它会转换为1',那么当我们输入1%df'或1=1%23时,它会被转换成1缞'或1=1#'。简单的说,%df'会被filter函数转换为%df',%df'=%df%5c%27当使用gbk编码时,%df%5c会被认为是一个宽字节%df%5c%27=缞',这将生成一个注入。那么如何防御这个宽字节呢?希望大家在开发网站的时候尽量使用UTF8编码格式。如果转换麻烦,最安全的方法是使用PDO预处理。挖掘这个漏洞主要是检查是否使用了gbk,搜索guanjiancecharacter_set_client=gbk和mysql_set_chatset('gbk')。第二次urldecode注入,该方法也是由于urldecode使用不当造成的漏洞。我们刚刚了解到addslashes()函数可以防止注入,他会在(')、(")、()前面加上反斜杠进行转义。然后假设我们开启了GPC,我们提交了一个参数,/test.php?uid=1%2527,因为参数中没有单引号,所以第一次解码会变成uid=1%27,%25解码后是%。这时如果在程序中使用urldecode解码,%27会被解码成单引号('),最终结果为uid=1'。现在我们知道原来是urldecode引起的,我们在编辑器中搜索urldecode和rawurldecode就可以找到二级url漏洞。根据漏洞类型,可以分为三种类型:可见攻击者可以在当前界面内容中直接获取想要的内容。错误数据库查询的返回结果不会显示在页面上,而是应用程序将数据库错误信息打印到页面上。因此,攻击者可以构造数据库错误语句,并从错误信息中获取想要的内容,所以我建议在数据库类中不设置错误信息。BlindInjection数据库查询结果无法从直观的页面获取。攻击者通过使用数据库逻辑或延迟数据库库的执行来获得他们想要的东西。SQL注入漏洞挖掘方法针对上述漏洞利用方法,总结出以下挖掘方法:参数接收位置,检查是否没有过滤直接使用$_GET、$_POST、$_COOKIE参数。检查SQL语句,查找SQL语句中的selectupdateinsert等关键字,检查SQL语句的参数是否可以控制。宽字节注入,如果网站使用GBK编码,搜索guanjiancecharacter_set_client=gbk和mysql_set_chatset('gbk')。二次urldecode注入,在少数情况下,gpc可以通过在编辑器中搜索urldecode和rawurldecode来发现二次url漏洞。SQL注入漏洞的防范方法SQL注入漏洞虽然种类繁多,但是要防范起来还是相当简单的。下面是几个过滤函数和类:gpc/rutimemagicquotes过滤函数和addslashesmysql_real_escape_stringintvalPDO预处理XSS跨站前言XSS也叫CSS(CrossSiteScript),跨站脚本攻击。它是指恶意攻击者在网页中插入恶意的html代码。当用户浏览页面时,会执行网页中嵌入的html代码,从而达到恶意的特殊目的。XSS是一种被动攻击,因为它是被动的,不好用,所以很多人往往忽略了它的危害性。WEB2.0时代强调交互,大大增加了用户输入信息的机会。在这种情况下,作为开发者,我们在开发时一定要提高警惕。xss漏洞分类反射型,危害较小,一般反射型XSS原理:通过向他人发送带有恶意脚本代码参数的URL,当该URL地址被打开后,具体的代码参数会被HTML解析执行,从而可以获取用户的COOIKE,然后hack账号登录。比如hackA构造一个修改密码的URL,将密码修改为123,但是修改密码只能由登录方B修改。当B点击A在登录时构造的URL,他会在不知情的情况下直接修改密码。特点是:非持久性,用户必须点击一个带有特定参数的链接才能引起。存储型,危害大,影响长远存储型XSS的原理,假设你打开一个正常的文章页面,下面有一个评论功能。这时,你在文本框中进行了注释并输入了一些JavaScript代码。提交后,你刷新了页面,发现刚才提交的代码原封不动地返回并执行了。这时候你会想,我要写一段JavaScript代码获取cookie信息,然后通过ajax发送到我的服务器。构造代码后,你把链接发给其他朋友或网站管理员,他们打开JavaScript代码并执行,你的服务器收到sessionid,你就可以获得他的用户权限。3.dom类型,dom类型的一种特殊类型xss是JavaScript执行dom操作导致的xss漏洞,如下图所示。可以看出,虽然经过了html的转义,但是代码返回html,作为dom元素被javascript操作。那么当我输入?name=时,还是会出现XSS漏洞。XSS漏洞挖掘方法根据以上的一些特点,可以总结分析几种挖掘方法:数据接收定位,检查$_GET、$_POST、$_COOKIE是否被转义。常见的反射型XSS搜索此类相似位置的次数更多。存储类型在文章和评论中出现较多。XSS漏洞预防方法对html实体进行转义,有两种方式:在入口处和出口处,我建议在入口处转义,防止出口位置取出时忘记转义,如果在入口处已经被转义,则在出口处位置就不用再逃了。在富文本编辑器中,经常会用到一些元素的属性,比如上图中的onerror,那么我们就需要为元素的属性创建一个黑白列表。即使httpOnly存在xss漏洞,危害也能大大降低。CSRF漏洞CSRF漏洞介绍CSRF(Cross-siterequestforgery)跨站请求伪造,通常简称为CSRF或XSRF,是一种对网站的恶意利用。听起来像跨站点脚本(XSS),但它与XSS有很大不同,后者利用站点内的受信任用户。另一方面,CSRF通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不那么普遍(因此防止它们的资源非常稀缺)并且难以预防,因此它们被认为比XSS更危险。csrf主要用于越权操作,csrf一直没有受到重视,所以现在很多程序都没有相关的防范措施。CSRF案例让我们看下面的一段代码。访问此表单时,用户会注销。假设有转账单,只需要填写对方的用户名和金额即可。如果我提前构造好网址发给受害人,点击后钱就转过去了。或者我把这个网址放到我的网页里,通过