PHP代码审计学习

这是一次分享准备。
自己还没有总结这个的能力,这次就当个搬运工好了~~

0x01 工具准备

PHPSTORM,不只是编程。

个人觉得只要能够提供全局搜索、单页搜索、函数跳转的编辑器就能够满足要求。一般在审计的时候,先找到一个入口点,配合代码和浏览器,一边下断点,一边打印变量,再在浏览器上观察反应。

自动化审计工具,食之无味,弃之可惜。

当然,我手边能用到的自动化审计工具就是能在网上找到资源的那几种。对于快速定位漏洞点来审计,自动化工具是有一定作用的,但是,大多数我能接触到的审计工具大抵是基于规则匹配的或者有一定的数据流向,但由于不能做到语义识别,很多逻辑控制语句无法识别,导致敏感点可可控参数无法自由的跳转结合。

现在的习惯是,有了代码,先会扔进审计工具里跑一跑,看一个大概趋势,如果时间充裕,一般还是愿意一点一点从代码入口点跟进。

0x02 审计初步

审计可以从多个角度切入,首先是搞清楚审计对象的架构,是套了开源的框架,还是原生代码;是MVC,还是仅仅是函数调用。

那么在审计之前,最好就是使用或者熟悉这些常见框架的特性机制。

CI
https://codeigniter.org.cn/

YII2http://www.yiichina.com/

ThinkPHPhttp://www.thinkphp.cn/

Laravelhttps://laravel.com/

熟悉这些框架方便我们快速判断审计点。比如之前的一次代码审计就是套了ThinkPHP的核心代码,结果导致ThinkPHP的漏洞对于那套系统依然适用。

为了能够边学习边实践别人的思想,我这里以MetInfo为例进行学习。

对于快速审计,比如自动化工具,往往可以考虑以下一些切入点。

敏感函数切入

敏感函数包括能够代码执行(PHP、MYSQL)的函数、上传下载文件的函数、文件读取的函数、加载资源的函数。

  • eval()- 海洋CMS6.28

@eval(“if(“.$strIf.”){\$ifFlag=true;}else{\$ifFlag=false;}”);

  • exec()-imo云办公

$result = exec($_POST[‘command’]);

  • preg_replace()-Thinkphp2.1

preg_replace(‘/test/e’, ‘phpinfo()’, ‘just test’);

preg_replace(‘@(w+)’.$depr.’([^’.$depr.’\/]+)@e’, ‘$var[\’\1\’]=”\2”;’, implode($depr,$paths));

……

这一类的函数有很多,这种漏洞一般可能会呈现两种趋势,一种就是常用函数过滤绕过,一种是不常见函数用法失误的。

漏洞点切入

如果说白盒找敏感函数的话,黑盒上对应的就是优先查找程序的SQL执行点、上传点、登录点、密码找回点等

登录页面、表单接收页面、信息显示页面

普通拼接,这种不多说了,主流开源的代码想挖到这种已经很难了,要么没有拼接的用法,要么就做了更加严格的过滤。

当然,这里有些小技巧,比如多次过滤情况下的绕过。如\include\mail\class.phpmailer.php的1741行:

tip1:
$textMsg = trim(strip_tags(preg_replace(‘/<(head|title|style|script)[^>]*>.*?<\/\\1>/s‘,‘‘,$message)));

这里连续用了两个过滤函数,这两个函数在一起容易造成绕过。

可以使用这两个payload做对比:

<head>evil</head>

<he<>ad>evil</head>

编码注入:

二次编码注入,addslashes、mysql_real_escape_string、mysql_escape_string或者开启GPC来转义,但是,如果再次使用urlencode就会出现二次编码。

  • 文件包含

模块加载,模板加载,cache调用

  • 任意文件读取

寻找文件读取敏感函数

  • 文件上传

move_uploaded_file()

  • 文件删除

unlink()

  • 变量覆盖

extract()

parse_str()

$$

index切入

从软件的index入口点开始,逐渐遍历到所有函数文件。

0x03 审计实践

这里以Metinfo为例进行演示,先大致了解一下该款CMS的结构。

根目录下入口index.php,前台客户逻辑在/member/里,后台逻辑在/admin/里,自己创建的应用在/app/中,
前台的下载/搜索/等逻辑对应在相应的目录下。

常用的功能函数集中在/include/下,重点在*.inc.php和*.func.php中

/index.php
    |
/include/common.inc.php

这个文件很有意思,比如里面有名的变量覆盖,由变量覆盖处跳转到过滤函数daddslashes(),明显这里有国瓷打补丁的痕迹,分享时现场细说,这里就不赘述。
/include/common.inc.php
|

/include/head.php
    |
/app/
    |
/include/

MetInfo由于特殊的变量传递机制和路由机制,使得我们可以轻易访问到任意PHP文件并且携带参数进行测试,所以对于它的审计顺序会更加松散一点。

我这里先从关联性较弱的/about/,/upload/,/search/等几个文件夹看起,最后再集中阅读用户应用的/app/文件夹。

利用前面说到的断点输出变量的方法一点一点调试实例,分享用。

http://127.0.0.1/case/index.php?metid=1&filpy=&fmodule=0&modulefname=2)

到这里都没有什么太大的发现,唯一的感受就是有很多点都很惊险,由于没有用MVC框架,显然很多SQL语句之间的写法差异都比较大。

