PHP代码审计之函数漏洞(下)

php代码审计常见漏洞函数介绍 php代码审计常见漏洞函数介绍 一:常见的容易出现漏洞的函数介绍 1:intval()使用不当导致安全漏洞的分析 1.1:函数介绍 intval() 函数用于获取变量的整数值。intval函数有个特性:“直到遇上数字或正负符号才开始做转换,在遇到非数字或字符串结束时(\0)结束转换”,在某些应用程序里由于对intval函数这个特性认识不够,错误的使用导致绕过一些安全判断导致安全漏洞.此外有些题目还... 阅读详情

前言

此篇文件属于代码审计篇的一个环节,其意图是为总结php常见函数漏洞,分为上下两节,此为下节!此篇与命令注入绕过篇和sql注入回顾篇同属一个系列!欢迎各位斧正!

目录

前言

正文

md5()引发的注入

md5加密相等绕过

数字验证正则绕过

md5函数验证绕过

十六进制与数字比较绕过

后记


正文

md5()引发的注入

<?php
$password=$_POST['password'];
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0){
echo 'flag is :'.$flag;
}
else{
echo '密码错误!';
} 
?>

MD5之后是hex格式,转化到字符串时如果出现'or'xxxx的形式,就会导致注入。 payload:ffifdyop

md5(ffifdyop,32) = 276f722736c95d99e921722cf9ed621c
转换成字符串后为
'or'6�]��!r,��b�

md5加密相等绕过

代码

<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
    echo "nctf{*****************}";
} else {
    echo "false!!!";
}}
else{echo "please input a";}
​
?>

题解:

http://127.0.0.1/Php_Bug/13.php?a=240610708

==对比的时候会进行数据转换,0eXXXXXXXXXX 转成0了,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行

var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));
var_dump('0010e2' == '1e3');
var_dump('0x1234Ab' == '1193131');
var_dump('0xABCdef' == ' 0xABCdef');
​
md5('240610708'); // 0e462097431906509019562988736854 
md5('QNKCDZO'); // 0e830400451993494058024219903391 

把你的密码设成 0x1234Ab,然后退出登录再登录,换密码 1193131登录,如果登录成功,那么密码绝对是明文保存的没跑。

同理,密码设置为 240610708,换密码 QNKCDZO登录能成功,那么密码没加盐直接md5保存的。

资料:

数字验证正则绕过

<?php
​
error_reporting(0);
function noother_says_correct($temp)
{
    $flag = 'flag{test}';
    $one = ord('1');  //ord — 返回字符的 ASCII 码值
    $nine = ord('9'); //ord — 返回字符的 ASCII 码值
    $number = '3735929054';
    // Check all the input characters!
    for ($i = 0; $i < strlen($number); $i++)
    { 
        // Disallow all the digits!
        $digit = ord($temp{$i});
        if ( ($digit >= $one) && ($digit <= $nine) )
        {
            // Aha, digit not allowed!
            return "flase";
        }
    }
    if($number == $temp)
        return $flag;
}
$temp = $_GET['password'];
echo noother_says_correct($temp);
​
?>

题解:

0 >= preg_match('/^[[:graph:]]{12,}$/', $password) 意为必须是12个字符以上(非空格非TAB之外的内容)

$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/'; 
if (6 > preg_match_all($reg, $password, $arr)) 

意为匹配到的次数要大于6次

$ps = array('punct', 'digit', 'upper', 'lower'); //[[:punct:]] 任何标点符号 [[:digit:]] 任何数字  [[:upper:]] 任何大写字母  [[:lower:]] 任何小写字母 
foreach ($ps as $pt) 
{ 
    if (preg_match("/[[:$pt:]]+/", $password)) 
        $c += 1; 
} 
if ($c < 3) break; 

意为必须要有大小写字母,数字,字符内容三种与三种以上

if ("42" == $password) echo $flag; 

意为必须等于42

答案:

42.00e+00000000000 
或
420.000000000e-1

资料:

md5函数验证绕过

<?php
error_reporting(0);
$flag = 'flag{test}';
$temp = $_GET['password'];
if(md5($temp)==0){
    echo $flag;
}
?>

题解:

if(md5($temp)==0)要使md5函数加密值为0

  • 方法一: 使password不赋值,为NULL,NULL == 0为true http://127.0.0.1/php_bug/23.php?password= http://127.0.0.1/php_bug/23.php
  • 方法二: 经过MD5运算后,为0e******的形式,其结果为0*10的n次方,结果还是零 http://127.0.0.1/php_bug/23.php?password=240610708 或http://127.0.0.1/php_bug/23.php?password=QNKCDZO

