收藏 分享(赏)

代码审计:企业级Web代码安全架构.pdf

上传人:jintaihu 文档编号:5712699 上传时间:2022-06-16 格式:PDF 页数:80 大小:5.52MB
下载 相关 举报
代码审计:企业级Web代码安全架构.pdf_第1页
第1页 / 共80页
代码审计:企业级Web代码安全架构.pdf_第2页
第2页 / 共80页
亲,该文档总共80页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、信息安全技术丛书代码审计:企业级 Web 代码安全架构尹 毅 编著图书在版编目(CIP)数据代码审计:企业级 Web 代码安全架构 / 尹毅编著 . 北京:机械工业出版社,2015.12(信息安全技术丛书)ISBN 978-7-111-52006-1I. 代II. 尹III. 计算机网络安全技术IV. TP393.08中国版本图书馆 CIP 数据核字(2015)第 260798 号代码审计是企业安全运营的重要步骤,也是安全从业者必备的基础技能。本书详细介绍代码审计的设计思路以及所需要的工具和方法,不仅用大量案例介绍了实用方法,而且剖析了各种代码安全问题的成因与预防方案。无论是应用开发人员还是安

2、全技术人员都能从本书获益。本书共分为三个部分。第一部分为代码审计前的准备,包括第 1 2 章,第 1 章详细介绍代码审计前需要了解的 PHP 核心配置文件以及 PHP 环境搭建的方法;第 2 章介绍学习 PHP 代码审计需要准备的工具,以及这些工具的详细使用方法。第二部分着重介绍 PHP 代码审计中的漏洞挖掘思路与防范方法,包括第 3 8 章,第 3 章详细介绍PHP 代码审计的思路,包括根据关键字回溯参数、通读全文代码以及根据功能点定向挖掘漏洞的三个思路;第 4 6章则介绍常见漏洞的审计方法,分别对应基础篇、进阶篇以及深入篇,涵盖 SQL 注入漏洞、XSS 漏洞、文件操作漏洞、代码 / 命令

3、执行漏洞、变量覆盖漏洞以及逻辑处理等漏洞;第 7 章介绍二次漏洞的挖掘方法;第 8 章介绍代码审计过程中的一些重要技巧。第三部分主要介绍 PHP 安全编程规范,从攻击者的角度来告诉你应该怎么写出更安全的代码,包括第 9 12 章,第 9 章介绍参数的安全过滤;第 10 章介绍 PHP 中常用的加密算法;第 11 章从设计安全功能的角度出发,从攻击者的角度详细分析常见功能通常会出现的安全问题以及解决方案;第 12 章介绍企业的应用安全体系建设,介绍横向细化策略和纵深防御策略的具体实施方法与典型案例。代码审计:企业级 Web 代码安全架构出版发行:机械工业出版社(北京市西城区百万庄大街 22 号邮

4、政编码:100037)责任编辑:吴怡 责任校对:董纪丽印刷: 版次:2016 年 1 月第 1 版第 1 次印刷开本:186mm240mm1/16 印张:15.25书号: ISBN 978-7-111-52006-1 定价:59.00 元凡购本书,如有缺页、倒页、脱页,由本社发行部调换客服热线: (010)8837942688361066 投稿热线: (010)88379604购书热线: (010)683262948837964968995259 读者信箱:版权所有侵权必究封底无防伪标均为盗版本书法律顾问:北京大成律师事务所韩光 / 邹晓东Preface 序言我第一次见到尹毅是 2013 年在

5、北京中关村。那时候我正在安全宝创业,我们需要招募到最好的人才。这时候尹毅的博客吸引了我,在一个技术分享逐渐枯竭的时代,他的博客令人眼前一亮。然后我试图联系到了他,并邀请到北京来聊一聊。让我大吃一惊的是,尹毅当时还是一个孩子模样,但是时不时能从生涩的脸庞里看到成熟。在这个年纪就出来工作,我想他一定吃过很多苦。在之后的工作中,尹毅展现出了惊人的天赋。交给他的工作总是能迅速并出色地完成,并时不时会在工作中有一些创新性成果令人惊喜。他的自驱力极强,总是不满足于简单的工作,于是我不得不想出一些更复杂和艰难的挑战交给他。2014 年 9 月,安全宝分拆了部分业务被阿里收购,我带着尹毅一起到了阿里。此时他已

