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

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,没有前台来得那么惊艳。

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

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

  1. bluecms v1.6 sp1 代码审计学习

    前言 正式开始代码审计的学习,拓宽自己的知识面.代码审计学习的动力也是来自团队里的王叹之师傅,向王叹之师傅学习. 这里参考了一些前辈,师傅的复现经验和bluecms审计的心得 安装 install.p ...

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

    一.开始代码审计之旅 01 从今天起,学习代码审计了,这篇文章就叫代码审计01吧,题目来自 PHP SECURITY CALENDAR 2017 的第一题,结合 红日安全 写的文章,开始吧. 二.先看 ...

  3. PHPCMSV9版本代码审计学习

    学习代码审计,自己简单记录一下.如有错误望师傅斧正. PHPCMS预备知识 PHPCMS是采用MVC设计模式开发,基于模块和操作的方式进行访问,采用单一入口模式进行项目部署和访问,无论访问任何一个模块 ...

  4. 2020/1/27代码审计学习之SQL注入漏洞

    PHP代码审计SQL注入漏洞 0x00 首先明确什么是SQL注入,SQL语句必须掌握. 常见的注入总的来说可以分为两大类:数字型和字符型. 这两类中包含了诸如报错注入,宽字节注入,盲注,二次注入,co ...

  5. PHP代码审计学习-PHP-Audit-Labs-day1

    0x01 前言 偶然间看到红日团队的PHP代码审计教程,想起之前立的flag,随决定赶紧搞起来.要不以后怎么跟00后竞争呢.虽然现在PHP代码审计不吃香,但是php代码好歹能看懂,CTF中也经常遇到, ...

  6. PHP代码审计学习-php安全基础

    PHP代码审计-php安全基础 php.ini选项 register_globals php>=4.2.0,php.ini 的 register_globals 选项的默认值预设为 Off,当 ...

  7. ASP代码审计学习笔记 -5.文件下载漏洞

    文件下载漏洞 漏洞代码: <% function download(f,n) on error resume next Set S=CreateObject("Adodb.Stream ...

  8. ASP代码审计学习笔记 -4.命令执行漏洞

    命令执行漏洞: 保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令 <%ip=request("ip" ...

  9. ASP代码审计学习笔记 -3.上传漏洞

    1.ASP上传过程抓包分析: POST /4.asp HTTP/1.1 Host: 192.168.1.102 User-Agent: Mozilla/5.0 (Windows NT 10.0; WO ...

随机推荐

  1. 编码转换,基础,copy

    阅读目录 编码转换 基础补充 深浅拷贝 文件操作 一,编码转换 1. ASCII : 最早的编码. ⾥⾯有英⽂⼤写字⺟, ⼩写字⺟, 数字, ⼀些特殊字符. 没有中⽂, 8个01代码, 8个bit, ...

  2. Oracle判断字段中是否包含中文(若有,取出该中文的方法)

    一.问题说明 在处理数据的时候,需要判断某个字段字符串中是否有中文,若有则取出中文. 二.解决办法 首先如何判断某个字段字符串中是否有中文.这里介绍三种方法: 1.采用ASCIISTR函数 说明:AS ...

  3. xpath定位相邻元素方法

    在定位页面元素时,有时候需要根据某个元素特征,去定位其相邻元素/兄弟元素,或者定位其父元素的兄弟元素(或叔伯元素的子元素).这里引入xpath的两个定位方法: preceding-sibling fo ...

  4. Closest Number in Sorted Array

    Given a target number and an integer array A sorted in ascending order, find the index i in A such t ...

  5. POJ.2251 Dungeon Master (三维BFS)

    POJ.2251 Dungeon Master (三维BFS) 题意分析 你被困在一个3D地牢中且继续寻找最短路径逃生.地牢由立方体单位构成,立方体中不定会充满岩石.向上下前后左右移动一个单位需要一分 ...

  6. java规范(三)-----判空----方法内的为空判断

    一般我们判空或者有判断条件时 都是使用 if(条件成立){ 执行代码 } 这样的逻辑. 但是如果对象的字段很深层次时或者条件很多时就容易形成很多个{}的情况,这样就容易分不出哪个花括号属于哪部分.如下 ...

  7. 【learning】矩阵树定理

    问题描述 给你一个图(有向无向都ok),求这个图的生成树个数 一些概念 度数矩阵:\(a[i][i]=degree[i]\),其他等于\(0\) 入度矩阵:\(a[i][i]=in\_degree[i ...

  8. Linux之系统信息操作20170330

    介绍一下Linux系统中一些自带信息的获取操作等,首先从源码中找到系统信息结构体进行分析. 1.系统信息结构体说明与获取方法: 含义: struct sysinfo { long uptime;    ...

  9. Codeforces 934.C A Twisty Movement

    C. A Twisty Movement time limit per test 1 second memory limit per test 256 megabytes input standard ...

  10. 洛谷P1290 欧几里得的游戏

    题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数 ...