XYCTF 部分wp及学习记录

1.ezmd5

根据题目提示

我们知道应该是要上传两张md5值相同的图片

根据原文链接:cryptanalysis - Are there two known strings which have the same MD5 hash value? - Cryptography Stack Exchange

把保存下来的图片上传一下

得到flag

2.ezhttp

根据原文链接:如何伪造http头,让后端认为是本地访问 - 技术栈

看页面源代码提示应该是要扫描后台

访问robots.txt

再访问

得到账号和密码

登录后

提示要伪造refer

bp抓包

发包过去又说要伪造XYCTF的浏览器

发包又提示要伪造本地用户

伪造X-Forwarded-For:127.0.01

那就只能换一个伪造

发包过去又说要伪造

伪造via

又说要伪造。。(崩溃了)

 那就是伪造cookie,把cookie的值改为XYCTF得到flag


XYCTF{83214032-3ef6-48ca-9a27-5ef6dd58ef8c}

知识点:

1.via伪造代理

2.client-ip和X-Forwarded-For的用处差不多

参考文章:鲜为人知的HTTP协议头字段详解大全 - 知乎

3.牢牢记住,逝者为大

第一层绕过,cmd的长度不能大于13

第二层绕过,cmd中不能有echo  exec  eval  system  fputs  .   /   \  字眼(这里/i就是大小写都识别)

第三层绕过,val_val中不能有bin  mv  cp  ls  |  f  a  l  ?  *  >  字眼

然后就是命令执行 #man,和cmd参数 和 manba out 拼接起来的命令

构造payload:

cp /var/www/html/88.txt

将其转换为八进制,结果为143 160 040 057 146 154 141 147 040 057 166 141 162 057 167 167 167 057 150 164 155 154 057 070 070 056 164 170 164 012

(为什么不转为16进制,主要是第三层绕过里面有过滤f,而我们转换的结果里面包含了f)

我们将八进制统一加上/0,得到

\0143\0160\0040\0057\0146\0154\0141\0147\0040\0057\0166\0141\0162\0057\0167\0167\0167\0057\0150\0164\0155\0154\0057\0070\0070\0056\0164\0170\0164\0012

我们构造payload的时候要注意,eval执行的第一个字符是注释符,所以我们要绕过注释符,用到换行符%0A,同时还要注释掉后面的manba out避免影响eval执行命令,所以这里用到%23,用&连接前后语句,用%24表示$,这样就会执行我们后面的语句

/?cmd=%0A`$_GET[1]`;%23&1=%24(echo -e "\0143\0160\0040\0057\0146\0154\0141\0147\0040\0057\0166\0141\0162\0057\0167\0167\0167\0057\0150\0164\0155\0154\0057\0070\0070\0056\0164\0170\0164\0012")

成功上传payload后

访问88.txt

得到flag

知识点:

1.> Linux cp命令主要用于复制文件或目录。

   语法:

cp [选项] 源文件 目标文件

2.> preg_match命令

模式分隔符后的"i"标记这是一个大小写不敏感的搜索

我的理解就是如果要用preg_match搜索多个字符串就用 |  连接

这里的 i 就是不管大写还是小写都识别,这里我们把 i 删了重新理解一下

3.> 各种进制的表达

在C语言里,整数有三种表示形式:十进制,八进制,十六进制。其中以数字0开头,由0~7组成的数是八进制。以0X或0x开头,由0~9,A~F或a~f 组成是十六进制。除表示正负的符号外,以1~9开头,由0~9组成是十进制。

十进制:除表示正负的符号外,以1~9开头,由0~9组成。如 128,+234,-278。

八进制:以0开头,由0~7组成的数。如 0126, 050000.

十六进制:以0X或0x开头,由0~9,A~F或a~f 组成。如 0x12A, 0x5a000。

