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

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

【不要错过文末彩蛋】html

前言

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

1、审计工具介绍

PHP 代码审计系统— RIPS

功能介绍nginx

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

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

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

而且使用Parser作了语法分析,实现了跨文件的变量及函数追踪,扫描结果中很是直观地展现了漏洞造成及变量传递过程,误报率很是低。ajax

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

安装方法shell

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

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

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

界面截图

image

seay 源代码审计系统

功能介绍

这些是seay 第一个版本的部分功能,如今最新版本是2.1。

  1. 傻瓜化的自动审计 。
  2. 支持php代码调试 。
  3. 函数/变量定位 。
  4. 生成审计报告。
  5. 自定义审计规则 。
  6. mysql数据库管理 。
  7. 黑盒敏感信息泄露一键审计 。
  8. 支持正则匹配调试 。
  9. 编辑保存文件 。
  10. POST数据包提交 。

    安装方法

安装环境须要 .NET2.0以上版本环境才能运行,下载安装包以后点击下一步就安装好了,很是的简便。

安装包下载地址:http://enkj.jb51.net:81/20140...

操做界面的截图

image

2、代码审计实战

前言

经过刚才安装的两个审计工具运行后咱们能够发现,会分析出不少隐藏的漏洞,那下面咱们看看其中的SQL注入、XSS、CSRF产生的缘由,经过缘由来分析如何去审计代码。

SQL注入

前言

SQL注入漏洞一直是web系统漏洞中占比很是大的一种漏洞,下面咱们来看看SQL注入的几种方式。

SQL 注入漏洞分类

从利用方式角度能够分为两种类型:常规注入、宽字节注入。

常规注入方式,一般没有任何过滤,直接把参数存放到了SQL语句当中,以下图。

image

很是容易发现,如今开发者通常都会作一些过滤,好比使用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漏洞。

从漏洞类型区分能够分为三种类型:

  1. 可显

    攻击者能够直接在当前界面内容中获取想要得到的内容。
  2. 报错

    数据库查询返回结果并无在页面中显示,可是应用程序将数据库报错信息打印到了页面中。
    
    因此攻击者能够构造数据库报错语句,从报错信息中获取想要得到的内容,因此我建议在数据库类中设置不抛出错误信息。
  3. 盲注

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

SQL 注入漏洞挖掘方法

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

  1. 参数接收位置,检查是否有没过滤直接使用 $_GET、$_POST、$_COOKIE参数的。
  2. SQL语句检查,搜索关键词 select update insert 等SQL语句关键处,检查SQL语句的参数是否能够被控制。
  3. 宽字节注入,若是网站使用的GBK编码状况下,搜索guanjianc character_set_client=gbkmysql_set_chatset('gbk') 就行。
  4. 二次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 漏洞分类

  1. 反射型,危害小,通常

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

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

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

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

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

3.dom型,特殊的一种

dom型xss是由于JavaScript执行了dom操做,所形成的xss漏洞,具体以下图。能够看到虽然通过html转义了,可是这块代码在返回到html中,又被JavaScript做为dom元素操做。那当我输入?name=<img src=1 onerror=alert(1)> 的时候依然会存在XSS漏洞。

image

image

xss 漏洞挖掘方法

根据上面的一些特色,能够总结出几个分析出几个挖掘方法:

  1. 数据接收位置,检查 $_GET、$_POST、$_COOKIE是否通过转义。
  2. 常见的反射型XSS搜索这种相似位置发现次数较多。
  3. 而存储型在文章,评论出现比较多。

    XSS 漏洞防范方法

  4. 转义html实体,有两种方式:在入口和出口,我建议是在入口处转义,防止出口位置取出来的时候忘记转义,若是已经在入口转义了,出口位置就不用再次转义。
  5. 在富文本编辑器中,常常会用到一些元素的属性,好比上图的onerror,那咱们还需对元素的属性创建黑白名单。
  6. httpOnly 即便存在xss漏洞,能够把危害大大下降。

CSRF漏洞

CSRF 漏洞介绍

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

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

csrf主要用来作越权操做,并且csrf一直没有被关注起来,因此不少程序如今也没有相关的防范措施。

CSRF 案例

咱们来看下面的一段代码,这个表单当被访问到的时候,用户就退出了登陆。假设有一个转帐的表单,只须要填写对方的用户名,和金额就能够,那若是我提早把URL构造好,发给受害者,当点击后,钱就被转走了。或者我把这个URL放到个人网页中,经过<img src="我构造的URL" ,当其余人打开个人网址后,就中招了。

image

CSRF漏洞挖掘方法

经过上面的描述,咱们知道了漏洞的原有,那咱们审计的时候能够检查处理表单有没有如下判断。

  1. 是否有验证token。
  2. 是否有图片验证码。
  3. 是否有refe信息。

若是三个判断都没有,那么就存在了CSRF漏洞,CSRF不只限于GET请求,POST请求一样存在。

CSRF 漏洞防范方法

  1. 图片验证码,这个想必你们都知道,可是用户体验并很差,咱们能够看下面的一些处理方法。

  2. token验证。

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

  1. Referer信息验证

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

若是HTTP头里包含有Referer的时候,咱们能够区分请求是同域下仍是跨站发起的,因此咱们也能够经过判断有问题的请求是不是同域下发起的来防护CSRF攻击。

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

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

3、常规漏洞的防范方法

taint PHP 安全扩展

功能介绍

Taint 能够用来检测隐藏的XSS code, SQL注入, Shell注入等漏洞,而且这些漏洞若是要用静态分析工具去排查, 将会很是困难, 咱们来看下面这张图:

image

安装方法

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

应用场景

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

ngx_lua_waf

功能介绍

  1. 防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击。
  2. 防止svn/备份之类文件泄漏。
  3. 防止ApacheBench之类压力测试工具的攻击。
  4. 屏蔽常见的扫描黑客工具,扫描器。
  5. 屏蔽异常的网络请求。
  6. 屏蔽图片附件类目录php执行权限。
  7. 防止webshell上传。

安装方法

  • 安装依赖: luajitngx_devel_kitnginx_lua_module

  • 安装nginxngx_lua_waf

  • nginx.conf里的http添加配置

  • 详细安装文档

    效果图

image

总结

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


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


彩蛋

重磅 Chat 分享:

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

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

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

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

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

这里写图片描述

相关文章
相关标签/搜索