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 ...
随机推荐
- AtCoder Regular Contest 074 瞎打记
(很长时间没更新了>_<) 由于机房的网总是奥妙重重,开考30多分钟之后我才登进去... 然后发现T1是个简单枚举,1A.T2是个简单优先队列,1A.T3似乎需要一点推导,先看了T4发现是 ...
- ubuntu adduser
ubuntu adduser 添加用户 hexan 到目录 /home/hexan 下.$ sudo adduser hexan -home /home/hexan 添加一个普通用户adduser [ ...
- position:fixed 相对父元素定位
position:fixed是对于浏览器窗口定位的,要实现相当于父元素定位,可以这样: 不设置fixed元素的top,bottom,left,right,只设置margin来实现. 这种方法本质上fi ...
- redis搭建集群并用TreeSoft管理
前言:redis作为一款高效的NOSQL数据库已经深入贯彻和落实到我们的日常开发代码中,作为缓存.时间控制.数据仓库.队列等使用方法层出不穷,简直是开写代码.居家旅行之必备良药.曾经,我们的项目都是单 ...
- PID控制算法的c语言实现十二 模糊PID的参数整定
这几天一直在考虑如何能够把这一节的内容说清楚,对于PID而言应用并没有多大难度,按照基本的算法设计思路和成熟的参数整定方法,就算是没有经过特殊训练和培训的人,也能够在较短的时间内容学会使用PID算法. ...
- phonegap(cordova)从手机app跳转到web页面在跳转回APP本地页面思路
项目中需要用到 WAP支付宝支付. 但是 使用PHONEGAP开发 跳转到支付宝支付,然后跳转回来 就回不到APP的本地页面, 就是使用WAP的第三方登录也是一样的.很难从WAP页面在跳转到 app本 ...
- RabbitMQ消息分发轮询和Message Acknowledgment
一.消息分发 RabbitMQ中的消息都只能存储在Queue中,生产者(下图中的P)生产消息并最终投递到Queue中,消费者(下图中的C)可以从Queue中获取消息并消费. 多个消费者可以订阅同一个Q ...
- 线程函数对比 win/linux
原文
- [DeeplearningAI笔记]卷积神经网络4.6-4.10神经网络风格迁移
4.4特殊应用:人脸识别和神经网络风格转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 4.6什么是神经网络风格转换neural style transfer 将原图片作为内容图片Cont ...
- Tensorflow BatchNormalization详解:4_使用tf.nn.batch_normalization函数实现Batch Normalization操作
使用tf.nn.batch_normalization函数实现Batch Normalization操作 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴恩达deeplearnin ...