资讯专栏INFORMATION COLUMN

PHP 开发者如何做代码审查?

Achilles / 1455人阅读

摘要:我们做代码审计之前选好工具也是十分必要的。一审计工具介绍代码审计系统功能介绍是一款基于开发的针对代码安全审计的软件。自定义审计规则。黑盒敏感信息泄露一键审计。挖掘这种漏洞主要是检查是否使用了,搜索和。

GitChat 作者:汤青松
原文:PHP 开发者如何做代码审查?
关注微信公众号:「GitChat 技术杂谈」 一本正经的讲技术

【不要错过文末彩蛋】

前言

工欲善其事,必先利其器。我们做代码审计之前选好工具也是十分必要的。下面我给大家介绍两款代码审计中比较好用的工具。

一、审计工具介绍 PHP 代码审计系统— RIPS

功能介绍

RIPS是一款基于PHP开发的针对PHP代码安全审计的软件。

另外,它也是一款开源软件,由国外安全研究员Johannes Dahse开发,程序只有450KB,目前能下载到的最新版是0.55。

在写这段文字之前笔者特意读过它的源码,它最大的亮点在于调用了PHP内置解析器接口token_get_all

并且使用Parser做了语法分析,实现了跨文件的变量及函数追踪,扫描结果中非常直观地展示了漏洞形成及变量传递过程,误报率非常低。

RIPS能够发现SQL注入、XSS跨站、文件包含、代码执行、文件读取等多种漏洞,支持多种样式的代码高亮。比较有意思的是,它还支持自动生成漏洞利用。

安装方法

下载地址:https://jaist.dl.sourceforge.....

解压到任意一个PHP的运行目录

在浏览器输入对应网址,可以通过下图看到有一个path 在里面填写你要分析的项目文件路径,点击 scan.

界面截图

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" or 1=1%23时候,会被转换成 1縗’ or 1=1#"。

简单来说%df’会被过滤函数转义为%df’ ,%df’ = %df%5c%27 在使用gbk编码的时候会认为%df%5c是一个宽字节%df%5c%27=縗’,这样就会产生注入。

那如何防御这个宽字节呢?我希望大家开发网站尽量使用UTF8编码格式,如果转换麻烦,最安全的方法就是使用PDO预处理。挖掘这种漏洞主要是检查是否使用了gbk,搜索guanjianc character_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漏洞。

从漏洞类型区分可以分为三种类型:

可显

  
 攻击者可以直接在当前界面内容中获取想要获得的内容。

报错

数据库查询返回结果并没有在页面中显示,但是应用程序将数据库报错信息打印到了页面中。

所以攻击者可以构造数据库报错语句,从报错信息中获取想要获得的内容,所以我建议在数据库类中设置不抛出错误信息。

盲注

 数据库查询结果无法从直观页面中获取攻击者通过使用数据库逻辑或使数据库库执行延时等方法获取想要获得的内容。

SQL 注入漏洞挖掘方法

针对上面提到的利用漏洞方法,总结了以下的挖掘方法:

参数接收位置,检查是否有没过滤直接使用 $_GET、$_POST、$_COOKIE参数的。

SQL语句检查,搜索关键词 select update insert 等SQL语句关键处,检查SQL语句的参数是否可以被控制。

宽字节注入,如果网站使用的GBK编码情况下,搜索guanjianc character_set_client=gbkmysql_set_chatset("gbk") 就行。

二次urldecode注入,少部分情况,gpc可以通过编辑器的搜索urldecode和rawurldecode找到二次url漏洞。

SQL 注入漏洞防范方法

虽然SQL注入漏洞非常多,但是防范起来却挺简单的,下面介绍几个过滤函数和类:

gpc/rutime 魔术引号

过滤函数和类

addslashes

mysql_real_escape_string

intval

PDO 预处理

XSS跨站

前言

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意的特殊目的。

XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。在WEB2.0时代,强调的是互动,使得用户输入信息的机会大增,在这个情况下,我们作为开发者,在开发的时候,要提高警惕。

xss 漏洞分类

反射型,危害小,一般

反射型XSS原理:就是通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特定的代码参数会被HTML解析,执行,如此就可以获取用户的COOIKE,进而盗号登陆。比如hack甲构造好修改密码的URL并把密码修改成123,但是修改密码只有在登陆方乙才能修改,乙在登陆的情况下点击甲构造好的URL将直接在不知情的情况下修改密码。

特点是:非持久化,必须用户点击带有特定参数的链接才能引起。

存储型,危害大,影响时间长

