TP相关知识

news2024/11/17 10:56:19

说明

该文章来源于徒弟lu2ker转载至此处,更多文章可参考:https://github.com/lu2ker/

文章目录

  • 说明
    • PHP中有一些内置类
    • PHP反序列化问题
        • 绕过姿势:
        • 魔术方法(反序列化如何利用)
    • CMS可能存在的部分逻辑问题
    • $_REQUEST相关安全问题
    • $_SERVER['PHP_SELF']问题
    • array_merge 和 + 号 的区别
    • 关于PDO的一些事
    • 判断文件是否存在
    • 函数调用时的命令空间问题
    • 代码执行的一个小tip 用“.”拼接来return时执行
    • 关于PDO的一些事
      • 总结
    • 关于过滤__php标签这件事
      • 0x00 前言:
      • 0x01 问题
      • 0x02 思路一
      • 0x03 思路二
      • 0x04 思路三

PHP中有一些内置类

  1. SimpleXMLElement 其中当$data 为XML数据, $options=2时易造成XXE注入。这里
final public SimpleXMLElement::__construct ( string $data [, int $options = 0 [, bool $data_is_url = FALSE [, string $ns = "" [, bool $is_prefix = FALSE ]]]] )
  1. GlobIterator 其中$pattern为要搜索的文件名,$flagsmay be a bitmask of the FilesystemIterator constants。
public GlobIterator::__construct ( string $pattern [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO ] )

PHP反序列化问题

主要是总结传入序列化字符串如何绕过过滤 以及 反序列化为一个对象时魔术方法的调用

绕过姿势:

  • 序列化字符串中 代表这是一个对象的序列化字符串O:字符后面添加一个+可以绕过形如/O:\d:/这样的正则,因为源码var_unserializer.c中有代码能够解析O:+数字这样的对象序列化。

  • 对于protectedprivate类型的变量在序列化的时候有点复杂:

    对象的私有成员具有加入成员名称的类名称;

    受保护的成员在成员名前面加上**’*’**。

    这些前缀值在任一侧都有空字节

    这里有两种办法使字符串完整:①在空字节位置添加%00;②使用S:5:"\00*\00op",因为如果类型为S,PHP的源码会将\00按十六进制处理,也就是空字节。
    还有一种情况就是php7.1+版本对属性类型不敏感,使用public就可以正常反序列化。

  • 序列化字符串的逃逸。

魔术方法(反序列化如何利用)

  • 看这篇文章挺好的。

    __wakeup() //使用unserialize时触发

    __sleep() //使用serialize时触发

    __destruct() //对象被销毁时触发

    __call() //在对象上下文中调用不可访问的方法时触发

    __callStatic() //在静态上下文中调用不可访问的方法时触发

    __get() //用于从不可访问的属性读取数据

    __set() //用于将数据写入不可访问的属性

    __isset() //在不可访问的属性上调用isset()或empty()触发

    __unset() //在不可访问的属性上使用unset()时触发

    __toString() //把类当作字符串使用时触发

    __invoke() //当脚本尝试将对象调用为函数时触发

    一道质量很高的PHP反序列化CTF题------提取码:54dt

CMS可能存在的部分逻辑问题

  1. install.php在安装完成后应该删除或者做访问控制,当已安装时再访问,应当在输出警告信息后退出程序,否则程序继续执行的话,就会导致重装漏洞。审计的时候注意die()exit()

$_REQUEST相关安全问题

  • $_REQUEST获取参数的顺序:这个主要看php.ini是如何配置的,一般情况都是GPCS的顺序,即GET、POST、COOKIE、SERVER,且从左往右优先级增大

在这里插入图片描述

在这里插入图片描述

  • $_REQUEST是直接从GET,POST 和 COOKIE中取值,不是他们的引用。即使后续GET,POST 和 COOKIE发生了变化,也不会影响$_REQUEST的结果。

