ctfshow_web入门 PHP特性
PHP特性
这里以半做题,半学习为主,所以就显得比较啰嗦
阿巴阿巴,但是实际上,写得比较水,等过一段时间再总结一下
比较深刻的印象是:下一个手册,多看手册
web 89
preg_match()函数一个漏洞 无法处理数组
所以构造数组绕过:
额,写了一个小脚本测试了一下
也算是传入了值的(算是传入了空嘛),所以数组中有元素
传入的元素是字符串类型的。
web 90
所以考虑传入一个16进制或者8进制的了
payload
intval()函数如果$base为0,则$var中存在字母的话遇到字母就停止读取,传入4476a会将后面的a丢弃,比较前面的
web 91
额,做题犯迷糊了,主要是一直想不懂phpphp%0aphp
和php%0aphp
可以拿到flag,
一直没理解到,好吧,现在也迷糊。因为是学习,所以不能直接拿到flag就过了
原来是正则理解错了,/^php$/
只能够匹配'php'
,当时鬼使神差的以为是首尾是php就行
payload
在padnote++中视图,显示字符,设置的全部显示
看了一下hint,里面有一个关于文件上传中Apache解析的漏洞
Apache HTTPD 换行解析漏洞(CVE-2017-15715)与拓展
利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单
简单来说就是,Apache2.4.0~2.4.29中在.php的16进制后面加上0a被解析为PHP文件执行了(在利用.php.xxx)绕过那一关,离谱,burp2021没有hex的选项,所以在后面添加0x0a有需要百度一下。对文件上传的脚本也有要求,限制条件有点多,还是请看看上面两个博客。
web 92
普通绕过
感觉和web89差不多,payload:
hint,不懂这是什么方法
intval()函数如果$base为0,则$var中存在字母的话遇到字母就停止读取
但是e这个字母比较特殊,可以在PHP中不是科学计数法。
所以为了绕过前面的==4476
我们就可以构造 4476e123 其实不需要是e其他的字母也可以
不过问题是,说的能用其它字符,但是只有e是可以的,由于懒(但是不能懒),所以写一个脚本进行测试,发现,确实只有e才能够得flag,不然第一个判断,强弱类型比较就nonono了
再进行php脚本的一个判断输入的4476e123为什么类型
SQL注入代码判断
一般是使用?id=1'
进行判断。在这之前,可以传入一个?id[]=1
的数组进去;
如果返回页面是:?id=1
,那么就可以找下一个注入点了,因为接受id的代码写法可能是
web 93
web92+过滤输入的字母
payload:?num=010574
利用8进制绕过
web 94
payload
web 95
payload
写了一个脚本,跑了一下,看看那些字符添加之后,不会影响intval()函数的运行,有的是不可见字符,就直接给出asc的十六进制了。脚本就放下面了,名字是:不会影响intval()的可见与不可见字符
web 96
payload
伪协议:(我一直以为伪协议只有用在include中才能用)
web 97
payload
理解不了,强行记忆
传入数组,比较时,比较传入对象(数组也算对象)的元素,在进行md5加密判断时,md5()函数加密的都是空字符
web 98
是真的有点绕,简单来说,首先要看懂三目运算符,接着要看懂引用。
$_GET
和$_POST
分别采集get和post表单中的数据,是数组,$_GET=&$_POST
意思是,给$_GET
赋值为$_POST
的值。简单来说就是,$_GET['123']=1
成了$_POST['123']=123
,大概就是这样。
web99
额,试了一手,没得过滤,看了一下hint,说的是in_array
没有设置第三个参数,就会将n=1.php自动转换为1
web 100
注意一点:and是或的意思,请看:额,不看了,记住是或不是且就行
然后payload,忘了,
web 101
学习了,学习了
利用反射类,Relectionclass()
函数,作用:根据类名反射一个类。在代码执行时,加入输入一个A,但是在逻辑判断之后,生成了一个B类,所以这时,用Relectionclass("A")来限定生成A类。
payload
拿到flag之后,因为flag比以前少了一位,所以要在末尾添加一个字符,进行爆破
web 102
用hint的方法就行,
v2=115044383959474e6864434171594473:去掉前两位数字(11,用来绕过substr)的截断。同时也是16进制编码的PD89YGNhdCAqYDs
,而PD89YGNhdCAqYDs
解码出来是:
因为有e
,所以被当做了科学计数法的数字(7.0.0及以下,也会将0x开头的当做数字)。
再结合v1=hex2bin
将v2转化为PD89YGNhdCAqYDs
,再通过v3实现伪协议的base64-decode通道解码
web 103
白嫖102
web 104
没有任何的过滤机制,所以直接上传两个相同的就是了
web 105
比较典型的参数覆盖,仔细看看代码就看得懂。
payload
web 106
同md5上传数组
web 107
parse_str — 将字符串解析成多个变量,也就是说,v1传递的值,以数组方式放到v2中去了。
payload1
payload2
如果v3提交一个数组,返回值是NULL,那么可以不提交v2
payload3
web 108
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字 母的字符是大小写敏感的。 ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配
web 109
paylaod
web 110
payload1
web 111
利用全局变量
?v1=ctfshow&v2=GLOBLS
web 112
可以直接
php://filter/read/resource
web 113
在web 112对的基础上过滤了php
payload
hint:利用目录溢出,从而让is_file认为不是一个文件
web 114
highlight_file()不能够高亮数组,没有过滤php和filter
payload
web 115
%0C
:换页键
可能会有个问题,就是说,在filter()函数中,过滤了0
,但是这里为什么能用%0c
呢。因为,如果需要传入不可见字符,但是没有办法,表示,所以就用了%+16进制数
来代表添加的对应的符号,例如这里的%0c
,虽然写得有0
,但是上传之后,%0c
表示换页键,是一个不可见字符
web 123
PHP变量名应该只有数字字母下划线,同时GET或POST方式传进去的变量名,会自动将空格 + . [转换为_
但是有一个特性可以绕过,使变量名出现.之类的
特殊字符[, GET或POST方式传参时,变量名中的[也会被替换为_,但其后的字符就不会被替换了
如 CTF[SHOW.COM=>CTF_SHOW.COM
payload
web 125
不过,可以使用var_export来进行输出,所以payload
骚操作来了:
1.覆盖fl0g(最骚)
所以payload
2.文件包含
利用执行的eval,在fun中传入highlight_file($_GET[1])
payload
3.argv上传
argv只接受get传入参数,post方式不行
同样,通过eval执行$a,对$fl0g进行赋值
paylaod
4.argv上传——改
web 126
嫖web125,argv上传的做法
web 127
$_SERVER['QUERY_STRING']是获取url后面的参数以及值的,
于是只能传递一个参数
所以这个题的考点是,怎么构造一个下划线。首先我们是知道[ . 空格
会被转化为下划线,恰好没过滤空格,所以
payload
嗯,这里打算跑一下,有哪些字符会被转换为_
。
结果是:空格 + . [
会被转化为_
web 128
新知识:
gettext()函数有一个别名:_
所以payload:
web 129
额,说的是考虑目录穿越,于是试了一下
接着尝试
发现是空白的,顺手看眼源代码,能读到index.php所以应该能读到flag.php
web 130
?我直接上传f=ctfshow
成功了?
因为/.+?ctfshow/is
前面是.+?
,意思是,在ctfshow字符串前面有至少一个字符。所以直接上传ctfshow能拿到flag。
如果设置表达式为:(.+)?
那么ctfshow就无法绕过了
web 131
这个题考的是,正则表达式溢出,新知识了。
php正则失效-最大回溯(pcre.backtrack_limit)/递归限制
正则表达式,对一百万长度后面的就不匹配了。
直接用hint的就行,如果复制粘贴太卡,可以试试这个脚本
web 132
访问robots.txt,发现有一个admin目录,访问得到
嗷,对了忘了说,这里建议下载一个手册,查函数的时候是真的方便
所以,看代码;我们没有办法预测mt_rand()
函数的值,又看运算;其实,一眼望过去,会发现,第一第二个判断都是无法预测无法构造的,只能是FALSE,巧就巧在,前两个过了,后面的username
能够进入判断和能够利用;
所以对username进行赋值admin,又由于code也要等于admin,所以给code也赋值为admin,反正code字符串时肯定不等于mt_rand()的随机数的。password没得什么用,不复制也行
web 133
这题有点没看懂,没懂这个方法原理是怎么样的。
给我的感觉是,访问一个地址,然后在地址查询记录;恰好有个在线工具
每次外带只能带一条输出来,让后执行命令
payload是
显然没构造对,,,,
先理解一下是怎么把flag带出来的,接着再看怎么执行带出flag的语句
大概就是这么一个意思
web 134
payload
web 135
和web133差不多的方式,只是需要换一个nl flag
拿到第一个flagflag1=ctfshow{fbfe4223341
,就是有点不懂,为啥不加正则不行
然后有用 命令查看了一下是不是还有其他的文件,发现没有
最后看了视频才知道,原来在16行
web 136
这个要新学一个Linux的 命令:tee
payload
拿到flag
web 137
额,观察一波,传入一个ctfshow类中的方法
payload
web 138
web 140
这里看到eval,说实话,一开始想到的是命令执行,或者是外带,或者是反射类,执行出来一个ctfshow字符串或者是。试了一下都不行,最后看了一下别人的博客,说的是只要eval执行的结果是0或者是NULL就行,但是不能报错。
最后仔细一看,用弱比较过的判断。intval()函数出来的必是一个数字,数字和字符串这里进行弱比较,数子就得是0了。
payload,随便用哪一个
web 141
利用|
运算来进行代码执行,看的这一位师傅的wp
payload
使用system('cat flag.php')
不行
web 142
payload:
web 143
从这里开始建议去看这个博客了,我的代码始终有点问题
payload
web 144
因为是学习,不能总是抄别人的代码,于是额手打了一次
web 145
格式1|()|2
或者1?()2
web 146
同上
web 147
由于命名空间问题,如果要绝对调用一个函数,例如system,那么就要写成\system
php里默认命名空间是\,所有原生函数和类都在这个命名空间中。 普通调用一个函数,如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路 径; 而如果写\function_name()这样调用函数,则其实是写了一个绝对路径。 如果你在其他namespace里调用系统类,就必须写绝对路径这种写 法
paylaod
web 148
payload1
web 149
条件竞争,没有过滤,线程开高点
然后再调高一些
web 150
可以尝试用上传文件的形式做,
首先要知道怎么绕过过滤,然后执行include($ctf)
审计代码之后发现,有一个extract($_GET)
,可以用来上传$isVIP=1
绕过$isVIP。extract
作用就不在赘述了
接着通过post上传ctf,如果用get方式传递,会被过滤。从ctf
上传/tmp/sess_test
如图 :
所以,在题目中,上传ctf=/tmp/sess_test
,那么/tmp/sess_test
会被加载,如果文件满足PHP格式,那么通过include后会执行PHP部分代码。详情可以看文件包含_web82
接着写一个上传文件的html代码,上传,同时在题目界面发送post的请求。
反复上传,直到能够访问url/test1.php,接着利用rce拿到flag
web150_
题目和150几乎一样,只是了一个log过滤
方法同web150
这个方法,怎么说呢,感觉只要没有过滤_ \
,几乎就是万能的了,顶不住。
绕过intval
intval原理:https://www.runoob.com/php/php-intval-function.html,反复多看几次
不绕过方式:(额,就是进入了这个判断,if成功,才能拿到flag,不是else)
- 利用16进制和8进制
- 利用字符干扰,intval()函数如果$base为0,则$var中存在字母的话遇到字母就停止读取,例如web92——hint
- 数字前加上
空格
,空格的url编码 %20
,换行符的url编码 %0a
+
,+的url编码 %2b
不会影响intval()的可见与不可见字符
多嘴一句,咋们貌似还可以将255给调大点,虽然后面的貌似都没有什么作用
八卦都整出来了,都没有合适的(吃饭的时候跑了一下玩一玩)
反射类
web 101
md5 sha1
- 数组绕过
- md5(array())返回值为NULL
覆盖类
- 全局变量 GLOBALS
- is_file函数可以使用包装器伪协议绕过,不影响file_get_contents highlight_file
- readfile考虑目录穿越,
- include也可以考虑目录穿越
带出类
特点:只会给6个位置,没过滤反引号
利用http://dnslog.cn来讲查询到的flag带出道记录中
__EOF__

本文链接:https://www.cnblogs.com/upstream-yu/p/15110382.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix