PHP代码审计入门
交流会邀请函
邀请函是在开始交流讨论的前1~3天,发给每个参与嘉宾的说明文档,主要包括参与本次课程讨论所需要的预备知识,每位嘉宾可以进行自学,记录相关问题,进行针对性讨论
具体包括: 交流会时间、参与方式、预期收获、预备知识、嘉宾序号
详细内容
**欢迎您报名参加《PHP代码审计入门》线上交流会**
## 开始时间
2022年8月20日
14:00 ~14:40
## 参入方式
腾讯会议: XXX
入会密码: YYY
## 入会说明
您是本次交流会 5 号嘉宾
请在加入腾讯会议时 将昵称修改为 5号嘉宾-XX
嘉宾号代表您本次的身份,XX您可以填写实名信息或匿名信息
## 预期收获
1. 熟悉代码审计常见思路和方法
2. 独立挖掘PHP代码中的SQL注入和权限类漏洞
3. 能够对代码进行安全性评估
## 预备知识
### PHP语言基本语法(必看)
[变量 https://www.php.net/manual/zh/language.variables.php](https://www.php.net/manual/zh/language.variables.php)
PHP 中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。
[接收参数 https://www.php.net/manual/zh/reserved.variables.php](https://www.php.net/manual/zh/reserved.variables.php)
$_GET — HTTP GET 变量
$_POST — HTTP POST 变量
$_COOKIE — HTTP Cookies
$_REQUEST — HTTP Request 变量
$_SESSION — Session 变量
$_SERVER — 服务器和执行环境信息
[函数 https://www.php.net/manual/zh/funcref.php](https://www.php.net/manual/zh/funcref.php)
[mysql 参考函数 https://www.php.net/manual/zh/refs.database.abstract.php](https://www.php.net/manual/zh/refs.database.abstract.php)
[文件操作 https://www.php.net/manual/zh/ref.filesystem.php](https://www.php.net/manual/zh/ref.filesystem.php)
### php其他资料(选看)
[php类型 https://www.php.net/manual/zh/language.types.php](https://www.php.net/manual/zh/language.types.php)
[php安全 https://www.php.net/manual/zh/security.php](https://www.php.net/manual/zh/security.php)
[更多php介绍 https://www.php.net/manual/zh/langref.php](https://www.php.net/manual/zh/langref.php)
交流会形式
人员: 分为主持人,和参与嘉宾 。主持人负责组织讨论材料包括但不限于PPT、演示环境搭建、下载源代码等,引导嘉宾讨论。
形式: 围绕话题进行讨论,任何时候,嘉宾都可以发言讨论,如果有些时候,实在没有嘉宾想讨论的。 主持人采用随机抽签的方式,选择嘉宾进行参与。
交流会内容
整理的文字版
主题介绍
首先欢迎各位嘉宾 抽空参加 我们的 第四次线上交流会
今天的主题是《PHP代码审计入门》,目标是让每位嘉宾可以迈过代码审计的那道门槛,这里用两个动画来做了诠释,讨论前大家也许是像左边的动画,在代码审计的门外徘徊,通过讨论,希望大家可以真正的进入代码审计的大门,不断提升代码审计的技能
迈过门槛的途径,也是今天的目标: 掌握代码审计的方法论,挖掘php代码中的0day漏洞,能够修复相关漏洞
嘉宾需求讨论
各位嘉宾为什么来付费参与这次的讨论呢? 有什么目标? 这样我们在后面的讨论时,可以针对大家的需求 有所倾斜
我为什么选择这个话题,就是认为代码审计非常的重要,所有的信息系统都是由代码构建的,会代码审计,就能发现很多开源服务中的安全漏洞,指哪打哪。另一方面,能够看懂代码,可以让大家透过问题表面,弄清楚问题产生的根本原因。
代码审计方法
试图找一个介绍代码审计的PPT,但是没有找到合适的,因此自己整理了一份。
做代码审计工作的基础: 语言基础与常见漏洞基础。
第一部分语言基础。就是需要能够掌握,变量定义,接收参数的入口函数,危险函数名,代码实现的基本功能 就是邀请函上,希望大家提前看的一些基础内容
第二部分就是常见的安全漏洞。这部分是参与嘉宾的强项,这个就不用过多介绍了
代码审计最核心的就是找安全漏洞,第一个线路就是先找到输入点/可控点,这里简称可控变量,然后跟踪变量的执行流程,如果变量成功进入危险函数(比如执行命令,执行sql语句)那这就是典型的安全漏洞。第二个线路是围绕系统功能/业务功能进行分析,这里需要说一下,漏洞与功能的关系,如这个图,(业务功能是一个大圆,漏洞也是一个圆)漏洞应该是系统实现了本不应该实现的那部分功能,就可以理解为漏洞。比如命令注入,系统设计时,没有让用户可以在服务器上执行命令的功能,但由于某些原因,用户做到了,就变成了漏洞。
从功能角度,在代码审计过程中,也是以输入点为入口,跟进代码执行,然后我们需要分析一段代码,一个文件,一个函数的大概功能,从攻击者的视角去看,是否能够获得超出功能外的信息。比如一个功能查看系统中用户的详情,需要传入的用户id(id在设计的时候采用mysql 自增字段存储,第一个用户uid 是1 ,第二个用户uid 2), 那这样的功能,是否会算个漏洞?
真实的系统越来越难发现漏洞,因为有很多安全防护功能, 在代码审计中要不断的去识别和绕过相关防御方案
总结一下,想表达的代码审计: 2-1-2法则(注:仅方便记忆,没有理论出处) 以熟悉语言和常见漏洞为理论基础,寻找从输入点到危险函数/超出业务功能的执行路径,即发现安全漏洞
具体审计方法,这个大家都知道 工具法: seay/rips 专注php代码审计的静态工具,checkmarx/fortify 几乎支持所有语言(27种语言)的静态代码审计工具,动态的是awvs/appscan等,现在在静态和动态基础上,出现了iast交互式的,比较有代表性的是火线开源的洞态,据说效果不错,未来希望对这些工具都能组织专题讨论
人工法: 基于语言的开发环境,跟踪程序执行过程,比如php调试使用xdebug工具
有两种方法,就会有第三种方法,人+工结合,据说最严重的安全漏洞log4j2就是通过codeql扫出来,人工确认报警时发现的。
因此,掌握基本的代码审计方法,熟练使用审计工具,让每个人都有机会挖掘出核弹级0day
深入理解可控点
在漏洞挖掘中,可控点,或者输入点是至关重要的,那用户输入到底是哪些,第一幅图说的就是传统的输入点,这里有个函数没有写,大家通过预习准备知识,知道少了哪个函数么?
第二幅图,主要是说数据包的形式,还可能是其他种,比如是上传数据包,XML数据包等,这是文件种的内容都可以做为输入,因为后端服务可能提取文件内容,进行解析处理
第三幅图,想说的数据的流转在系统中可能是很复杂的,可能需要多次交互触发漏洞,如存储型XSS。有些时候是多系统进行交互,大家要能够找到输入点
前面就是咱们今天要讨论的代码审计的方法,这部分大家还有需要继续讨论的么?
代码审计实例
给大家准备了一个演示系统,这是一套由原生php开发,代码简单易懂,大家如果预习了发的php材料,就能看懂
使用范围广,还是比较有价值的
大家最关系的问题,发现的安全漏洞可以提交CNVD领取漏洞的原创证书
可以看到CNVD上 漏洞还是比较多的
主要给大家介绍三个漏洞,第一个是已经在cnVD上提交过的万能密码,第一个是权限漏洞,第三个是一个注入点通过对代码的分析,构造可以绕过相关限制,进行注入
此处省略了演示和讨论过程, 更注重方法的传递,不是具体可能带来风险的实际例子
总结讨论
刚才说过,这是第四次线上交流会
第一次是1人参与的,渗透测试流程交流会
第二次hw面试技巧,参与人数最多,但讨论的并不好
第四次报名时,限定了人数5人,但实到2人
开场页说到,咱们这个是入门交流,帮助大家跨过代码审计的门槛,如果您想真正掌握,利用代码审计挖掘有价值漏洞,还需要不断的练习与提升
纸上得来终觉浅,绝知此事要躬行
阅读关于滑雪的书本身并不能让你滑雪技能出众,阅读关于健身的书本身也无法让你的肌肉强健,同样的地,单独地阅读本书(《谈话的力量》)并不能给你的社会交往带来很多东西。要提高你的社交能力,既需要阅读,更需要坚持不懈、专注地练习。
——摘录《谈话的力量》
交流会说明
这是一个开放的平台,不定期组织讨论内容,如果你有想讨论的话题,可联系我们
备注
作者: 思安 写于: 2022/8/20