php代码审计参考

代码审计思路:

从个人角度出发,如果环境允许的话,可以先选择做一个”程序员“再来做代码审计。因为从开发者的位置去思考问题,可以快速定位问题。学习面向对象编程以及面向过程编程,编写一些 项目提升对代码的理解能力,再是对各种漏洞可以独立挖掘利用并能理解漏洞的危害,这里我们主要针 对PHP源码做审计。

接下来我们从三个层次开始我们的源码审计思路:

  • .确定要审计的源码是什么语言
  • 确定该源码是单入口还是多入口
  • 确定该语言的各种漏洞诞生的函数

PHP核心配置

一个漏洞在不同环境造成的结果也是不一样的。

由于关于php.ini配置的内容过于多,这里推荐浏览官方文档 https://www.php.net/manual/zh/ini.ph p,我们在这里主要列下php.ini 主要使用的安全配置。

代码审计环境

PHP源码部署环境:Phpstudy 2018等

集成开发环境:Zend Studio/Phpstorm

数据库管理工具:Navicat for MySQL 12

MySQL实时监控工具:MySQLMonitor

文本编辑工具:Sublime_Text3

代码审计辅助工具:Seay源代码审计系统、Search and Replace、Rips 0.55

代码审计辅助安全工具:渗透版火狐、BurpSuite、Sqlmap

手动调试代码

echo
exit();
print_r
var_dump();
debug_zval_dump();
debug_print_backtrace();
echo "<script>alert($estr);</script>"";
die("<script>alert($estr);</script>");

PHP的弱类型

1.比较符号 == 与 === == 在进行比较的时候,会先将字符串类型转化成相同,如果整型跟字符型比较字符或从左往右提取 整型直到遇到字符结束,再比较。 === 在进行比较的时候,会先判断两种字符串的类型是否相等,当等号两边类型不同时,会先转换 为相同的类型,再对转换后的值进行比较,如果比较一个数字和字符串或者涉及到数字内容的字符 串,则字符串会被转换成数值并且比较按照常数值进行比较.。

//字符串和数字比较
var_dump(0=="admin"); //true
echo '<br>';
var_dump(1=="1admin"); //true
echo '<br>';
var_dump(1=="admin1"); //false
echo '<br>';
var_dump(0=="admin1"); //true
echo '<br>';
//数字和数组
$arr = array();
var_dump(0==$arr); //false
echo '<br>';
//字符串和数组
$arr = array();
var_dump("0"==$arr); //false
echo '<br>';
//"合法数字+e+合法数字"类型的字符串
var_dump("0e123456"=="0e4456789"); //true
echo '<br>';
var_dump("1e1"=="10"); //true

2.array_search 与 is_array

is_array:判断传入的是不是一个数组。 array_search(x,$数组):在数组中寻找与指定值(x)相等的值,array_search函数 类似于"==", 会进行类型的转换。

if(!is_array($_GET['test'])){
exit();
}
$test = $_GET['test'];
for($i = 0;$i<count($test) ;$i++ ){
if($test[$i] === "admin"){
echo "error";
exit();
}
$test[$i] = intval($test[$i]);
}
if(array_search("admin",$test) === 0){
echo "flag";
}else{
echo "false";
}

我们可以传入test[]=0来进行绕过,首先test是一个数组,符合is_array的判断,然后test=0;在 array_search中0==admin为true,绕过了array_search。

3.in_array()函数

array_search()与in_array()也是一样的问题。

$array=[0,1,2,'3'];
var_dump(in_array('abc', $array)); //true
var_dump(in_array('1bc', $array)); //true

4.is_number()函数

检测变量是否为数字或数字字符串,如果var是数字和数字字符串则返回TRUE,否则返回FALSE

$temp = $_GET['password'];
is_numeric($temp) ? die("no numeric") : NULL;
if($temp>9999){
echo '我giao';
}

在这里我们的payload需要的是一个大于9999的数字后面加上字符就可以了 这里构造的是10000+ 。

5.strcmp()函数

比较函数如果两者相等返回0,string1>string2返回>0 反之小于0。在5.3及以后的php版本中,当 strcmp()括号内是一个数组与字符串比较时,也会返回0。