十六进制与数字比较绕过

栗子:

<?php
​
error_reporting(0);
function noother_says_correct($temp)
{
    $flag = 'flag{test}';
    $one = ord('1');  //ord — 返回字符的 ASCII 码值
    $nine = ord('9'); //ord — 返回字符的 ASCII 码值
    $number = '3735929054';
    // Check all the input characters!
    for ($i = 0; $i < strlen($number); $i++)
    { 
        // Disallow all the digits!
        $digit = ord($temp{$i});
        if ( ($digit >= $one) && ($digit <= $nine) )
        {
            // Aha, digit not allowed!
            return "flase";
        }
    }
    if($number == $temp)
        return $flag;
}
$temp = $_GET['password'];
echo noother_says_correct($temp);
​
?>

题解:

这里,它不让输入1到9的数字,但是后面却让比较一串数字,平常的方法肯定就不能行了,大家都知道计算机中的进制转换,当然也是可以拿来比较的,0x开头则表示16进制,将这串数字转换成16进制之后发现,是deadc0de,在开头加上0x,代表这个是16进制的数字,然后再和十进制的 3735929054比较,答案当然是相同的,返回true拿到flag

echo  dechex ( 3735929054 ); // 将3735929054转为16进制
结果为:deadc0de

构造:

http://127.0.0.1/Php_Bug/20.php?password=0xdeadc0de

 

后记

此篇为PHP函数漏洞审计下篇,总结了一些常见函数漏洞,并结合了CTF题目进行分析!PHP代码审计系列还会继续,希望大家能有所收获!不积硅步,无以至千里!

PHP代码审计之函数漏洞(上)

PHP代码审计实战:从敏感函数追踪到RCE漏洞深度挖掘 代码审计是软件安全领域的核心技术之一,它通过深入分析源代码来发现潜在的安全漏洞。其原理是从数据流和控制流的角度,追踪用户输入在程序中的传播路径,识别可能被恶意利用的薄弱环节。这项技术的核心价值在于能够主动发现并修复安全缺陷,提升软件的内在安全性,广泛应用于Web应用、企业系统和开源组件的安全评估。在PHP生态中,由于历史遗留代码众多且开发模式灵活,代码审计尤为重要。通过定位eval、system等敏感函数,结合数据流追踪和动态调试,可以高效发现远程代码执行(RCE)和命令注入等高危漏洞。本文聚焦PHP项目的 阅读详情

相关推荐

PHP代码审计之基础篇

最近在学PHP代码审计,那就将学习的笔记都整理一遍吧~ 前期准备: 1、安装相关软件,如Sublime text、 Notepad++、editplus、 Seay源代码审计系统等 2、获得源码,可以到网上下载各种网站源码 3、安装网站 审计方法: 通读全文法:麻烦但全面 敏感函数参数回溯法:高效常用,Seay源代码审计系统 定向功能分析法:主要根据程序的业

Mi1k7ea 1万+

CG CTF 起名字真难