6、经成为一个安全团队的 Leader,在中国最大的互联网公司里贡献着力量。尹毅学东西很勤奋,他平时的业余时间就是写代码,或者看技术文章,因此进步迅速。他很快就在 Web 漏洞挖掘能力方面有了长足的进步,并取得了不错的成绩,他陆续发现了好些开源软件的高危漏洞。最难能可贵的是,他开始逐步总结这些经验,并且沉淀在自己开发的一个漏洞挖掘工具里。这让他学会了如何从重复的体力劳动中解放出来,把精力用在更有价值的地方。这是一个优秀黑客应具有的特质:厌倦重复性的体力劳动,而对创新充满着无限的热情和旺盛的精力。尹毅认为,一个好的黑客,必须要懂编程。这也是他在这本书里所倡导的理念。在他看来,不懂编程、没挖过漏洞的黑

7、客,充其量只能算“脚本小子” 。所以,尹毅在本书的出发点是从代码审计开始,通过代码审计,去发现和挖掘漏洞。漏洞挖掘是一门艺术,同时也是信息安全的核心领域。安全技术发展到今天,常见的漏洞挖掘技术有代码审计、黑盒测试、Fuzzing、逆向分析等。每一种技术都有独到之处,而其中,代码审计又是最基本、最直接的一种方式,是每一个安全专家都应该IV掌握的技能。但时至今日,全自动化的代码审计仍然存在很多困难,主要难点在于理解编程语言的语法、跨文件之间的关联调用、理解开发框架、业务逻辑等地方。因为这些困难在短期内难以克服,所以通过代码审计来挖掘漏洞,仍然是一种极具技巧性和需要丰富经验的工作。在本书中,尹毅根据

8、他自身的经验和学习成果,对这些知识技巧做了一个很好的总结。本书虽然主要讲述的是 PHP 代码安全问题,但其中的很多思想和案例都非常具有代表性。同时,因为互联网上大量的 Web 应用都是由 PHP 写成的,因此研究 PHP 代码安全对于整个互联网 Web 安全的研究具有至关重要的作用。对于新人来说,非常建议从本书中讲述的内容开始学习。吴翰清,阿里云云盾负责人, 白帽子讲 Web 安全作者2015.9.20Preface 前言代码审计是指对源代码进行检查,寻找代码中的 bug,这是一项需要多方面技能的技术,包括对编程的掌握、漏洞形成原理的理解,系统和中间件等的熟悉。为什么需要代码审计代码审计是企业

9、安全运营以及安全从业者必备的基础能力。代码审计在很多场景中都需要用到,比如企业安全运营、渗透测试、漏洞研究等。目前已经有不少公司在推广微软的软件 SDL(Security Development Lifecycle,安全开发周期) ,它涵盖需求分析设计编码测试发布维护,安全贯穿整个软件开发周期,其中设计、编码和测试是整个 SDL 的核心,安全问题大多在这里被解决掉。其中在安全设计这块,必须要非常了解漏洞形成原理,纵观全局。而在代码实现也就是编码阶段,安全依靠于编程人员的技术基础以及前期安全设计的完善性。然后是测试,测试包括白盒测试。黑盒测试以及灰盒测试。黑盒测试也叫功能测试,是指在不接触代码的

10、情况下,测试系统的功能是否有 bug,是否满足设计需求。而白盒测试就是我们说的代码审计,以开放的形式从代码层面寻找 bug,如果发现有 bug 则返回修复,直到没有 bug才允许软件发布上线。渗透测试人员掌握代码审计是非常重要的,因为我们在渗透过程中经常需要针对目标环境对 payload 进行调试。另外,如果通过扫描器扫描到 Web 目录下的一个源码备份包,通常攻击者都会利用源码包找一些配置文件,因为里面有数据库、API等一类配置。如果环境有限制,比如目标站数据库限制连接 IP 等,那么工具小子可能在源码包进行的漏洞利用也就到此为止。对于懂代码审计的人,结果完全不一样,他可以对源码包进行安全审

11、计,发现网站代码里存在的漏洞,然后利用挖掘到的漏VI洞进行渗透。编程能力要求代码审计对编程语言的基础有一定要求,至少要能看得懂代码,这里说的看懂代码不是简单地理解几个 if.else 语句和 for 循环,而是能看懂代码的逻辑,即使有很多函数没见过,也是可以到 Google 去查的。都说编程在语言这块是一通百通,只要我们对编程思想理解得非常透彻,重新接触一种编程语言也是非常快就能上手的,所以不管你之前写过 Java 还是 C# 程序,想玩一玩 PHP 的代码审计都应该不是什么大问题。代码审计环境准备代码审计首先要准备的是审计环境工具,不同的环境会影响漏洞的利用,所以建议Linux 和 Wind