之后就可以跟进include的功能函数来看,也就是在这里终于知道了一个小漏洞。

前台大概看得差不多,就可以跟进后台admin文件夹看看,这里就会觉得轻松很多,一个后台就不在适用过滤函数了,另一个后台功能更多一点,不过后台漏洞大多就只能算代码BUG,没有前台来得那么惊艳。

大多数的内容打算分享的时候直接口述,这里其实只能算是一个大纲,所以文字上可能不是很通顺。

原文地址:https://www.cnblogs.com/nul1/p/10111338.html

时间: 2024-10-08 10:39:47

PHP代码审计学习的相关文章

bluecms v1.6 sp1 代码审计学习

前言 正式开始代码审计的学习,拓宽自己的知识面.代码审计学习的动力也是来自团队里的王叹之师傅,向王叹之师傅学习. 这里参考了一些前辈,师傅的复现经验和bluecms审计的心得 安装 install.php 搭建完成 seay自动审计 文件包含漏洞 /user.php 742-751行 elseif ($act == 'pay'){ include 'data/pay.cache.php'; $price = $_POST['price']; $id = $_POST['id']; $name =

php代码审计学习之dvwa_sql

0x00 由于转了onenote行列,所以已经好久没有发表新的随笔了,但是想想还是非常有必要的,这几天开始学习php代码审计,所以先开始发这一些的随笔吧! 首先就先通过十大测试平台dvwa开始学习吧,先在这里带上参考的大牛链接,感谢分享 1.http://drops.wooyun.org/papers/483 2.http://www.lxway.com/86980986.htm   is_numeric 函数绕过 3.http://www.cnblogs.com/Safe3/archive/2

代码审计学习之反射型XSS

0x01 基础介绍 xss漏洞分类:一般来说分三种 反射型XSS 保存型XSS 基于DOM的XSS 今天先学习反射型xss:它通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析.执行.它的特点是非持久化,必须用户点击带有特定参数的链接才能引起. 0x02 造成原因及利用 一般来说,许多漏洞造成的原因都是因为对用户的输入太信任造成的,没有进行严谨的过滤,通常在代码审计的过程中,审计获取用户输入的函数或者操作如存储等等 一.对变量直接输出 例如: <?

代码审计学习01-in_array() 函数缺陷

一.开始代码审计之旅 01 从今天起,学习代码审计了,这篇文章就叫代码审计01吧,题目来自 PHP SECURITY CALENDAR 2017 的第一题,结合 红日安全 写的文章,开始吧. 二.先看这道题目 1.题目名称:Wish List 2.in_array() 函数的作用 in_array() 函数的作用是判断第一参数是否存在第二个参数中,存在返回 true,不存在返回 false.需要注意的是,如果函数第三个参数为 true,则第一个参数必须还要和第二个参数同类型,函数才能返回 tru

PHP反序列化漏洞代码审计—学习资料

1.什么是序列化 A.PHP网站的定义: 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示.unserialize()函数能够重新把字符串变回php原来的值. 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字. 按个人理解就是: serialize()将一个对象转换成一个字符串,unserialize()将字符串还原为一个对象. 当然从本质上来说,反序列化的数据本身是没有危害的,用户可控数据进行反序列化是存在危害的. B.PH

2020/1/27代码审计学习

审计涉及的超全局变量 1:全局变量 2:超全局变量 emmm都是一些常见的变量,过了一遍算是巩固一下吧. 原文地址:https://www.cnblogs.com/wangtanzhi/p/12235484.html

Java代码审计连载之—添油加醋

在代码审计中,按业务流程审计当然是必须的,人工的流程审计的优点是能够更加全面的发现漏洞,但是缺点是查找漏洞效率低下.如果要定向的查找漏洞,逆向跟踪变量技术就显得更加突出,如查找XSS.SQL注入.命令执行--等等,逆向查找变量能够快速定位漏洞是否存在,本次已SQL注入为例. 本文作者:黑客小平哥,i春秋首发 前言 本篇文章原本是个PPT,但是一直放着没有分享,想着闲着也是闲着,那就改成文章发布吧.其实本篇重点在于两个知识点,一个是代码审计的逆向思维,另一个是二次攻击漏洞,其他的我都省略了,就写几

thinkphp5.0快速入门(学习php框架及代码审计)

学习php代码审计,很多人停留在初级阶段,大家都知道很多CMS采用MVC架构, 为了深入学习下框架,一边看着thinkphp5.0官方文档,一边写个简单的登陆注册页面以加深理解. 官网提供了好几个文档,发现这个最简单易懂:https://www.kancloud.cn/thinkphp/thinkphp5_quickstart/147278 前端用bootstrap简单拼凑了下. 我使用的是wamp集成环境,http.conf中设置下public目录为公共目录: <VirtualHost *:8

技术专题-PHP代码审计

作者:坏蛋链接:https://zhuanlan.zhihu.com/p/24472674来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一.前言 php代码审计如字面意思,对php源代码进行审查,理解代码的逻辑,发现其中的安全漏洞.如审计代码中是否存在sql注入,则检查代码中sql语句到数据库的传输 和调用过程. 入门php代码审计实际并无什么门槛要求,只需要理解基础的php语法规则,以及理解各种类型漏洞的出现原因则可以开始尝试审计php源代码.通常的漏洞演示中