IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> ctfshow php特性 -> 正文阅读

[PHP知识库]ctfshow php特性

web89

?这题的逻辑是如果存在$_GET['num'],则用正则表达式匹配$num中的值,如果成功匹配则程序终止于"no no no",否则进行下一步,如果intval($num)有正确的返回值,则输出$flag。

解题思路:该题要求传入的值不能有数字,那我们的话可以利用preg_match的一个漏洞,即无法处理数组,从而进行绕过正则匹配,同时intval函数处理一个数组有正确的返回值,可以达到输出flag的目的。

payload :

num[]=

num[]=任意的东西都可以

intval(array())的返回值为0,然而if(0)是不能输出flag的,所以这里的话来个小测试,测试传入一个num[]= NULL,经intval处理后返回的值是什么

?不难看出,传入一个num[]= ,经过处理后的值为1,所以web89中的if(intval($num))可以正常执行。对于这个,我的理解是num[]= ,也算是传入了值的(传入了空吧),所以经intval()处理后的值为1。

web90

这题的话要求传入的num的是十进制值不等于4476,同时intval($num,0)的值全等于4476。所以这里的话我们运用一下intval()函数的特性。

payload:?

?num=0x117c      //4476的十六进制为117c

?num=010574      //4476的八进制为10574

?num=4476a       //intval()中如果$base=0,则$var中存在字母的话遇到字母就会停止读取,传入4476a会将后面的a丢弃

web91

?写这题的话也发现了一些问题,自己的正则还是不怎么会,所以还得多翻翻全集......正本表达式全集

理解一下这题的逻辑,第一个if多行匹配'php'(只能是'php',不可以是'adsasphp'之类的),如果匹配到则进行下一个if判断;第二个if单行匹配'php',没匹配到则输出flag。em.......那我们这里利用%0a来绕过。

payload:

?cmd=%0aphp

?cmd=php%0aphp

?cmd=任意字符%0aphp

因为%0a是换行,第一个if匹配多行可以满足条件,第二个if只能匹配第一行,该行不能有php,所以可以输出flag。

解释一下为什么php%0aphp也可以成功,因为我们传入的是%0a,在文件夹的显示(如下图)

(图片来自ctfshow_web入门 PHP特性 - upstream_yu - 博客园 (cnblogs.com))

所以我们传入一个php%0aphp是分为两行,第一行是php CRLF,第二行是php,所以在第二个if处第一行匹配不成功。

查看题目的himt,里面有个关于文件上传的漏洞

Apache HTTPD 换行解析漏洞(CVE-2017-15715)与拓展

利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单

web92

刚看到这题就感觉和web90差不多,试了web90的两个payload也可以得到flag

?num=0x117c      //4476的十六进制为117c

?num=010574      //4476的八进制为010574

仔细看了一下,原来差别在于弱类型比较

?这题的话学会一个新的方法,利用e这个特殊字母构造payload绕过

?num=4476e233

在第一个if弱类型比较,$num中4476e233会当作科学计数法4476*10^233,而在第二个if中,当$base=0时,intval()遇到字母就停止读取(这里看不懂的回头看一下web90,说得很详细了),因此是4476,满足条件从而输出flag。

web93

?题目也差不多和web92的一样,第二个if还是弱类型比较,只是在第三个if处多了一个正则匹配/[a-z]/i,意思是匹配a-z的字母且不区分大小写。所以第三个if是判断如果在$num中匹配到a-z的字母(不区分大小写),则程序终止,输出no no no。

第四个if的判断还是熟悉的intval($num,0),要求$num中不能有字母,意味着前几题十六进制的解法不能用,上一题的4476e233的解法也用不了。

所以仔细想想就可以知道,这里还剩下八进制的解法,传入的$num全为数字。

payload:

?num=010574    //4476的八进制是10574,0开头在intval()代表是八进制数

web94

?94的话相较于93多了一个过滤条件,查找0在$num出现的位置,匹配不了返回null,直接传八进制数010574进去是行不通的,因为0不能在首位。

这里可以用+号,url编码,加小数点绕过.....

payload:

?num=4476.01

?num=+010574

?num=%20010574

?num= 010574

?num=%0a010574

?num=%2b010574

第一个payload的话4476.01经过intval($num,0)的处理会变成int类型的4476,我们看一下本地调试的结果

?

剩下几个payload的话,我感觉是经过url解码后的一些不可见字符占据了一个位置,让010574中的第一个0处于第二位,以下是我在本地调试的结果。

web95

?95的话转义了. ,用不了4476.01这个payload,但是我们的其它payload还是可以用的......

?

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 17:27:50  更:2021-12-16 17:28:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 14:35:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码