4.> 我们要注意,如果要传入八进制数在url上,我们必须使用转义字符 \ 使其url能正确识别为八进制数,而不是当作普通的十进制数0xx来识别,但是这里还需要注意的是,在url上, \ 表示路径分隔符,为了url能将 \ 当做转义符号而不是路径分隔符,我们可以使用echo -e命令。

  • shell echo的各种用法

echo -e   // –e 在这里启用反斜杠转义的解释

详见:Shell echo命令 | 菜鸟教程

  • ` `  反引号中的命令当作shell命令执行

5.> url编码就是一个字符ascii码十六进制

回车,ASCII码13,"\r"
换行,ASCII码10,"\n",10的16进制是0xA,所以url编码是%0A
空格,ASCII码32,32的16进制是0x20,所以url编码是%20

# ,url编码是%23

4.warm up

第一层,如果val1和val2值不相等但是md5弱比较相等,输出ez

第二层,如果md5参数自身和自身的md5值相等,输出ezez

第三层,如果xy和xyctf弱比较相等,且xy不等于XYCTF_550102591,xy的md5值和XYCTF_550102591的md5值相等,则输level2 (这里有个相似的例题,可以参考buuctf朴实无华)

传入payload

利用到变量覆盖漏洞,我们这里直接给xyctf传入值就可以覆盖掉原先xyctf的值

/?XYCTF=QNKCDZO&val1[]=1&val2[]=2&md5=0e215962017&XY=QNKCDZO

得到提示访问LLeeevvveeelll222.php

代码审计一下

我们要intval函数转换结果不为0而且还要post传入的a中不包含0~9

就输出那一串文字,替换操作是通过调用 preg_replace($_GET['a'],$_GET['b'],$_GET['c']) 来实现的。其中,$_GET['a'] 是正则表达式模式,$_GET['b'] 是替换文本,$_GET['c'] 是要进行替换操作的目标文本

知识点:

1.echo(),print(),print_r()的区别

参考链接:PHP中echo(),print(),print_r()的区别及打印函数-CSDN博客

echo可以输出多个变量值,且没有返回值

print只有一个变量,作为一个字符串输出,有返回值1,且不能输出数组和对象,多用于打印字符串

print_r可以输出stirng、int、float、array、object等,输出array时会用结构表示,多用于打印复合类型,如数组。print_r打印关于变量的易于理解的信息。

echo是PHP语句

print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)

print()    只能打印出简单类型变量的值(如int,string)
print_r() 可以打印出复杂类型变量的值(如数组,对象)
echo     输出一个或者多个字符串

例:

在代码中

换成print函数则变成了

2.preg_match函数

参考链接:正则表达式学习笔记(超级详细!!!)| 有用的小知识_1\d{2}-CSDN博客

  • 在正则中可以用一些简写字符

  • 在正则中可以用的一些标志(模式修饰符)

标志也叫模式修正符,因为它可以用来修改表达式的搜索结果。 这些标志可以任意的组合使用,它也是整个正则表达式中的一部分

  • 在正则中可以用的一些元字符
正则的语法参数

  • pattern参数

正则表达式模式通常以斜杠开头和结尾,例如 /pattern/

  • matches参数

是一个可选的输出参数,用于存储匹配到的结果。它是一个数组,其中每个元素对应一个匹配到的子模式(圆括号包裹的部分)

在函数调用后,如果匹配成功,$matches 数组将会被填充上匹配到的子串。第一个元素 $matches[0] 将包含整个匹配到的字符串,接下来的元素 $matches[1]$matches[2] 等将分别包含第一个、第二个圆括号包裹的子模式的匹配结果

例:

在代码中

在这个例子中,$matches[0] 包含整个匹配到的字符串,即 '12345789'。

正则的返回值

如果 pattern 匹配到指定 subject,则 preg_match() 返回 1,如果没有匹配到则返回 0, 或者在失败时返回 false

例:

3.extract函数

本函数用来将变量从数组中导入到当前的符号表中。常用于变量覆盖漏洞

       

