PHP代码审计分段讲解(11)
后面的题目相对于之前的题目难度稍微提升了一些,所以对每道题进行单独的分析
27题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php if (! $_GET [ 'id' ]) { header('Location: index.php?id=1'); exit (); } $id = $_GET [ 'id' ]; $a = $_GET [ 'a' ]; $b = $_GET [ 'b' ]; if ( stripos ( $a , '.' )) { echo 'Hahahahahaha' ; return ; } $data = @ file_get_contents ( $a , 'r' ); if ( $data == "1112 is a nice lab!" and $id ==0 and strlen ( $b )>5 and eregi ( "111" . substr ( $b ,0,1), "1114" ) and substr ( $b ,0,1)!=4) { require ( "flag.txt" ); } else { print "work harder!harder!harder!" ; } ?> |
本题目修改自BugKu的Web中的 never give up 一题
需要我们使用GET方式输入 id,a,b三个值
1 2 3 | $id = $_GET [ 'id' ]; $a = $_GET [ 'a' ]; $b = $_GET [ 'b' ]; |
对传递的a进行了限制
1 2 3 4 | if ( stripos ( $a , '.' )) { echo 'Hahahahahaha' ; return ; } |
而在这里需要读取$a中的文件内容
1 | $data = @ file_get_contents ( $a , 'r' ); |
同时还有一个限制是:
1 | $data == "1112 is a nice lab!" |
所以我们很难通过搭建服务器访问txt文件来传输这样的一串数据,所以这里使用PHP的伪协议
详细的伪协议介绍和利用可以看Smi1e的这篇文章:
这里只截取其中的一部分:
php://input
php://input 是个可以访问请求的原始数据的只读流,可以读取到post没有解析的原始数据, 将post请求中的数据作为PHP代码执行。因为它不依赖于特定的 php.ini 指令。 注:enctype=”multipart/form-data” 的时候 php://input 是无效的。
我们这里通过 input 使用POST方式传输a的值为:
1 | 1112 is a nice lab! |
而对 id 进行的限制为:
1 2 3 4 5 | if (! $_GET [ 'id' ]) { header('Location: index.php?id=1'); exit (); } |
同时还需要满足
1 | $id ==0 |
也就是说 id 需要弱类型比较与 0 相等,又要不为0,如果为0,则会重定向至index.php
这里可以直接使用字母绕过,在PHP代码审计分段讲解(9)中,第25题 switch没有break 字符与0比较绕过里面,用到了一个点是:
PHP中非数字开头字符串和数字 0
比较==
都返回True
作者猜想应该是字符串转换成数字类型失败,所以直接返回0
所以我们只需要让 id=abc 这一类的字母就行
第三个参数 b 的限制条件为:
1 | strlen ( $b )>5 and eregi ( "111" . substr ( $b ,0,1), "1114" ) and substr ( $b ,0,1)!=4) |
第一个长度问题很容易解决,简单解释一下三个限制条件:
-
strlen($b)>5 参数b的长度大于5
-
eregi("111".substr($b,0,1),"1114") 在111与参数b的第一位拼接后的结果,能够在"1114" 字符串中被找到
-
$b 的第一位不能是4
而我们知道eregi函数是存在%00截断漏洞的,所以我们令$b=%0012345,这样不仅满足了 111能够在1114中被找到,而且%00是不等于4的
同目录下写一个flag.txt文件用来看效果
burpsuite抓包,结果为:
获取flag
__EOF__

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