12、ows 系统下的 PHP 环境都搭建一套,并且需要多个 PHP 版本。关于版本切换这块,建议安装 phpStudy,phpStudy 是一套 Apache+Nginx+LightTPD+PHP+MySQL+phpMyAdmin+Zend Optimizer+Zend Loader 的集成环境,可以很方便地安装和切换环境。代码审计的工具有很多个,这里推荐使用笔者开发的 Seay 源代码审计系统以及 RIPS,二者都是免费开源工具。除了自动化审计工具外,还有一些像 Burp Suite、浏览器扩展以及编码工具等审计辅助工具也都是必备的。代码审计思路通常做代码审计都是检查敏感函数的参数,然后回溯变量

13、,判断变量是否可控并且没有经过严格的过滤,这是一个逆向追踪的过程。而代码审计并非这一种手段,还可以先找出哪些文件在接收外部传入的参数,然后跟踪变量的传递过程,观察是否有变量传入到高危函数里面,或者传递的过程中是否有代码逻辑漏洞,这是一种正向追踪的方式,这样的挖掘方式比逆向追踪挖掘得更全。还有一种方式是直接挖掘功能点漏洞,根据自身的经验判断该类应用通常在哪些功能中会出现漏洞,直接全篇阅读该功能代码。可能不少新手对于学习 PHP 代码审计还有一些迷茫,或许之前尝试过学习,但一VII直没有很好的进展,因为代码审计是一门很专的技术活,要学好 PHP 代码审计,需要掌握以下几点: TPHP 编程语言的特

14、性和基础。 TWeb 前端编程基础。 T漏洞形成原理。 T代码审计思路。 T不同系统、中间件之间的特性差异。导读 Introduction本书总共分为三个部分。第一部分为代码审计前的准备,包括第 1 章以及第 2 章,第 1 章详细介绍我们在学习代码审计前需要了解的 PHP 核心配置文件以及 PHP 环境搭建的方法,第 2 章介绍学习 PHP 代码审计需要准备的工具,以及这些工具的详细使用方法。第二部分包括第 3 8 章,着重介绍 PHP 代码审计中的漏洞挖掘思路与防范方法。第 3 章详细介绍 PHP 代码审计的思路,包括根据关键字回溯参数、通读全文代码以及根据功能点定向挖掘漏洞的三个思路。第

15、 4 6 章讲述常见漏洞的审计方法,分别对应基础篇、进阶篇以及深入篇,涵盖SQL 注入漏洞、XSS 漏洞、文件操作漏洞、代码 / 命令执行漏洞、变量覆盖漏洞以及逻辑处理等漏洞。第 7 章介绍二次漏洞的挖掘方法,二次漏洞在逻辑上比常规漏洞要复杂,所以我们需要单独拿出来,以实例来进行介绍。在经过前面几章的代码审计方法学习之后,相信大家已经能够挖掘不少有意思的漏洞。第 8 章将会介绍代码审计中的更多小技巧,利用这些小技巧可以挖掘到更多有意思的漏洞。每类漏洞都有多个配套的真实漏洞案例分析过程,有助于读者学习代码审计的经验。不过,该章不仅介绍漏洞的挖掘方法,还详细介绍这些漏洞的修复方法,对开发者来说,这

16、是非常有用的一部分内容。第三部分包括第 9 12 章,主要介绍 PHP 安全编程的规范,从攻击者的角度来告诉你应该怎么写出更安全的代码,这也是本书的核心内容:让代码没有漏洞。第 9 章主要介绍参数的安全过滤,所有的攻击都需要有输入,所以我们要阻止攻击,第一件要做的事情就是对输入的参数进行过滤,该章详细分析 discuz 的过滤类,用实例说明什么样的过滤更有效果。IX第 10 章主要介绍 PHP 中常用的加密算法。目前 99% 以上的知名网站都被拖过库,泄露了大量的用户数据,而这一章将详细说明使用什么样的加密算法能够帮助你增强数据的安全性。第 11 章涉及安全编程的核心内容。所有的应用都是一个个

