PHP代码审计学习
这是一次分享准备。
自己还没有总结这个的能力,这次就当个搬运工好了~~
0x01 工具准备
PHPSTORM,不只是编程。
个人觉得只要能够提供全局搜索、单页搜索、函数跳转的编辑器就能够满足要求。一般在审计的时候,先找到一个入口点,配合代码和浏览器,一边下断点,一边打印变量,再在浏览器上观察反应。
自动化审计工具,食之无味,弃之可惜。
当然,我手边能用到的自动化审计工具就是能在网上找到资源的那几种。对于快速定位漏洞点来审计,自动化工具是有一定作用的,但是,大多数我能接触到的审计工具大抵是基于规则匹配的或者有一定的数据流向,但由于不能做到语义识别,很多逻辑控制语句无法识别,导致敏感点可可控参数无法自由的跳转结合。
现在的习惯是,有了代码,先会扔进审计工具里跑一跑,看一个大概趋势,如果时间充裕,一般还是愿意一点一点从代码入口点跟进。
0x02 审计初步
审计可以从多个角度切入,首先是搞清楚审计对象的架构,是套了开源的框架,还是原生代码;是MVC,还是仅仅是函数调用。
那么在审计之前,最好就是使用或者熟悉这些常见框架的特性机制。
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代码审计学习的更多相关文章
- bluecms v1.6 sp1 代码审计学习
前言 正式开始代码审计的学习,拓宽自己的知识面.代码审计学习的动力也是来自团队里的王叹之师傅,向王叹之师傅学习. 这里参考了一些前辈,师傅的复现经验和bluecms审计的心得 安装 install.p ...
- 代码审计学习01-in_array() 函数缺陷
一.开始代码审计之旅 01 从今天起,学习代码审计了,这篇文章就叫代码审计01吧,题目来自 PHP SECURITY CALENDAR 2017 的第一题,结合 红日安全 写的文章,开始吧. 二.先看 ...
- PHPCMSV9版本代码审计学习
学习代码审计,自己简单记录一下.如有错误望师傅斧正. PHPCMS预备知识 PHPCMS是采用MVC设计模式开发,基于模块和操作的方式进行访问,采用单一入口模式进行项目部署和访问,无论访问任何一个模块 ...
- 2020/1/27代码审计学习之SQL注入漏洞
PHP代码审计SQL注入漏洞 0x00 首先明确什么是SQL注入,SQL语句必须掌握. 常见的注入总的来说可以分为两大类:数字型和字符型. 这两类中包含了诸如报错注入,宽字节注入,盲注,二次注入,co ...
- PHP代码审计学习-PHP-Audit-Labs-day1
0x01 前言 偶然间看到红日团队的PHP代码审计教程,想起之前立的flag,随决定赶紧搞起来.要不以后怎么跟00后竞争呢.虽然现在PHP代码审计不吃香,但是php代码好歹能看懂,CTF中也经常遇到, ...
- PHP代码审计学习-php安全基础
PHP代码审计-php安全基础 php.ini选项 register_globals php>=4.2.0,php.ini 的 register_globals 选项的默认值预设为 Off,当 ...
- ASP代码审计学习笔记 -5.文件下载漏洞
文件下载漏洞 漏洞代码: <% function download(f,n) on error resume next Set S=CreateObject("Adodb.Stream ...
- ASP代码审计学习笔记 -4.命令执行漏洞
命令执行漏洞: 保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令 <%ip=request("ip" ...
- 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 ...
随机推荐
- Java实现简单的RPC框架(美团面试)
一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用) ...
- codepen & js demos
codepen & js demos Mutation Observer & customize resize event listener & demo https://co ...
- 【EF】EF Code-First数据迁移
Code-First数据迁移 首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...
- hihocoder 1828 Saving Tang Monk II (DP+BFS)
题目链接 Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great C ...
- js复选框插件
<div class="selectList selectQgClass" id="selectQgClass"> <div class=&q ...
- HPP注入详解
###HPP参数污染的定义 HTTP Parameter Pollution简称HPP,所以有的人也称之为“HPP参数污染”,HPP是一种注入型的漏洞,攻击者通过在HTTP请求中插入特定的参数来发 ...
- 驱动之DMA的介绍与应用20170210
本文主要介绍的是DMA相关的知识,首先: 1)在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题.即DMA传输前,CPU要把 总线控制权交给DMA控制器,而在结束DM ...
- SAS8.1安装步骤(附图)
安装前应当把系统时间更改到一九九几年. 1.在解压后的文件夹里找到 setup .exe 双击 开始安装 2.单击SAS System Setup 3.点击Next 4.选择 complete 并单击 ...
- SpringMVC接收复杂集合对象(参数)代码示例
原文: https://www.jb51.net/article/128233.htm SpringMVC接收复杂集合对象(参数)代码示例 更新时间:2017年11月15日 09:18:15 作者 ...
- MFC之ListCtrl动态添加按钮
先上效果图: 图中用了一个CListCtrl插件,隐藏了网格线(LVS_EX_GRIDLINES). 添加了“删除”按钮(按钮上贴了图片),选中哪一行则显示在哪一行. 有两种方式创建按钮,一种是直接根 ...