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

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. Java Map 在put值时value值不被覆盖

    一.问题描述 最近在代码开发中遇到一个问题,在往Map中put文件路径值然后把Map放到List中去时,遇到问题是Map的后一个值总是把前一个值覆盖,导致最后Map中只有一个值. 二.解决办法(有如下 ...

  2. react-自定义事件

    没有嵌套关系的组件(如兄弟组件)之间的通信,只能通过自定义事件的方式来进行. var EventEmitter = require('events').EventEmitter; import Rea ...

  3. 【Python】Python对象类型及其运算

    Python对象类型及其运算 基本要点: 程序中储存的所有数据都是对象(可变对象:值可以修改 不可变对象:值不可修改) 每个对象都有一个身份.一个类型.一个值 例: >>> a1 = ...

  4. 【Quartz.Net】.net 下使用Quartz.Net

    Quartz.net是作业调度框架 1. 项目中添加quartz.net的引用(这里使用nuget管理) 新建一个类TimingJob,该类主要用于实现任务逻辑   using Quartz; usi ...

  5. ZOJ3113_John

    这个题目是一个典型的Anti_Sg.我也不知道为什么这么叫,呵呵,反正大家都这么叫,而且我也是听别人说,看别人的日志自己才知道的. 题目的意思是给你不同颜色的石子,每次可以去一种颜色的石子若干个(至少 ...

  6. 51nod 1677 treecnt(思维)

    题意: 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少. 现需要计算对于所有选择k个点的情况最小选择边数的总和为多少. 考虑每条 ...

  7. 【转】小心stringstream.str()字符串用法的陷阱

    --------------------- 作者:心中那自由的世界 来源:CSDN 原文:https://blog.csdn.net/119365374/article/details/7744678 ...

  8. Spring Boot系列教程四:配置文件详解properties

    一.配置随机数,使用随机数 在application.properties文件添加配置信息 #32位随机数 woniu.secret=${random.value} #随机整数 woniu.numbe ...

  9. 20135239益西拉姆 Linux内核分析 汇编一个简单的c程序并分析其指令过程

    益西拉姆+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第一周linux内核分析 学习笔记 一.计算机 ...

  10. UVA-11582 数学

    UVA-11582 题意: 求f[a^b]%n ,其中f是斐波那契数列,1<=n<=1000,0<=a,b<=2^64; 代码: //这题重点是要发现 f[i]%n会出现循环, ...