17、功能堆砌起来的,该章从设计安全功能的角度出发,从攻击者的角度详细分析常见功能通常会出现的安全问题,在分析出这些安全问题的利用方式后,再给出问题的解决方案。如果你是应用架构师,这些内容能够帮助你在设计程序功能的时候避免这些安全问题。第 12 章介绍应用安全体系建设的两种策略以及实现案例:横向细化和纵深策略,企业的应用安全应把这两种策略深入到体系建设中去。以上就是本书的全部内容,看到介绍之后你是不是有点儿兴奋呢?赶紧来边读边试吧。感言和致谢这本书断断续续写了一年多,期间也发生了很多事情。在 2014 年 9 月的时候从创新工场旗下项目安全宝离职,加入到阿里巴巴安全部。到了一个新的环境,工作上面倒是

18、很快就融入了进去,只是从北京到杭州,是从一个快节奏的城市转到一个慢节奏的城市,感觉整个人变懒了,没有以前在北京那样每天激情澎湃。曾经一度想过放弃,因为心里总感觉像是被捆住了一样,想去做一些事情却因为还有这本书没写完而不能去做。因为写这本书是我必须要做的事情,一是算是给我自己在安全领域的一个交代,二是我承诺过吴怡编辑,一定会努力写好这本书,在这个事情上我看得很严肃,承诺了就一定要做到。为什么说这算是给自己在安全领域的一个交代呢?记得跟不少朋友说过,创业是我必定要做的一个事情,或许哪天转行创业了,在这个行业里留下了点东西也心安了。回想自己从最初迷恋上网络安全到现在,中间的一些转折点和小插曲还挺有意

19、思,比如以全校第一的成绩考上重点高中之后,读了一年就退学去离家很远的软件开发培训学校,花 500 块钱在网吧淘了一台放酷狗都卡得不行的台式机,在重庆连续通宵读书快一年,等等,这些都已经是美好的回忆。在这些美好回忆中遇到很多美好的人,想对他们说声谢谢。感谢父母和姐姐、姐夫,最早去重庆的时候,姐姐还怀着马上要出生的外甥女,跟姐夫开车送我去重庆。学校一个学期一两万的学费,父母预支薪水供我读书,感谢他X们的付出。感谢机械工业出版社的吴怡编辑,如果没有她的鼓励和指导,也不会有这本书的面世,真心感谢她。感谢吴瀚清(网名:刺、道哥、大风) ,在安全宝的时间里,刺总给了我很多帮助,不管是工作上还是个人成长上都

20、给予引导和包容,他是一位真正的好老板。感谢 safekey team 的兄弟们,他们是晴天小铸、tenzy、x0h4ck3r、zvall、yy520 以及 cond0r,本书里面有多个影响非常大的 0day 出自他们之手,我们因为喜欢代码审计而聚集在一起。感谢曾经陪我熬了无数个通宵的好哥们 Snow、小软,我们曾经一起渗透,一起研究,一起写代码,无不分享。感谢工作中同我一起奋斗的同事们,没有他们的辛苦战斗就没有今天我们攻城拔寨的辉煌战绩,他们包括但不限于:翁国军、李翼、全龙飞、曾欢。感谢喜付宝的林能(ID:矢志成谜)对本书提出的建设性建议。尹毅微信:seayace邮箱:博客:微博:http:/

21、 目录序言前言导读第一部分代码审计前的准备第 1 章 代码审计环境搭建 21.1wamp/wnmp 环境搭建 21.2lamp/lnmp 环境搭建 41.3PHP 核心配置详解 6第 2 章 审计辅助与漏洞验证工具 142.1代码编辑器 142.1.1Notepad+ 152.1.2UltraEdit152.1.3Zend Studio 192.2代码审计工具 212.2.1Seay 源代码审计系统 212.2.2Fortify SCA242.2.3RIPS 252.3漏洞验证辅助 272.3.1Burp Suite 272.3.2浏览器扩展 322.3.3编码转换及加解密工具 362.3.4

22、正则调试工具 382.3.5SQL 执行监控工具 40第二部分漏洞发现与防范第 3 章 通用代码审计思路 463.1敏感函数回溯参数过程 463.2通读全文代码 503.3根据功能点定向审计64第 4 章 漏洞挖掘与防范(基础篇) 684.1SQL 注入漏洞 684.1.1挖掘经验 694.1.2漏洞防范 744.2XSS 漏洞 774.2.1挖掘经验 774.2.2漏洞防范 824.3CSRF 漏洞 83XII4.3.1挖掘经验 834.3.2漏洞防范 85第 5 章 漏洞挖掘与防范(进阶篇) 885.1文件操作漏洞 885.1.1文件包含漏洞 885.1.2文件读取(下载)漏洞 935.1