函数接受到了不符合的类型,发生了错误,但是还是判断其相等。

6.switch()语句

如果switch是数字类型的case的判断时,switch会将参数转换为int类型

$pwd = "1ad";
switch($pwd){
case 1:
echo "giao";
break;
case 2:
echo "?";
break;
}

7.md5()函数

0e开头的全部相等(绕过==判断),两个字符串转换成MD5值时都是0e开头,0e 纯数字这种格式 的字符串在判断相等的时候会被认为是科学计数法的数字,先做字符串到数字的转换。 md5()中的需要是一个string类型的参数。但是当你传递一个array时,md5()`不会报错,只是会无 法正确地求出array的md5值,返回false,这样就会导致任意2个array的md5值都会相等。

var_dump(md5('240610708') == md5('QNKCDZO'));//true
$array1=[1,2,3];
$array2=[4,5,6];
var_dump(md5($array1)===md5($array2)) //true

8.sha1()函数

sha1函数和md5函数一样不能判断数组的值。

$array1=[1,2,3];
$array2=[4,5,6];
var_dump(sha1($array1)===sha1($array2)); //true

9.empty与isset

变量为:0,"0",null,'',false,array()时,使用empty函数,返回的都是true

变量未定义或者为null时,isset函数返回的为false,其他都为true

$a = null;
$b = 0;
$c = "";
var_dump(empty($a));
var_dump(empty($b));
var_dump(empty($c));
var_dump(isset($a));
var_dump(isset($b));
var_dump(isset($c));

学习漏洞函数

1.全局变量/超全局变量

全局变量:

定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾。

函数内定义的变量就是局部变量,它的作用域为函数定义范围内。

函数之间存在作用域互不影响。

函数内访问全局变量需要 global关键字或者使用 $GLOBALS[index]数组。

超全局变量:

超全局变量 在 PHP 4.1.0 中引入,是在全部作用域中始终可用的内置变量。

PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函 数或方法中无需执行 global $variable; 就可以访问它们。

常用的超全局变量有9个:

$GLOBALS

$_SERVER

$_REQUEST

$_POST

$_GET

$_FILES

$_ENV

$_COOKIE

$_SESSION

2.SQL注入

select update insert into delete

注:此处非函数,主要找常用的SQL语句

3.代码执行

eval()
usort()
uasort()
assert()
array_map()
preg_replace()
array_filter()
call_user_func()
create_function()
call_user_func_array()
文件操作函数:
fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');
动态函数:$_GET['a']($_GET['b'])

4. 命令执行

system() exec() passthru() shell_exec()

5. XSS跨站脚本攻击

print print_r echo printf die var_dump var_export

6.文件上传漏洞

move_uploaded_file()

7.文件包含漏洞

include() include_once() require() require_once()

伪协议

file:// — 访问本地文件系统

http:// — 访问 HTTP(s) 网址

ftp:// — 访问 FTP(s) URLs

php:// — 访问各个输入/输出流(I/O streams)

zlib:// — 压缩流 data:// — 数据(RFC 2397)

glob:// — 查找匹配的文件路径模式

phar:// — PHP 归档 ssh2:// — Secure Shell 2

rar:// — RAR ogg:// — 音频流 expect:// — 处理交互式的流

8.任意文件下载

fopen() readfile() file_get_contents()

9.任意文件删除

unlink()

10.任意文件读取

file() fgets() fgetss() fopen() readfile() fpassthru() parse_ini_file() file_get_contents()

11.变量覆盖

$$ extract() parse_str() import_request_variables()//此函数只能用于PHP4.1 ~ PHP5.4

12.反序列化漏洞

unserialize()

魔术方法

  • __construct()//每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作
  • __destruct()//某个对象的所有引用都被删除或者当对象被显式销毁时执行
  • __call() //在对象上下文中调用不可访问的方法时触发
  • __callStatic() //在静态上下文中调用不可访问的方法时触发
  • __get() //用于从不可访问的属性读取数据
  • __set() //用于将数据写入不可访问的属性
  • __isset() //在不可访问的属性上调用isset()或empty()触发
  • __unset() //在不可访问的属性上使用unset()时触发
  • __sellp() //使用serialize时触发
  • __wakeup() //使用unserialize时触发
  • __toString() //把类当作字符串使用时触发
  • __invoke() //当脚本尝试将对象调用为函数时触发
  • __set_state()//当调用 var_export() 导出类时,此静态方法会被自动调用。
  • __clone()//当使用 clone 复制一个对象时自动调用
  • __debuginfo()//使用 var_dump() 打印对象信息时自动调用

审计入门总结

先从Web漏洞原理开始理解再到漏洞的挖掘以及利用,我们就来到了PHP代码审计这个方向进行进修。 这里我们开始学习PHP开发,以及熟悉下开发者的开发思想,站在开发者角度去思索代码。再是掌握漏 洞对应发生函数使用,再是学习正则表达式。 审计路线:Demo->综合漏洞靶场->网上审计过的CMS->多入口CMS->单入口CMS->框架->函数缺陷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Compose 六:常用组件 Button

Button 1 简单使用 Button(onClick { /*TODO*/ }) {Text(text "我是一只button里的text")}效果 颜色为什么是这个样子&#xff1f; 前面Text里我们讲过 主题色会影响组件的颜色 这里我使用的颜色如下 primary Color(0xFFFF0000),onPrimary Color(0xFF00FF00),p…

什么是合法IP地址?

IP地址&#xff0c;即互联网协议地址&#xff0c;是网络设备在互联网上进行通信的唯一标识符。IP地址有两种主要版本&#xff1a;IPv4和IPv6。为了保证网络通信的正常进行&#xff0c;IP地址需要是合法的。本文将详细阐述什么是合法IP地址&#xff0c;以及其重要性和验证方法。…

如何给实拍添加旋转模糊效果?视频模糊特效PR模板剪辑素材

PR特效模板&#xff0c;高级旋转模糊效果视频模板剪辑素材。 特征&#xff1a; After Effects 2019及以上兼容项目。 Premiere Pro 2021及以上兼容项目。 可用分辨率&#xff08;4K–HD–方形–移动&#xff09;。 不需要插件。 包括教程。 免费下载&#xff1a;https://prmu…

宝藏级丨图解项目管理全流程(上篇)

《项目管理知识体系指南》的定义&#xff1a;项目是为创造独特的产品、服务或成果而进行的临时性工作。项目管理就是将各种知识、技能、工具与技术应用于项目活动&#xff0c;以满足项目的要求。项目管理的全流程包括以下几个阶段&#xff1a; 项目启动阶段。这是开始一个新项…

GAN实例基于神经网络

目录 1.前言 2.实验 1.前言 需要了解GAN的原理查看对抗生成网络&#xff08;GAN&#xff09;&#xff0c;DCGAN原理。 采用手写数字识别数据集 2.实验 import argparse import os import numpy as np import mathimport torchvision.transforms as transforms from torchvi…

RedisTemplate使用最详解(三)--- opsForHash()

1、put(H var1, HK var2, HV var3) 新增hashMap值 var1 为Redis的keyvar2 为key对应的map值的keyvar3 为key对应的map值的值var2相同替换var3 redisTemplate.opsForHash().put("hashValue","map1","value1"); redisTemplate.opsForHash().put(&q…

Java官网下载JDK17版本详细教程(下载、安装、环境变量配置)

第一步&#xff0c;去百度搜索甲骨文官网 第二步 第三步 第四步 第五步 第六步 第七步 第八步 第九步 第十步 然后在系统变量里面找到path-编辑-新建添加这个,点击确定就好了 %JAVA_HOME%\bin 就完成了&#xff0c;接下来测试是否成功。 测试&#xff1a; 第一步&a…

VC++6.0 ListViewReport报表使用例子

操作步骤&#xff1a; 1&#xff0c;拖一个ListContorl控件 2&#xff0c;修改ID名称 3&#xff0c;设置Report样式 3&#xff0c;加入初始化代码 void CDuplicatefilesclearDlg::InitlizationListView() {CListCtrl *lstVew (CListCtrl*)GetDlgItem(IDC_LIST_Main);lstVew-&…

“联宝360“项目深度解析:创新模式与互助机制

大家好&#xff0c;我是吴军&#xff0c;来自一家知名的互联网科技公司&#xff0c;负责产品策略分析。 最近&#xff0c;我观察到社交网络上出现了一个名为“联宝360”的热门项目&#xff0c;它引发了众多团队长的热烈讨论和积极推广。这个项目虽然是在今年年初刚刚启动的&am…

羊大师分析,羊奶健康生活的营养源泉

羊大师分析&#xff0c;羊奶健康生活的营养源泉 羊奶&#xff0c;作为一种古老的饮品&#xff0c;近年来因其独特的营养价值和健康益处而备受关注。今天&#xff0c;羊大师就来探讨一下羊奶与健康之间的紧密联系。 羊奶富含蛋白质、脂肪、维生素和矿物质等多种营养成分。羊奶…

如何做一个厂区的导航地图?工厂导航定位怎么解决方案

厂区定位导航是一种基于位置服务&#xff08;LBS&#xff09;的导航系统&#xff0c;通过获取厂区内的位置信息&#xff0c;为用户提供准确的导航服务。该系统能够实时显示用户当前位置&#xff0c;提供目的地导航、路径规划、实时定位、语音提示等功能&#xff0c;帮助用户快速…

Process Monitor下载安装使用教程(图文教程)超详细

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

maven的安装与配置(超详细)

在Java开发中&#xff0c;配置Maven环境有几个重要的原因&#xff1a; 依赖管理&#xff1a;Maven 是一个强大的依赖管理工具&#xff0c;它能够帮助开发人员轻松地管理项目所需的各种第三方库和组件。通过在项目的 Maven 配置文件&#xff08;pom.xml&#xff09;中定义依赖&…

人工智能改善客户体验的10种方式

什么是人工智能客户体验&#xff1f; 人工智能客户体验是指使用人工智能技术&#xff08;如机器学习、聊天机器人和对话式用户体验&#xff09;使每个接触点尽可能高效且无障碍的实践。本质上&#xff0c;客服代表得到了一个虚拟助手帮助他们完成重复性任务。这意味着对于有简…

期权(1):基本概念,权利金,定金,买方,卖方,零和游戏,对赌协议

期权是合约&#xff0c;权利金就是定金&#xff01; 合约到期时 买方可以选择行权&#xff0c;也可以选择不行权。代价就是定金损失。因此亏损封顶&#xff0c;但盈利无限。卖方赚的就是买方的定金&#xff0c;盈利封顶&#xff0c;但亏损无限。 从这里&#xff0c;我们看出…

C语言例题42、打印金字塔

#include <stdio.h>void main() {int i, j;for (i 0; i < 5; i) {for (j 4; j > i; j--) {//输出空格printf(" ");}for (j 0; j < 2 * i 1; j) {//输出星号printf("* ");}printf("\n");} }运行结果&#xff1a; 本章C语言经…

HTML5实现简洁好看的个人主页,个人小站(多种风格附源码)

文章目录 1.烟灰主题个人主页1.1 个人主页界面1.2 个人信息界面1.3 兴趣爱好界面1.4 个人作品界面 2.紫霞主题个人主页2.1 个人主页界面2.2 个人信息界面2.3 兴趣爱好界面2.4 个人作品界面 3.墨夜主题个人主页3.1 个人主页界面3.2 个人信息界面3.3 兴趣爱好界面3.4 个人作品界面…

优雅谈论大模型5: RAG

RAG 众所周知&#xff0c;大模型以及一些预训练的模型在训练完毕之后会在其参数存储了大量的压缩资讯。但是这样的参数是通过固定的语料库训练而成&#xff0c;训练完毕之后这个模型已经固定了。然而外部资讯瞬息万变&#xff0c;加上大模型本质上为一种概率模型&#xff0c;所…

Nginx读书笔记

Nginx 是高性能的 HTTP 和反向代理的web服务器

ffmpeg使用xfade的转场特效

ffmpeg使用xfade的转场特效 1. 介绍2. ffmpeg里面的xfade3. 使用 1. 介绍 参考文档 ffmpeg是一个音视频编辑工具&#xff0c;具体的。。。。我才搞接触&#xff0c;所以不懂。 xfade是一种视频转场滤镜&#xff0c;用于在两个视频片段之间创建平滑的过渡效果。xfade的转场效果…