4.preg_match绕过

扩展:有哪些常见的代码执行的函数?
(1)eval函数

把字符串code当作php代码执行

eval ( string $code ) : mixed

(2)assert函数

PHP5PHP7中,如果assertion是字符串,它将会被assert()当做PHP代码来执行。

PHP 5
assert ( mixed $assertion [, string $description ] ) : bool

PHP 7
assert ( mixed $assertion [, Throwable $exception ] ) : bool

数组绕过

preg_match只能处理字符串,当传入的subject是数组时会返回false

换行符绕过

.不会匹配换行符( \n )

例:

异或绕过

文章参考:命令执行中关于PHP正则表达式的一些绕过方法_正则表达式中过滤的怎么绕过-CSDN博客

在PHP中两个字符串异或之后,得到的还是一个字符串。如果正则过滤了一些字符串,那就可以使用两个不在正则匹配范围内的字符串进行异或得到我们想要的字符串。

例 echo '?' ^ '~' ;

运行结果为:A

异或绕过的原理
异或规则:

相同为0,不同为1

1 xor 1 =0

0 xor 0 =0

1 xor 0 =1

0 xor 1 =1

继续拿实例

echo ' ! ' ^ ' s ' ;  //运行结果为 r

!和 S 异或出来的  r

​可以把1理解为真,0理解为假;那么就可以把“&”理解为“与”,“|”理解为“或”;**而对于“^”则是相同为就0**
​回到做题上来,我们只要知道我们想要的字符的对应哪两个字符异或,只需要找到正则里没有过滤的字符异或得到我们想要的字符

这里我们可以看一下p神的payload、

在p神的代码中,' _ ' 和 '  __ ' 和 ' ___ ' 是 构造的变量(因为preg_match()过滤了所有的字母,我们只能用下划线来作变量名。)

p神用的语句是

(在PHP5当中assert()的作用和eval()相似都是执行,但是eval是因为是一个语言构造器而不是一个函数,不能被可变函数调用,所以这种拼接的方法只能用assert而不能用eval。只不过eval()只执行符合php编码规范的代码,PHITHON师傅这里还有就是使用 变量 进行payload拼接)

把payload拼接组合一下就是:(仅phpPHP 7.0.12及以下版本可以使用)

$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');$___=$$__;$_($___[_]);