23、.3文件上传漏洞 955.1.4文件删除漏洞 995.1.5文件操作漏洞防范 1005.2代码执行漏洞 1025.2.1挖掘经验 1025.2.2漏洞防范 1085.3命令执行漏洞 1085.3.1挖掘经验 1095.3.2漏洞防范 112第 6 章 漏洞挖掘与防范(深入篇) 1146.1变量覆盖漏洞 1146.1.1挖掘经验 1156.1.2漏洞防范 1216.2逻辑处理漏洞 1226.2.1挖掘经验 1226.2.2漏洞防范 1306.3会话认证漏洞 1316.3.1挖掘经验 1316.3.2漏洞防范 135第 7 章 二次漏洞审计 1367.1什么是二次漏洞 1367.2二次漏洞审计技巧

24、 1377.3dedecms 二次注入漏洞分析 137第 8 章 代码审计小技巧 1428.1钻 GPC 等转义的空子1428.1.1不受 GPC 保护的 $_SERVER变量 1428.1.2编码转换问题 1438.2神奇的字符串 1468.2.1字符处理函数报错信息 泄露 1468.2.2字符串截断 1488.3php:/ 输入输出流 1508.4PHP 代码解析标签 1538.5fuzz 漏洞发现 1548.6不严谨的正则表达式1568.7十余种 MySQL 报错注入 1578.8Windows FindFirstFile 利用 1618.9PHP 可变变量 162第三部分PHP 安全编

25、程规范第 9 章 参数的安全过滤 1669.1第三方过滤函数与类1669.1.1discuz SQL 安全过滤类分析 1679.1.2discuz xss 标签过滤函数分析 1739.2内置过滤函数 175第 10 章使用安全的加密算法 17710.1对称加密177XIII10.1.13DES 加密 17810.1.2AES 加密 18010.2非对称加密 18310.3单向加密185第 11 章业务功能安全设计 18711.1验证码 18711.1.1验证码绕过 18711.1.2验证码资源滥用 19111.2用户登录 19211.2.1撞库漏洞 19211.2.2API 登录 19311.

26、3用户注册 19411.4密码找回 19511.5资料查看与修改 19711.6投票 / 积分 / 抽奖 19811.7充值支付 20011.8私信及反馈 20011.9远程地址访问 20211.10文件管理 20411.11数据库管理 20511.12命令 / 代码执行 20611.13文件 / 数据库备份 20711.14API 208第 12 章 应用安全体系建设21112.1用户密码安全策略 21112.2前后台用户分表 21312.3后台地址隐藏 21512.4密码加密存储方式 21612.5登录限制21812.6API 站库分离 21812.7慎用第三方服务 21912.8严格的权

27、限控制 22012.9敏感操作多因素验证 22112.10应用自身的安全中心 223参考资源 227第一部分代码审计前的准备漏洞的利用依赖 PHP 版本、Web 中间件版本与类型、操作系统类型和版本以及这些软件的配置等多因素,所以我们在代码审计前需要做不少的准备工作,最重要的是环境搭建和代码审计辅助工具的使用,这一部分将从代码审计环境的搭建和这些工具的使用来展开介绍。第 1 章主要介绍环境的搭建,包括 wamp/wnmp 环境以及 lamp/lnmp 环境。这些环境搭建是简单的。这里要重点理解的是 PHP 的核心配置,大多数情况下 PHP 的配置可以决定一个漏洞能否利用。在代码审计过程中,需要

28、用到很多额外的辅助工具,比如编辑器、代码审计系统以及正则表达式工具,等等。借助这些辅助工具,可以大大提高审计效率,所以第 2 章中将着重介绍这些辅助工具的使用。Part 1第 1 章代码审计环境搭建在搭建 PHP 代码审计环境时,因为不是线上环境,为了方便配置环境,所以尽量使用最简单的搭建方法,通常代码审计师都选择安装 wamp/wnmp 或者 lamp/lnmp 等环境集成包,可以快速构建我们所需要的 PHP 运行环境。在选择集成包的时候必须要考虑的是集成环境版本问题,对于 PHP、MySQL、Apache 等服务软件版本,尽量使用目前使用最多的版本,比如 PHP 5.2.X、MySQL 5