题目链接 <?php function noother_says_correct($number) { $one = ord('1'); $nine = ord('9'); for ($i = 0; $i < strlen($number); $i++) { $digit = ord($numb...

qq_46389295的博客 835

PHP代码审计

目的:对源代码进行审计,寻找代码中的BUG和安全漏洞。

qq_73792226的博客 1777

php分段考试,PHP代码审计分段讲解(8)

20 十六进制与数字比较源代码为:error_reporting(0);function noother_says_correct($temp){$flag = 'flag{test}';$one = ord('1'); //ord — 返回字符的 ASCII 码值$nine = ord('9'); //ord — 返回字符的 ASCII 码值$number = '3735929054';// ...

weixin_33925126的博客 323

php代码审计之函数漏洞审计 (1)

前言 此篇文件属于代码审计篇的一个环节,其意图是为总结php常见函数漏洞,此篇与命令注入绕过篇和sql注入回顾篇同属一个系列!欢迎各位斧正! 文章目录前言正文intval()使用不当导致安全漏洞的分析switch()in_array()PHP弱类型的特性"."被替换成"_"unsetserialize 和 unserialize漏洞session 反序列化漏洞MD5 compare漏洞ereg函数漏洞:00截断Strcmp()漏洞is_numeric函数sha1 和 md5 函数preg_matchpars

cpongo5 598

Java敏捷开发(王伟杰译)

用于Java的开发,很实用的,希望可以帮助你们,给好评

南邮CTF:WEB 起名字真难

条件: &lt;?php function noother_says_correct($number) { $one = ord('1'); $nine = ord('9'); for ($i = 0; $i &lt; strlen($number); $i++) { $digit = ord(...

笔记 2376

大样本EEG公共数据集汇总

描述: OpenNeuro平台包含多个认知障碍相关的EEG数据集,例如针对轻度认知障碍(MCI)或阿尔茨海默病(AD)的研究。描述: 天普大学医院EEG语料库包含大量临床EEG记录,可通过元数据筛选出与认知障碍相关的片段(如诊断标签包含dementia或MCI)。描述: ADNI主要提供多模态神经影像数据(MRI/PET),但部分合作研究整合了EEG数据。样本量: 部分数据集包含100+被试(例如结合MRI与EEG的多模态数据)。样本量:30,000+ EEG记录(持续更新,全球最大临床EEG数据库)。

谁人打的太极拳的博客 1759

php md5 mysql md5_php中的md5()的安全问题

汇总下php中md5()的安全问题安全问题1:1.x=任意字符串 md5('x')=0e***2.y=任意字符串 md5('y')=0e***如果x==y,php会返回true,在有些时候可以绕过逻辑判断x==0 /y==0都为true,有些时候可以用来绕过逻辑判断原理:php使用==会把两边的数值进行类型转换,0e***都转换成了0例子var_dump(md5('240610708') ==...

weixin_35408656的博客 348

手把手教你用Isograph Reliability Workbench 14.0绘制可靠性方框图(RBD)

本文详细介绍了如何使用Isograph Reliability Workbench 14.0绘制可靠性方框图(RBD),从软件安装、界面设置到基础项目创建和高级功能应用,手把手指导工程师完成系统可靠性分析。通过实际案例演示,帮助用户掌握RBD建模技巧,提升系统可靠性评估效率。

weixin_26765287的博客 623

微处理器实验报告-实验四

实验四 可编程定时/计数器8253实验 一、实验要求 利用8086外接8253可编程定时/计数器,可以实现方波的产生。 二、实验目的 1、学习8086与8253的连接方法。 2、学习8253的控制方法。 3、掌握8253定时器/计数器的工作方式和编程原理

青竹小轩的博客 5111

SQL注入

常见SQL注入漏洞及其防御绕过方法

今天的风儿甚是喧嚣 485

Moveit +Gazebo:搭建单臂机械臂仿真平台

Moveit +Gazebo:搭建单臂机械臂仿真平台

magic_invaid的博客 5290

PHP代码审计之函数漏洞(上)

此篇文件属于代码审计篇的一个环节,其意图是为总结php常见函数漏洞分为上下两节,此为上节!此篇与命令注入绕过篇和sql注入回顾篇同属一个系列!欢迎各位斧正! 文章目录前言正文intval()使用不当导致安全漏洞的分析switch()in_array()PHP弱类型的特性"."被替换成"_"unsetserialize 和 unserialize漏洞session 反序列化漏洞MD5 compare...

小白渣的博客 705

SAP UI5 控件剖析系列之 sap.m.DatePicker:单日选择的工程化用法、最佳实践与常见坑

在 SAP UI5 的输入控件族里,是最常被使用的日期选择控件。它把一个可编辑的输入框与一个弹出的日历整合在一起,允许用户用触摸、鼠标或键盘在本地化格式下选择某一天;控件既可以从弹出的日历里点选,也可以直接在输入框里键入日期。官方 Fiori 设计规范对它的定位就是:完成单个日期的选择,不牵涉时间,也不负责跨天的范围选择。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 343

HFSS实战项目——Ku波段微带发夹线滤波器

保姆级教程!!!看完必会,非常详细!!!Ku频段5阶切比雪夫微带线带通滤波器的仿真实例。首先介绍了滤波器的技术指标和基本理论知识,重点介绍了滤波器的耦合系数和外部品质因数。建立了谐振器的设计模型、耦合系数与谐振器间距的设计模型、外部品质因数与抽头位置的设计模型和滤波器整体电路的模型。详细介绍了谐振器设计模型的建立步骤。

2401_87464239的博客 3041

代码审计——常见漏洞审计之php危险函数总结

代码执行 执行代码函数: eval() assert() preg_replace() create_function() array_map() call_user_func() call_user_func_array() array_filter usort uasort() 命令执行 命令执行函数: system() exec() shell_exec() passthru() ...

爱国小白帽 2012

【超详细】计算机组成原理总结及思维导图

计算机组成 第一章 计算机系统概论 冯诺依曼型计算机特点 1.计算机由运算器,控制器,存储器,输入和输出设备5部分组成 2.采用存储程序的方式,程序和数据放在同一个存储器中,并以二进制表示。 3.指令由操作码和地址码组成 4.指令在存储器中按执行顺序存放,由指令计数器(即程序计数器PC)指明要执行的指令所在的储存单元地址,一般按顺序递增,但可按运算结果或外界条件而改变 5.机器以运...

圣三一 10万+

PHP代码审计实战:从XSS漏洞剖析安全过滤函数原理与应用

在Web应用开发中,安全过滤是防御常见攻击的核心技术。其基本原理是对用户输入和输出数据进行处理,防止恶意代码被解释执行。从技术价值看,正确的过滤能有效抵御SQL注入与跨站脚本(XSS)攻击,保障数据与用户安全。实际应用时,需根据数据流向选择不同函数:防SQL注入应在数据入库前使用预处理语句,而防XSS则需在数据输出到HTML时进行转义。以存储型XSS漏洞为例,常见误区是混淆addslashes()与htmlspecialchars()的作用——前者仅转义SQL特殊字符,对HTML标签无效;后者则将字符转为H

weixin_29315569的博客 346

微信小程序 - 最新详细实现 “餐厅食堂外卖点餐“ 全屏左右联动菜单列表功能界面,附带搜索框、购物车功能、商品加减计算金额、折扣等,左侧商品分类,右侧列表数据,仿美团饿了么外卖点餐页面,饭店扫码点餐!

微信小程序,vue2,vue3,左右联动菜单,商品分类页面,点餐界面,美团外卖点餐,左右布局界面,饿了么点餐页面,左分类右列表,小程序实现左侧菜单,外卖点餐联动,锚点,点击左侧大类后侧列表跟着变跟着刷新,菜单左右联动效果,左菜单右边列表数据,uniapp,左侧菜单,右侧列表双向联动效果,右侧商品滑动时,右侧列表双向联动效果,侧边菜单和右边滚动条,电商项目,购物车,商品加减计算,外卖选餐页面带购物车计算,自动计算金额,微信小程序外卖点餐界面源码,店铺页面滑动左右联动,点餐类小程序界面,堂食,扫码点餐,餐饮行业

🏆 前端领域优质创作者 5160

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

php代码审计2 piwigo CMS in_array()函数漏洞

php代码审计2 piwigo CMS in_array()函数漏洞

prcool的博客 1102

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Burst Lab | PHP 代码审计 02|preg 正则函数校验漏洞分析

本文系统分析了PHP中preg系列正则函数的常见漏洞与绕过方法,主要包括: 正则表达式基础:介绍了preg_match()、preg_replace()等函数的工作原理及正则语法要点,强调^和$锚定符对严格校验的重要性。 常见绕过技巧: 首尾锚定缺失:未使用^和$时,攻击者可通过在Payload中夹带恶意内容绕过校验。 换行符绕过:$默认匹配换行符前的位置,导致结尾添加\n可能绕过校验。 其他缺陷:如未限制多行模式(m修饰符)、未处理PCRE回溯限制等。

Sagittarius_A*的博客 497

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

PHP代码审计:eval函数引发的敏感信息泄露漏洞

eval() 会将传入的字符串当作 PHP 代码执行。如果恶意攻击者向eval()里输入恶意的语句,则会造成敏感信息泄露。system()命令执行函数。//将用户通过hello参数输入的值赋值给变量a。//把字符串按照 PHP 代码来计算。var_dump():输出数据类型和值。当输入正常的参数4s,则打印string(2) "4s"include "flag.php";//包含 flag.php 文件。

qq_65943915的博客 31

代码审计之危险函数

0x01 总结一下php代码审计中的危险函数及一般方法。 0x02 审计 一般拿到一套CMS源码,有不同的审计思路,大概分为这几种,追踪危险函数,然后回溯。按功能点来进行审计。直接通读全文代码。或者跟踪数据流进行审计。但不管那种,我觉得因该先看入口文件,了解整体框架结构,网站配置。 0x03 漏洞 文件包含漏洞 本地文件包含 函数有: include(),include_onc...

weixin_33734785的博客 503
上一篇: PHP代码审计之函数漏洞(上)
下一篇: FUZZ测试某狗WAF绕过
JBlock
博客等级 码龄9年 189粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值