存储型XSS原理,假设你打开了一篇正常的文章页面,下面有评论功能。这个时候你去评论了一下,在文本框中输入了一些JavaScript代码,提交之后,你刷新这个页面后发现刚刚提交的代码又被原封不动的返回来并且执行了。

这个时候你会想,我要写一段JavaScript代码获取cookie信息,然后通过ajax发送到自己的服务器去。构造好代码后你把链接发给其他的朋友,或者网站的管理员,他们打开JavaScript代码就执行了,你服务器就接收到了sessionid,你就可以拿到他的用户权限了。

3.dom型,特殊的一种

dom型xss是因为JavaScript执行了dom操作,所造成的xss漏洞,具体如下图。可以看到虽然经过html转义了,但是这块代码在返回到html中,又被JavaScript作为dom元素操作。那当我输入?name= 的时候依然会存在XSS漏洞。

xss 漏洞挖掘方法

根据上面的一些特点,可以总结出几个分析出几个挖掘方法:

数据接收位置,检查 $_GET、$_POST、$_COOKIE是否经过转义。

常见的反射型XSS搜索这种类似位置发现次数较多。

而存储型在文章,评论出现比较多。

XSS 漏洞防范方法

转义html实体,有两种方式:在入口和出口,我建议是在入口处转义,防止出口位置取出来的时候忘记转义,如果已经在入口转义了,出口位置就不用再次转义。

在富文本编辑器中,经常会用到一些元素的属性,比如上图的onerror,那我们还需对元素的属性建立黑白名单。

httpOnly 即使存在xss漏洞,可以把危害大大降低。

CSRF漏洞

CSRF 漏洞介绍

CSRF(Cross-site request forgery)跨站请求伪造,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户。

而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

csrf主要用来做越权操作,而且csrf一直没有被关注起来,所以很多程序现在也没有相关的防范措施。

CSRF 案例

我们来看下面的一段代码,这个表单当被访问到的时候,用户就退出了登录。假设有一个转账的表单,只需要填写对方的用户名,和金额就可以,那如果我提前把URL构造好,发给受害者,当点击后,钱就被转走了。或者我把这个URL放到我的网页中,通过 ,当其他人打开我的网址后,就中招了。

CSRF漏洞挖掘方法

通过上面的描述,我们知道了漏洞的原有,那我们审计的时候可以检查处理表单有没有以下判断。

是否有验证token。

是否有图片验证码。

是否有refe信息。

如果三个判断都没有,那么就存在了CSRF漏洞,CSRF不仅限于GET请求,POST请求同样存在。

CSRF 漏洞防范方法

图片验证码,这个想必大家都知道,但是用户体验并不好,我们可以看下面的一些处理方法。

token验证。

token验证方法如下,每次访问表单页的时候,生成一个不可预测的token存放在服务器session中,另外一份放页面中,提交表单的时候需要把这个token带过去,接收表单的时候先验证一下token是否合法。

Referer信息验证

大多数情况下,浏览器访问一个地址,其中header头里面会包含Referer信息,里面存储了请求是从哪里发起的。

如果HTTP头里包含有Referer的时候,我们可以区分请求是同域下还是跨站发起的,所以我们也可以通过判断有问题的请求是否是同域下发起的来防御CSRF攻击。

Referer验证的时候有几点需要注意,如果判断Referer是否包含*.XXX.com,如果有子域名有漏洞,会存在绕过的可能。

如果判断的条件的是Referer中是否包含字符‘xxx.com’ 那攻击者在他目录中建立一个xxx.com文件夹同样存在绕过的可能。如果可以最合适的判断是,直接判断是否等于当前域名。

三、常规漏洞的防范方法 taint PHP 安全扩展

功能介绍

Taint 可以用来检测隐藏的XSS code, SQL注入, Shell注入等漏洞,并且这些漏洞如果要用静态分析工具去排查, 将会非常困难, 我们来看下面这张图:

安装方法

下载taint: http://pecl.php.net/package/t...

配置

/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

更加详细的可以参考 http://www.cnblogs.com/linzhe...

应用场景

开发团队要求每个人都做到非常的安全比较难,但是把taint安装在开发环境,特别适合,一看到warning信息一般都回去改。

ngx_lua_waf

功能介绍

防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击。

防止svn/备份之类文件泄漏。

防止ApacheBench之类压力测试工具的攻击。

屏蔽常见的扫描黑客工具,扫描器。

屏蔽异常的网络请求。

屏蔽图片附件类目录php执行权限。