29、.0 以上,在针对特殊的漏洞测试时可能还需要安装不同的版本进行测试,还需要在不同的操作系统下测试。1.1wamp/wnmp 环境搭建wamp 组合是使用最多的测试环境,常用的集成环境包有 phpStudy、WampServer、XAMPP 以 AppServ。其中使用最方便且功能最强大的是 phpStudy,该程序包集成最 新 的 Apache+Nginx+Lighttpd+PHP+MySQL+phpMyAdmin+Zend Optimizer+Zend Loader,一次性安装,不需要配置就可以直接使用,是非常方便、好用的 PHP 调试环境。并且它支持 26 种环境组合随意更改,截至目前,它

30、支持 Apache、Nginx、Lighttpd、IIS6/7/8 中任意一种 WebServer 随时在 PHP 5.2、PHP 5.3、PHP 5.4、PHP 5.5、PHP 5.6 中切换组合使用。我们可以在 phpStudy 官网 直接下载phpStudy 安装程序。我们通过官网链接 http:/ 下载最新版的Chapter 1第 1 章代码审计环境搭建3phpStudy。安装后,双击系统桌面上 phpStudy 图标即可启动服务,默认是 Apache+PHP 5.3。这时候访问 http:/ localhost/ 即可看到 phpStudy 探针,如图 1-1 所示。图 1-1 我们

31、可以点击界面上的“其他选项”菜单按钮,在菜单中找到“PHP 版本切换”项,更改配置和切换 Web 服务组合,如图 1-2 所示。图1-24第一部分代码审计前的准备点开选项中的“ PHP 版本切换” 我们看到 26 种环境组合可以供我们随意切换,如图 1-3 所示。图 1-3当我们需要 Nginx 环境时,只需选中 Nginx+PHP*,然后点击“应用”按钮即可。然而,在启动 Web 服务时偶尔也会遇到服务启动失败的情况,最常见的是WebServer 服务端口被占用以及 WebServer 配置文件错误。对于端口占用,解决方案有两种,第一种是更换 WebServer 的服务端口,在配置文件中更改

32、监听端口号即可;第二种则是结束占用端口的进程。如果 Apache 的配置文件 httpd.conf 出错,用命令行模式启动 Apache,并带上参数,Apache 会提示你配置文件哪里有错误,然后就可以针对性地解决,命令是: httpd.exe -w -n Apache2 -k start ,其中 Apache2 表示服务名。1.2lamp/lnmp 环境搭建在不同的操作系统下,漏洞的测试结果也可能会不一样。简单举例,像文件包含截断,在 Windows 下与 Linux 下截断也有不一样的地方。为了更好地测试漏洞,我们还需要搭建 Linux 下的 PHP 环境。跟 Windows 一样,在 L

33、inux 下也有 PHP 集成环境包,常用的有 phpStudy for Linux、lanmp 以及 XAMPP。因为 phpStudy 支持 Apache、第 1 章代码审计环境搭建5Nginx、Lighttpd 中任意一种 WebServer 在 PHP 5.2、PHP 5.3、PHP 5.4、PHP 5.5 中 12种组合的简单切换,为了更方便测试环境调整,所以我们依旧选择 phpStudy 来搭建lanmp 测试环境,phpStudy 支持 CentOS、Ubuntu、Debian 等 Linux 系统。我们通过官网 http:/ 下载最新版的 phpStudy 到虚拟机并进行安装。

34、安装过程很简单,如果你选择的是下载版,只需要执行如下命令:wget -c http:/ +x phpstudy.bin #权限设置./phpstudy.bin #运行安装按提示安装自己所需要的环境组合,如图 1-4 所示。图1-4访问 http:/localhost(如图 1-5 所示) ,说明安装成功。图1-56第一部分代码审计前的准备假如你先安装了 Apache+PHP 5.3,想切换成 Nginx+PHP 5.4,只需再运行一次 ./phpstudy.bin,你会发现有一行是否安装 MySQL 提示,选择“不安装” ,这样只需要编译 Nginx+PHP 5.4,从而节省时间,这样只需要几