这里传入了shell=assert($_POST[ _ ]),由于"_"不受限制就可以任意传值了。(这里有一个误区,就是仅传入shell=$_POST[ _ ],这样的确最终代码是eval($_POST[ _ ])了,但当外面的eval执行了之后,就仅剩下一个$_POST[ _ ]了,所以不行

因为有很多不可打印字符,所以使用url编码表示
然后只需要在POST里面传参

_=phpinfo();      

可以蚁剑连接了,密码为_

这个payload经测试PHP 7.0.12及以下版本可以使用,碰到更高的版本可能assert()不能使用了,可以换成eval()

另外一种绕过方法

payload:

${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo

即 ​${_GET}{%ff}();&%ff=phpinfo

(这里是用 %ff%ff%ff%ff  %a0%b8%ba%ab 进行异或运算得到_GET)

任何字符与0xff异或都会取相反,这样就能减少运算量了。
注意:测试中发现,传值时对于要计算的部分不能用括号括起来,因为括号也将被识别为传入的字符串,可以使用{}代替,原因是php的use of undefined constant特性,例如${_GET}{a}这样的语句php是不会判为错误的,因为{}使用来 界定变量 的,这句话就是会将_GET自动看为字符串,也就是$_GET['a']

url编码取反绕过

我们可以构造payload:phpinfo();

此时我们就可以传入 (~%8F%97%8F%96%91%99%90)();

PHP利用PCRE回溯次数限制绕过某些安全限制

参考文章;PHP利用PCRE回溯次数限制绕过某些安全限制 | 离别歌

preg_match函数回溯次数上限默认是100万,我们可以通过发送超长字符串的方式,使正则返回bool(false)绕过限制

怎么修复PCRE带来的问题?

利用全等号===来判断返回值,这样即使返回了bool(false)也不会进入循环语句

5.intval函数绕过

intval函数用法:

参考文章:[WUSTCTF 2020]朴实无华:PHP 下的 intval 绕过技巧_intval( 绕过注入-CSDN博客

用于将其他类型的数据转化为整型数据

intval(mixed $value, int $base = 10): int

针对浮点数,intval函数采用的是“截断而非四舍五入”的方法

例如

intval函数的进制转换

intval() 函数的 $base 参数仅在 $value 参数的数据类型为 字符串 时生效

当我们需要将一个 采用 $base 进制的数值 转化为 十进制数值 时,需要 先将该数值转化为字符串 再交由 intval() 函数进行处理。

例如

实例是将八进制的3633转换为十进制,须为字符串类型时,才能生效转为十进制的1947

intval函数字符串解析规则(十进制)

intval函数字符串解析规则(其他进制)
扩充:二进制、八进制、十六进制的前缀
  • 0B (0b)表示二进制的前缀

例如:0B10101010111

  • 0O( 大写英文字母O) 表示八进制的前缀 (或者使用空格加上0 注意是空格加上0 即:" 0")

例如:" 076" 或者 "0O76"

  • 0x(0X)  表示十六进制的前缀

例如:0x18

intval函数字符串解析规则(科学计数法)

intval函数数组解析规则

转换数组类型时,不关心数组中的内容,只判断数组中有没有元素。

数组里面有元素,返回1

数组里面没有元素,返回0

取反

~取反符号

算数运算符

intval() 函数支持算数运算符,如果传入的 $var参数包含算数运算符,会先运算,再对运算结果进行转换。

intval函数绕过思路

参考文章:PHP intval()函数详解,intval()函数漏洞原理及绕过思路_intval函数-CSDN博客

1)当某个数字被过滤时,可以使用它的 8进制/16进制来绕过;比如过滤10,就用012(八进制)或0xA(十六进制)。
2)对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。
3)当某个数字被过滤时,可以给它增加小数位来绕过;比如过滤3,就用3.1。
4)当某个数字被过滤时,可以给它拼接字符串来绕过;比如过滤3,就用3ab。(GET请求的参数会自动拼接单引号)
5)当某个数字被过滤时,可以两次取反来绕过;比如过滤10,就用~~10。
6)当某个数字被过滤时,可以使用算数运算符绕过;比如过滤10,就用 5+5 或 2*5。

6.preg_replace \e模式下的代码执行

5.ezPOP

<?php
error_reporting(0);
highlight_file(__FILE__);class AAA
{public $s;public $a;public function __toString(){echo "you get 2 A <br>";$p = $this->a;return $this->s->$p;}
}class BBB
{public $c;public $d;public function __get($name){echo "you get 2 B <br>";$a=$_POST['a'];$b=$_POST;$c=$this->c;$d=$this->d;if (isset($b['a'])) {unset($b['a']);}call_user_func($a,$b)($c)($d);}
}class CCC
{public $c;public function __destruct(){echo "you get 2 C <br>";echo $this->c;}
}if(isset($_GET['xy'])) {$a = unserialize($_GET['xy']);throw new Exception("noooooob!!!");
} 

6.ezMake

7.ezSerialize

8.ezRCE

知识点:

1.str_split

将字符串转换为数组

str_split(string $string, int $length = 1): array

例:

如果指定长度,则

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

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

相关文章

OpenStack云计算(十一)——OpenStack网络管理,验证OpenStack网络资源模型,验证来巩固和加深对OpenStack网络资源模型的理解