在这里插入图片描述

  • **PHP特性:**①php自身在解析请求的时候,如果参数名字中包含空格、.[这几个字符,会将他们转换成_。②通过$_SERVER['REQUEST_URI']方式获得的参数并不会进行转换。

在这里插入图片描述

另外一个特性是:当我们使用HPP(HTTP参数污染)传入多个相同参数给服务器时,PHP只会接收到后者的值。(这一特性和中间件有关系)

在这里插入图片描述

可以利用这些特点绕过某些过滤WAF。审计的时候要注意WAF处理的参数是怎么获取的,业务处理的参数是怎么获取的。

$_SERVER[‘PHP_SELF’]问题

  • ‘PHP_SELF’

    当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/foo/bar.php 的脚本中使用 $_SERVER[‘PHP_SELF’] 将得到 /foo/bar.php。__FILE__常量包含当前(例如包含)文件的完整路径和文件名。如果 PHP 以命令行模式运行,这个变量将包含脚本名。

  • ‘PATH_INFO’

    包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息,如果存在的话。例如,如果当前脚本是通过 URL http://www.example.com/php/path_info.php/some/stuff?foo=bar 被访问,那么 $_SERVER[‘PATH_INFO’] 将包含 /some/stuff

所以,当URL是PATH_INFO这种形式时,$_SERVER[‘PHP_SELF’]的内容对于攻击者来讲是可控的,

在这里插入图片描述

P神绕360webscan的分析

array_merge 和 + 号 的区别

搬自https://www.cnblogs.com/corvus/p/14383327.html

array_merge()
array_merge() 将一个或多个数组合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果数组
1.字符串键 后面的值会覆盖前面的一个值。
2.数字键,后面的值将不会覆盖原来的值而是附加到后面(数字键会重新分配,总是变成重零开始)
3.如果只给了一个数组并该数组是数字索引,则键名会以连续重新索引

+号合并数组
数组中有相同的键名(不管是不是数字),则会把最先出现的值作为最终的返回,而把后面的数组拥有相同键名的那些值 抛弃掉,数字索引不会重新排序

关于PDO的一些事

我这里参考师傅们的文章只整理了一份小总结,没有案例:关于PDO的一些事
具体的去看phith0n和haby0两位师傅的文章吧。

判断文件是否存在

测试发现Win下用../进行跨盘符访问时,is_file()和file_exists()都返回了false,貌似是不支持win下形如D:/a/b/c/../../../../C:/Windows/win.ini的路径,应该是无法访问到盘符的上级(盘符的上级是啥还真没想过),而linux下通过多个../最终也就是限制在根目录(这么说应该也叫盘符的根目录),而没有跨到盘符的上级,然并卵,但记。

函数调用时的命令空间问题

PHP默认的命名空间为\,直接用函数名调用函数相当于用命名空间的相对路径来调用,而使用如:\user()就相当于是在用绝对路径来调用user函数了。
如果在当前命名空间调用系统类,就必须用绝对路径的写法。
by https://www.t00ls.com/viewthread.php?tid=67133&extra=page%3D2%26amp%3Borderby%3Dlastpost%26amp%3Bfilter%3D86400

代码执行的一个小tip 用“.”拼接来return时执行

return xxxxx.phpinfo()//

关于PDO的一些事

PDO主要是这个选项

PDO::ATTR_EMULATE_PREPARES  => false

在这里插入图片描述

这个选项涉及到PDO的“预处理”机制:因为不是所有数据库驱动都支持SQL预编译,所以PDO存在“模拟预处理机制”。如果说开启了模拟预处理,那么PDO内部会模拟参数绑定的过程,SQL语句是在最后execute()的时候才发送给数据库执行;如果我这里设置了PDO::ATTR_EMULATE_PREPARES => false,那么PDO不会模拟预处理,参数化绑定的整个过程都是和Mysql交互进行的。

非模拟预处理的情况下,参数化绑定过程分两步:第一步是prepare阶段,发送带有占位符的sql语句到mysql服务器(parsing->resolution),第二步是通过execute()函数多次发送占位符参数给mysql服务器进行执行(多次执行optimization->execution)。

这时,假设在第一步执行prepare($SQL)的时候我的SQL语句就出现错误了,那么就会直接由mysql那边抛出异常,不会再执行第二步。(From phith0n)

PDO默认支持多语句查询,如果php版本小于5.5.21或者创建PDO实例时未设置PDO::MYSQL_ATTR_MULTI_STATEMENTS为false时可能会造成堆叠注入(From haby0)

在这里插入图片描述

翻译过来就是当它设置为False时PDO::prepare() 和 PDO::query() 就会禁用多查询,

PDO的配置放在实例化时的第四个参数位置,类型为数组。

new PDO($dsn, $user, $pass, array( PDO::MYSQL_ATTR_MULTI_STATEMENTS => false))

PS:有个小问题,非模拟预处理下PDO::prepare()才会和数据库交互,而非模拟预处理是不存在堆叠注入可能性的,官方手册里却还写上了这是为啥?感觉这里应该写成PDO::execute()才对。

总结

  • 并不是说使用了PDO就是安全的
  • pdo的模拟预处理和非模拟预处理
    • 模拟预处理:在PDO内部模拟参数绑定的过程。PDO::ATTR_EMULATE_PREPARES => true
    • 非模拟预处理:参数化绑定的整个过程都与数据库交互,就是交给数据库去预编译,PDO::ATTR_EMULATE_PREPARES => false
    • 认为可以理解为模拟预处理和预处理…
  • 可控变量直接拼接的前提下:
    • 模拟预处理下,execute阶段会造成注入,可以使用堆叠注入
    • 非模拟预处理下,不存在堆叠注入,会在prepare阶段报错,但还可以用其他注入类型(毕竟是直接拼接了)。
    • 比如既然会在prepare阶段报错,那么理所应当可以使用报错注入,但是要回显错误信息的话还需要设置PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  • 综上再copy一下haby0给的安全建议:
    • 使用PDO时尽量使用非模拟预处理
    • PDO最好配置PDO::MYSQL_ATTR_MULTI_STATEMENTS => false,禁止多语句查询(默认是true)
    • 不要直接拼接可控变量,占位符多好啊

案例的话,去看提到的两位师傅的文章吧。

关于过滤__php标签这件事

涉及到0day,暂不说明细节,只记录思路。

0x00 前言:

  • 最近在审一套系统的时候,找到个sqli点
  • 该系统搭建安装的时候默认mysql账号为root
  • 对于into outfile写文件的条件也全部满足,遂想到用SQL注入写文件的方式来GetShell

0x01 问题

因为是用sqli写webshell,payload难免会需要绕过一些针对请求参数的过滤,这里就过滤了<、>、"等特殊字符,导致没有办法用类似
select '<?php phpinfo()?>' into outfile '[webpath]'的方式写入webshell,其中的尖括号会被html实体化编码,但是怎么能轻言放弃呢?

0x02 思路一

在该系统的web目录下有很多php空文件,但是留下了<?php,比如根目录下的phpinfo.php内容如下:

<?php 

这也是我当时立马相到的思路:通过读取phpinfo.php的内容,得到<?php,使用select load_file(),这个方法需要如下条件:

  • SQL注入点需要查询结果是两列的,因为xxx union select load_file('phpinfo.php'),'phpinfo();' into outfile '[webpath]'
  • 需要支持联合查询
  • 如果删除了这些毫无意义的空文件就立马shell不了了
    随之分享给师傅们,集思广益

0x03 思路二

hex编码进行绕过
关于SQL注入中使用hex编码来绕过一些过滤的操作应该ctf会比较常见,当时也是没想起来,姿势用时方恨忘啊,遂决定写下此文。
使用方法如下:select 0x3c3f70687020706870696e666f28293b3f3e into outfile '[webpath]',这样就不存在什么限制了。

0x04 思路三

师傅发来先知一篇文章,其中John 师傅在评论区详细阐述了一种也很棒的方法:UTF-7编码绕过。
总结就是一句话:php的多字节编码并启用UTF-7。例如将<?php phpinfo();?>编码为utf-7,+ADw?php phpinfo()+ADs?+AD4-就能绕过<?检测。
可以通过上传

.htaccess

php_flag zend.multibyte 1
php_value zend.script_encoding UTF-7

或者

.user.ini

zend.multibyte=1
zend.script_encoding=utf-7

来开启这个配置。另外该师傅人真好,还讲了一个小tips,原文如下:

如果遇到图片文件头检测,`.user.ini`可以不加注释直接打上`GIF89a`然后换行,不会报错。`.htaccess`会报500错误,用#注释掉又无法绕过,
不过`0x00`也是`.htaccess`的注释符,所以可以用`0x00`开头的图片文件头,例如ico `00 00 01 00 01 00 20 20`,这样既能绕过文件头检测,也不会报错。

师傅好强,学习。

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

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

相关文章

小游戏引擎选型参考指南

写在前面 前面写了几期有关于小游戏的文章&#xff0c;主要从小游戏开发、小游戏运营、小游戏变现等多个角度进行了较为粗略的介绍&#xff0c;很多同学表示对小游戏引擎部分很感兴趣&#xff0c;希望能够有一些更为深入的分析介绍。今天就对目前主流的小游戏引擎进行探讨。 …

Java 并发编程 (二)CountDownLatch和CyclicBarrier的使用

CountDownLatch和CyclicBarrier CountDownLatch 功能介绍 CountDownLatch 是一个同步功能的辅助类 线程计数不为0时呈wait状态如果为0则继续执行。通过await 和 countDown 两个方法来实现等待和继续运行。 作用&#xff1a;一个线程或多个线程等待另一个线程或多个线程完成后…

2003-2021年高铁列车信息

2003-2021年高铁列车信息 1、时间&#xff1a;2003-2021年 2、指标&#xff1a; 列车车次、出发站、出发站所属地级市、出发站所属省份、出发站类型、到达站、到达站所属地级市、到达站所属省份、到达站类型、车型、开车时间、到站时间、运行时间、里程 3、指标说明&#x…

58. 微调(fine-tuning)

前面的一些章节介绍了如何在只有6万张图像的Fashion-MNIST训练数据集上训练模型。 我们还描述了学术界当下使用最广泛的大规模图像数据集ImageNet&#xff0c;它有超过1000万的图像和1000类的物体。 然而&#xff0c;我们平常接触到的数据集的规模通常在这两者之间。 假如我们…

3、基于注解的IoC装配与依赖注入

一、XML开启注解支持 1、添加context名称空间 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context&…

03SpringCloudAlibaba服务注册中心—Zookeeper

目录 注册中心Zookeeper 五步曲&#xff1a; zookeeper服务提供者 1、03-cloud-provider-payment-zookeeper-8004 2、pom.xml 3、改yum 4、主启动 5、业务类 测试1&#xff1a; 测试2&#xff1a; ​ 服务节点是临时节点还是持久节点 粗划分&#xff1a; 细划分&am…

南京晓庄Java期末知识点复习

南京晓庄Java期末知识点复习第一章 Java 语言概述第二章 Java 语法基础标识符基本数据类型**运算符****语句**数组和字符串命令行参数输入输出第三章 类五个基本概念类类的封装类的继承**抽象类**接口关键字常用的工具类第四章 Applet及其应用**Java程序的两种基本形式****Appl…

红队渗透靶场之prime1.0(超详细!)

靶场考察知识 Wordpress WordPress是一个免费的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;可以用来创建和管理网站或博客。它是由PHP语言和MySQL数据库构建的&#xff0c;并且拥有大量的插件和主题&#xff0c;可以让您轻松地自定义网站的外观和功能 Wpscan扫…

引用量超6000的语义分割经典论文DeepLabv3解读

分享语义分割领域的一篇经典论文DeepLabv3&#xff0c;由谷歌发表于CVPR2017。开源代码地址&#xff1a; Tensorflow版本&#xff1a;https://github.com/tensorflow/models/tree/master/research/deeplabPytorch版本&#xff1a;https://github.com/open-mmlab/mmsegmentatio…

【Spring 入门教程3】

Spring_day03 &#x1f308;博客主页&#xff1a;屠一乐的博客 &#x1f4c5; 发文时间&#xff1a;2023.1.3 &#x1f388; 一定存在只有你才能做成的事 &#x1f339; 博主水平有限&#xff0c;如有错误&#xff0c;欢迎指正 欢迎各位&#x1f44d;收藏&#x1f48e;评论✉ …

mysql简介

一.mysql简介 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&a…

TensorFlow之过拟合与欠拟合-3

1 基本概念 过度拟合&#xff08;overfit&#xff09; 正则化&#xff08;regularization&#xff09; L1正则化&#xff08;L1 regularization&#xff09; L2正则化&#xff08;L2 regularization&#xff09; 删除正则化&#xff08;dropout regularization&#xff09…

【计组】异常、CPU指令集--《深入浅出计算机组成原理》(五)

课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 一、异常 &#xff08;一&#xff09;异常 异常其实是一个硬件和软件组合到一起的处理过程。异常的发生和捕捉&#xff0c;是在硬件层面完成的。但是异常的处理&#xff0c;是由软件来完成的。 …

【并发编程十】c++线程同步——条件变量(condition_variable)

【并发编程十】c线程同步——条件变量&#xff08;condition_variable&#xff09;一、互斥二、条件变量1、为何要引入条件变量?2、不使用条件变量3、使用条件变量3.1、互斥锁有什么问题&#xff1f;3.2、条件变量3.3、条件变量成员函数3.4、demo三、future四、信号量简介&…

【并发编程九】c++线程同步——互斥(mutex)

【并发编程九】c线程同步——互斥&#xff08;mutex&#xff09;一、互斥1、mutex1.1、mutex1.2、 lock_guard1.3、 RAII2、std::recursive_mutex3、std::shared_mutex、std::shared_lock、std::unique_lock4、std::scoped_lock二、条件变量三、future四、信号量简介&#xff1…

chrony服务器

Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器&#xff08;NTP&#xff09;同步&#xff0c;因此让你的计算机保持精确的时间&#xff0c;Chrony也可以作为服务端软件为其他计算机提供时间同步服务。 Chrony由两个程序…

【嵌入式Linux环境搭建-10】tftp服务安装、双网卡并行

10.tftp服务安装 板子有有线网卡&#xff0c;需有线连接到电脑 主机安装TFTP服务 $ sudo apt-get install xinetd tftpd tftp $ sudo vim /etc/xinetd.d/tftp /*添加下面内容, service tftp { protocol udp port 69 socket_type dgram wait …

aws lambda 理解RIC和RIE构建和测试容器镜像并通过cdk部署lambda函数

参考资料 AWS Lambda 的新功能 — 容器映像支持 快速构建基于 Lambda 容器镜像的 OCR 应用 利用 Lambda 容器镜像搭建分布式压测引擎 lambda容器镜像构建 可以将 Lambda 函数打包和部署最大 10 GB 的容器映像&#xff0c;轻松构建和部署依赖于大量依赖项的更大型工作负载 …

【Java核心技术】创建多线程

1、多线程的概述 什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。 我们之前启动程序执行后&#xff0c;main方法的执行其实就是一条单独的执行路径。 public static void main(String[] args) {// 代码...for (int i 0; i < 10; i) {System.out.prin…

《柳叶刀》:约20%中国男性死亡可归因于吸烟

*仅供医学专业人士阅读参考 吸烟喝酒可谓众所周知的两大“健康刺客”。一首歌名为《给我一杯酒》中的歌词唱到“给我一杯酒&#xff0c;再给我一只烟&#xff0c;说走就走&#xff0c;我有的是时间”&#xff0c;传唱度极高&#xff0c;甚至还一度成为短视频平台的最热门的BGM之…