35、分钟即可。1.3PHP 核心配置详解代码在不同环境下执行的结果也会大有不同,可能就因为一个配置问题,导致一个非常高危的漏洞能够利用;也可能你已经找到的一个漏洞就因为你的配置问题,导致你鼓捣很久都无法构造成功的漏洞利用代码。然而,在不同的 PHP 版本中配置指令也有不一样的地方,新的版本可能会增加或者删除部分指令,改变指令默认设置或者固定设置指令,因此我们在代码审计之前必须要非常熟悉 PHP 各个版本中配置文件的核心指令,才能更高效地挖掘到高质量的漏洞。我们在阅读 PHP 官方配置说明(http:/ PHP_INI_* 常量的定义,参见表 1-1。表 1-1PHP_INI_* 常量的定义常量含义

36、PHP_INI_USER该配置选项可在用户的 PHP 脚本或 Windows 注册表中设置PHP_INI_PERDIR该配置选项可在 php.ini. .htaccess 或 httpd.conf 中设置PHP_INI_SYSTEM该配置选项可在 php.ini 或 httpd.conf 中设置PHP_INI_ALL该配置选项可在任何地方设置php.ini only该配置选项可仅可在 php.ini 中配置PHP 配置文件指令多达数百项,为了节省篇幅,这里不一一对每个指令进行说明,只列出会影响 PHP 脚本安全的配置列表以及核心配置选项。1. register_globals(全局变量注册开关

37、)该选项在设置为 on 的情况下,会直接把用户 GET、POST 等方式提交上来的参数注册成全局变量并初始化值为参数对应的值,使得提交参数可以直接在脚本中使用。register_globals 在 PHP 版本小于等于 4.2.3 时设置为 PHP_INI_ALL,从 PHP 5.3.0 起被废弃,不推荐使用,在 PHP 5.4.0 中移除了该选项。当 register_globals 设置为 on 且 PHP 版本低于 5.4.0 时,如下代码输出结果为 true。测试代码:第 1 章代码审计环境搭建7?phpif($user=admin) echo true;/do something执行

38、结果如图 1-6 所示。图1-62. allow_url_include(是否允许包含远程文件)这个配置指令对 PHP 安全的影响不可小觑。在该配置为 on 的情况下,它可以直接包含远程文件,当存在 include ($var) 且 $var 可控的情况下,可以直接控制 $var 变量来执行 PHP 代码。allow_url_include 在 PHP 5.2.0 后默认设置为 off,配置范围是 PHP_INI_ALL。与之类似的配置有 allow_url_fopen,配置是否允许打开远程文件,不过该参数对安全的影响没有 allow_url_include 大,故这里不详细介绍。配置 all

39、ow_url_include 为 on,可以直接包含远程文件。测试代码如下:?phpinclude $_GETa;测试截图如图 1-7 所示。3. magic_quotes_gpc(魔术引号自动过滤)magic_quotes_gpc 在安全方面做了很大的贡献,只要它被开启,在不存在编码或者其他特殊绕过的情况下,可以使得很多漏洞无法被利用,它也是让渗透测试人员很头疼的一个东西。当该选项设置为 on 时,会自动在 GET、POST、COOKIE 变量中的单引号() 、双引号() 、反斜杠()及空字符(NULL)的前面加上反斜杠() ,但8第一部分代码审计前的准备图1-7是在 PHP 5 中 mag

40、ic_quotes_gpc 并不会过滤 $_SERVER 变量,导致很多类似 client-ip、referer 一类的漏洞能够利用。在 PHP 5.3 之后的不推荐使用 magic_quotes_gpc, PHP 5.4之后干脆被取消,所以你下载 PHP 5.4 之后的版本并打开配置文件会发现找不到这个配置选项。在 PHP 版本小于 4.2.3 时,配置范围是 PHP_INI_ALL;在 PHP 版本大于 4.2.3时,是 PHP_INI_PERDIR。测试代码如下:?phpecho $_GETseay;测试结果如图 1-8 所示。图1-8第 1 章代码审计环境搭建94. magic_quo

41、tes_runtime(魔术引号自动过滤)magic_quotes_runtime 也是自动在单引号() 、双引号() 、反斜杠()及空字符(NULL)的前面加上反斜杠() 。它跟 magic_quotes_gpc 的区别是,处理的对象不一样,magic_quotes_runtime 只对从数据库或者文件中获取的数据进行过滤,它的作用也非常大,因为很多程序员只对外部输入的数据进行过滤,却没有想过从数据库获取的数据同样也会有特殊字符存在,所以攻击者的做法是先将攻击代码写入数据库,在程序读取、使用到被污染的数据后即可触发攻击。同样, magic_quotes_runtime 在 PHP 5.4之后

42、也被取消,配置范围是 PHP_INI_ALL。 有一个点要记住,只有部分函数受它的影响,所以在某些情况下这个配置是可以绕过的,受影响的列表包括 get_meta_tags()、file_get_contents()、file()、fgets()、fwrite()、fread()、fputcsv()、stream_socket_recvfrom()、exec()、system()、passthru()、stream_get_contents()、bzread()、gzfile()、gzgets()、gzwrite()、gzread()、exif_read_data()、dba_insert()、

43、dba_replace()、dba_fetch()、ibase_fetch_row()、ibase_fetch_assoc()、ibase_fetch_object()、mssql_fetch_row()、mssql_fetch_object()、mssql_fetch_array()、mssql_fetch_assoc()、mysqli_fetch_row()、mysqli_fetch_array()、mysqli_fetch_assoc()、mysqli_fetch_object()、pg_fetch_row()、pg_fetch_assoc()、pg_fetch_array()、pg_f

44、etch_object()、pg_fetch_all()、pg_select()、sybase_fetch_object()、sybase_fetch_array()、sybase_fetch_assoc()、SplFileObject:fgets()、SplFileObject:fgetcsv()、SplFileObject:fwrite()。测试代码如下:#文件1.txt1234#文件1.php?phpini_set(magic_quotes_runtime, 1);echo file_get_contents(1.txt);测试结果如图 1-9 所示。5. magic_quotes_sy

45、base(魔术引号自动过滤)magic_quotes_sybase 指令用于自动过滤特殊字符,当设置为 on 时,它会覆盖掉magic_quotes_gpc=on 的配置,也就是说,即使配置了 gpc=on 也是没有效果的。这个指令与 gpc 的共同点是处理的对象一致,即都对 GET、POST、Cookie 进行处理。而它10第一部分代码审计前的准备图1-9们之前的区别在于处理方式不一样,magic_quotes_sybase 仅仅是转义了空字符和把单引号()变成了双引号() 。与 gpc 相比,这个指令使用得更少,它的配置范围是PHP_INI_ALL,在 PHP 5.4.0 中移除了该选项。

46、测试代码如下:执行结果如图 1-10 所示。图1-106. safe_mode(安全模式)安全模式是 PHP 内嵌的一种安全机制,当 safe_mode=on 时,联动可以配置的指令有 safe_mode_include_dir、safe_mode_exec_dir、safe_mode_allowed_env_vars、safe_mode_第 1 章代码审计环境搭建11protected_env_vars。safe_mode 指令的配置范围为 PHP_INI_SYSTEM,PHP 5.4 之后被取消。这个配置会出现下面限制:1)所有文件操作函数(例如 unlink()、file() 和 inc

47、lude())等都会受到限制。例如,文件 a.php 和文件 c.txt 的文件所有者是用户 a, 文件 b.txt 的所有者是用户 b 并且与文件a.php 不在属于同一个用户的文件夹中,当启用了安全模式时,使用 a 用户执行 a.php,删除文件 c.txt 可成功删除,但是删除文件 b.php 会失败。对文件操作的 include 等函数也一样,如果有一些脚本文件放在非 Web 服务启动用户所有的目录下,需要利用include 等函数来加载一些类或函数,可以使用 safe_mode_include_dir 指令来配置可以包含的路径。2)通过函数 popen()、system() 以及 e