项目实训一 【实训题目】 验证OpenStack网络资源模型 【实训目的】 通过验证来巩固和加深对OpenStack网络资源模型的理解。 【实训准备】 &#xff08;1&#xff09;复习Neutron网络资源模型。 &#xff08;2&#xff09;重点理解网络、子网、端口和路由器的概念。 【实…

SOTAX溶出测试系统PC触摸屏维修三部曲

SOTAX溶出测试系统作为一款广泛应用于制药行业的知名品牌&#xff0c;具有高精度、操作简便、稳定性好等特点。它适用于各种类型的药品研发和生产环节&#xff0c;为科研人员提供可靠的数据支持。瑞士SOTAX溶出仪是实验室中常用的设备&#xff0c;其触摸屏是用户交互的重要界面…

【java毕业设计】 基于Spring Boot+mysql的免税商品优选购物商城设计与实现(程序源码)-免税商品优选购物商城

基于Spring Bootmysql的免税商品优选购物商城设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于Spring Bootmysql的免税商品优选购物商城设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及…

Mysql学习一

目录 1.启动数据库&#xff1a; 2.命令行连接到MySQL&#xff08;winr输入cmd&#xff09; 3.MySQL的三重结构&#xff1a; 4.SQL语句分类&#xff1a; 1.启动数据库&#xff1a; winr——输入services.msc进入本地服务 2.命令行连接到MySQL&#xff08;winr输入cmd&#x…

数据结构-树和森林之间的转化

从树的二叉链表的定义可知&#xff0c;任何一棵和树对应的二叉树&#xff0c;其根节点的右子树必为空。这里我们举三个树&#xff0c;将这个由三个树组成的森林组成二叉树是这个样子的。 下面我们说明一下详细过程&#xff0c;首先将每个树转化为二叉的状态&#xff0c;如图所示…

[激光原理与应用-89]:激光器产品性能指标参数详解

目录 示例&#xff1a;大量能纳秒激光器 示例2&#xff1a;中等能量纳秒激光器 1、中心波长Wavelength (nm) 351nm1nm 2、脉冲宽度 Pulse Width ~120ns 1kHz 3、重复频率 Repitition Rate 1~10KHz 4、行频 Line Frequency 50 to 60 Hz 5、单脉冲能量 Pulse …

逆向修改app就可以游戏充值到账?

hello ,大家好, 现在市场仍然流行着非常多的传奇类游戏私服或者其他类型的游戏私服,随着私服越来越多(很多并不合法),越来越多的人加入了破解,逆向修改,或者代充的队伍并从中获利。这里我给大家分享一下这些做代充的常规的做法,以及大家作为游戏服务器如何避坑做强校验…

在linux系统中启动pycharm

1.找到pycharm的安装路径&#xff0c;一般在下载文件夹中 2.进入pycharm的安装路径&#xff0c;进入bin目录 3.右击&#xff0c;打开终端&#xff0c;输入./pycharm.sh

数字化工厂生产管理系统提升企业竞争力

在当今激烈竞争的市场环境中&#xff0c;企业面临着诸多挑战&#xff0c;如不断增加的客户需求、日益严格的质量标准以及快速变化的市场趋势。为了在这样的环境中保持竞争力&#xff0c;许多企业正在转向数字化工厂生产管理系统。 数字化工厂生产管理系统是一种集成的软件解决方…

云盘怎么选最好!

选择云盘时&#xff0c;您应该考虑以下几个关键因素来确保选中最适合您需求的服务&#xff1a; 速度&#xff1a;选择云盘时&#xff0c;传输速度是一个重要的考量点。您应该选择一个即使不使用会员服务也能提供较快上传和下载速度的云盘服务。 存储空间&#xff1a;不同的云盘…

Kubernetes(k8s)的概念以及使用

k8s的概念&#xff1a; K8s是指Kubernetes&#xff0c;是一个开源的容器编排和管理平台。它最初由Google开发&#xff0c;并于2014年将其开源。Kubernetes旨在简化容器化应用程序的部署、扩展和管理。 Kubernetes提供了一种可靠且可扩展的平台&#xff0c;用于管理容器化应用…