防止webshell上传。

安装方法

安装依赖: luajitngx_devel_kitnginx_lua_module

安装nginxngx_lua_waf

nginx.conf里的http添加配置

详细安装文档

效果图

总结

这次分享的内容代码审计处理常规漏洞部分挑选了三种类型,还有其他的一些一次也讲不完。代码身材除了像刚才的的参数检查之外,还有逻辑性漏洞审查,下次如果有时间会再做一次逻辑漏洞审计分享。


实录:《汤青松:PHP 代码审查常规漏洞实战解析》


彩蛋

重磅 Chat 分享:

《高效学习,快速变现:不走弯路的五大学习策略》

分享人:
一名会在 B 站直播写代码,会玩杂耍球、弹 Ukulele、极限健身、跑步、写段子、画画、翻译、写作、演讲、培训的程序员。喜欢用编程实现自己的想法,在 Android 市场上赚过钱,有多次创业经历。擅长学习,习惯养成,时间管理。身体力行地影响他人做出积极的改变!目前就职于 ThoughtWorks,致力于传播快乐高效的编程理念。业余创立软件匠艺社区 CodingStyle.cn,组织超过30场技术活动。

Chat简介:
说到学习呀,真是头大哟:碎片化,没有较长的连续时间来学习难专注,捧起书,手机却在召唤:来呀,快活呀~ 反正有,大把时光~做不到,看了很多书,生活中却做不到然并卵,学了方法和工具,找不到使用场景效率低,学习速度跟不上知识产生的速度记不牢,学习速度赶不上遗忘速度在这个知识泛滥、跨界竞争的年代,学习能力才是核心竞争力。你想想,过去一周,有没有哪一件工作是不需要学习就能完成的?尽管如此重要,大部分人却没研究过学习这件事,以为上下班路上打开「得到」听本书,就是碎片时间终身学习者了。

我是程序员,咨询师,培训师,这几个角色都要求我必须学得又快又好。本场 Chat 将分析学习的「趋势,原则,策略」,帮你站在更高的视角看待学习,从「内容,动机,交互,收益,资源」五方面制定策略,解决学习痛点,助你成为高效学习者!

想要免费参与本场 Chat ?很简单,「GitChat技术杂谈」公众号后台回复「高效学习」

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25887.html

相关文章

  • 第2章:软件构建的过程和工具 2.2软件构建的过程,系统和工具

    摘要:建模语言建模语言是可用于表达信息或知识或系统的任何人造语言,该结构由一组一致的规则定义,目标是可视化,推理,验证和传达系统设计。将这些文件安排到不同的地方称为源代码树。源代码树的结构通常反映了软件的体系结构。 大纲 软件构建的一般过程: 编程/重构 审查和静态代码分析 调试(倾倒和记录)和测试 动态代码分析/分析 软件构建的狭义过程(Build): 构建系统:组件和过程 构建变体...

    godiscoder 评论0 收藏0
  • 作为开发人员,这四类Code Review方法你都知道吗?

    摘要:类型瞬时的代码审查第一种类型是瞬时代码审查,它发生在结对编程的情景中。相同的专业水平考虑进行结对编程的另一个重要方面,是一起工作时,两个开发者的专业水平。让一个初级开发者和一个高级开发者进行结对编程,效果并不好。 本文翻译自:https://dzone.com/articles/4-... 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 没...

    姘搁『 评论0 收藏0
  • PHP 标准规范

    摘要:标准规范简介是的简写,由组织制定的规范,是开发的实践标准。具体标准有有了统一编码风格规范,更有利于查看和学习各个框架或类库,不不需要每次都适应新的编码风格。同时在开发团队内部使用统一的编码规范更有利于代码审查版本控制团队内部交流。 PHP 标准规范 PSR PSR 简介 PSR 是 PHP Standard Recommendations 的简写,由 PHP FIG 组织制定的 PHP...

    FuisonDesign 评论0 收藏0
  • 以太坊将成为新互联网的支柱

    摘要:以太坊将成为新互联网的支柱,我为什么这么说正在以太坊上构建我们的第层,而不是其他区块链平台这就是原因。以太坊不会牺牲去中心化的原则而下沉权力在区块链方面,有一项称为可扩展性三难的基本法则。 以太坊将成为新互联网的支柱,我为什么这么说?Loom Network正在以太坊上构建我们的第2层,而不是其他区块链平台——这就是原因。 每个月都有其他的公司发布白皮书,声称已经解决了以太坊所面临的可...

    liuhh 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<