48、xec() 等函数执行命令或程序会提示错误。如果我们需要使用一些外部脚本,可以把它们集中放在一个目录下,然后使用 safe_mode_exec_dir 指令指向脚本的目录。下面是启用 safe_mode 指令时受影响的函数、变量及配置指令的完整列表:apache_request_headers()、ackticks()、hdir()、hgrp()、chmode()、chown()、copy()、dbase_open()、dbmopen()、dl()、exec()、filepro()、filepro_retrieve()、ilepro_rowcount()、fopen()、header()、hi

49、ghlight_file()、ifx_*、ingres_*、link()、mail()、max_execution_time()、mkdir()、move_uploaded_file()、mysql_*、parse_ini_file()、passthru()、pg_lo_import()、popen()、posix_mkfifo()、putenv()、rename()、zmdir()、set_time_limit()、shell_exec()、show_source()、symlink()、system()、touch()。安全模式下执行命令失败的提示,如图 1-11 所示。图1-117. open_basedir PHP 可访问目录open_basedir 指令用来限制 PHP 只能访问哪些目录,通常我们只需要设置 Web 文12第一部分代码审计前的准备件目录即可,如果需要加载外部脚本,也需要把脚本所在目录路径加入到 open_basedir指令中,多个目录以分号 ( ;) 分割。使用 open_basedir 需要注意的一点是,指定的限制实际上是前缀,而不是目录名。例如,如果配置 open_basedir =/www/a,那么目录/www/a 和 /www/ab 都是可以访问的。所以如果要将访问仅限制在指定的目录内,请用斜线结束路径名。例如设置成:open_basedir =

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 技术资料 > 技术方案

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报