Jmeter(十二) - 从入门到精通 - JMeter逻辑控制器 - 终篇(详解教程)

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 Jmeter官网对逻辑控制器的解释是&#xff1a;“Logic Controllers determine the order in which Samplers are processed.”。 意思是说&#xff0c;逻辑控制器可以控制采样…

vue-manage-system 版本更新,让开发更加简单

vue-manage-system 近期进行了一次版本升级&#xff0c;主要是支持了更多功能、升级依赖版本和优化样式&#xff0c;并且上线了官方文档网站&#xff0c;大部分功能都有文档或者使用示例&#xff0c;更加适合新手上手开发&#xff0c;只需要根据实际业务简单修改&#xff0c;就…

AMEYA360:MOS管失效的六大原因

功率器件在近几年的市场方面发展的非常火爆&#xff0c;尤其是 MOS 管&#xff0c;他主要应用在电源适配器&#xff0c;电池管理系统以及逆变器和电机控制系统中。 而随着计算器主板&#xff0c;AI 显卡&#xff0c;服务器等行业的爆发&#xff0c;低压功率 MOS 管将再次迎来爆…

查找算法之斐波那契查找

目录 前言一、查找算法预备知识二、斐波那契查找三、总结3.1 查找性能3.2 适用场景 前言 查找算法是一种用于在数据集合中查找特定元素的算法。在计算机科学中&#xff0c;查找算法通常被用于在数组、链表、树等数据结构中查找目标元素的位置或者判断目标元素是否存在。 查找算…

大珩PPT助手一键颜色设置

大珩PPT助手最新推出的一键设置文字颜色和背景色功能&#xff0c;为用户在创建演示文稿时带来了更便捷、高效的体验。这一功能使用户能够轻松调整演示文稿中文字的颜色和幻灯片的背景色&#xff0c;以满足不同场合和主题的需要。 以下是该功能的几个关键特点和优势&#xff1a…

sebaKMT赛巴测漏仪 听漏仪维修HL5000 HL7000

赛巴听漏仪&#xff0c;作为一款应用于供水系统漏损检测的专业设备&#xff0c;在业内有着很广泛的应用。然而&#xff0c;任何仪器在使用过程中都难免会遇到一些问题&#xff0c;赛巴听漏仪也不例外。针对这些问题&#xff0c;专业的维修服务显得尤为重要。 首先&#xff0c;赛…

微服架构基础设施环境平台搭建 -(六)Kubesphere 部署Redis服务 设置访问Redis密码

微服架构基础设施环境平台搭建 -&#xff08;六&#xff09;Kubesphere 部署Redis服务 & 设置访问Redis密码 微服架构基础设施环境平台搭建 系列文章 微服架构基础设施环境平台搭建 -&#xff08;一&#xff09;基础环境准备 微服架构基础设施环境平台搭建 -&#xff08;二…

FreeSWITCH sofia senddtmf

先看这段代码&#xff1a; 应用调用 senddtmf&#xff0c;这段代码会检查 dtmf-type 这个通道变量的值 如果为 DTMF_2833&#xff0c;那么调用核心的 queue_rfc2833 函数如果为 DTMF_INFO&#xff0c;如果为 w 或者 W 就延时相应的时间&#xff0c;或者是其它字符&#xff0c;…

程客有话说05 | 吕时有:在GIS行业深耕13年,做梦做出来了数学竞赛题,这是让我最开心的事

《程客有话说》是我们最新推出的一个访谈栏目&#xff0c;邀请了一些国内外有趣的程序员来分享他们的经验、观点与成长故事&#xff0c;我们尝试建立一个程序员交流与学习的平台&#xff0c;也欢迎大家推荐朋友或自己来参加我们的节目&#xff0c;一起加油。 本期我们邀请的程…