PHP代码审计分段讲解(11)
后面的题目相对于之前的题目难度稍微提升了一些,所以对每道题进行单独的分析
27题
<?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三个值
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
对传递的a进行了限制
if(stripos($a,'.')) {
echo 'Hahahahahaha';
return ;
}
而在这里需要读取$a中的文件内容
$data = @file_get_contents($a,'r');
同时还有一个限制是:
$data=="1112 is a nice lab!"
所以我们很难通过搭建服务器访问txt文件来传输这样的一串数据,所以这里使用PHP的伪协议
详细的伪协议介绍和利用可以看Smi1e的这篇文章:https://www.smi1e.top/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E4%B8%8Ephp%E4%BC%AA%E5%8D%8F%E8%AE%AE/
这里只截取其中的一部分:
php://input
php://input 是个可以访问请求的原始数据的只读流,可以读取到post没有解析的原始数据, 将post请求中的数据作为PHP代码执行。因为它不依赖于特定的 php.ini 指令。 注:enctype=”multipart/form-data” 的时候 php://input 是无效的。
我们这里通过 input 使用POST方式传输a的值为:
1112 is a nice lab!
而对 id 进行的限制为:
if(!$_GET['id']) {
header('Location:
index.php?id=1');
exit();
}
同时还需要满足
$id==0
也就是说 id 需要弱类型比较与 0 相等,又要不为0,如果为0,则会重定向至index.php
这里可以直接使用字母绕过,在PHP代码审计分段讲解(9)中,第25题 switch没有break 字符与0比较绕过里面,用到了一个点是:
PHP中非数字开头字符串和数字 0比较==都返回True
作者猜想应该是字符串转换成数字类型失败,所以直接返回0
所以我们只需要让 id=abc 这一类的字母就行
第三个参数 b 的限制条件为:
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
PHP代码审计分段讲解(11)的更多相关文章
- PHP代码审计分段讲解(14)
30题利用提交数组绕过逻辑 本篇博客是PHP代码审计分段讲解系列题解的最后一篇,对于我这个懒癌患者来说,很多事情知易行难,坚持下去,继续学习和提高自己. 源码如下: <?php $role = ...
- PHP代码审计分段讲解(13)
代码审计分段讲解之29题,代码如下: <?php require("config.php"); $table = $_GET['table']?$_GET['table']: ...
- PHP代码审计分段讲解(5)
11 sql闭合绕过 源代码为 <?php if($_POST[user] && $_POST[pass]) { $conn = mysql_connect("**** ...
- PHP代码审计分段讲解(1)
PHP源码来自:https://github.com/bowu678/php_bugs 快乐的暑期学习生活+1 01 extract变量覆盖 <?php $flag='xxx'; extract ...
- PHP代码审计分段讲解(12)
28题 <!DOCTYPE html> <html> <head> <title>Web 350</title> <style typ ...
- PHP代码审计分段讲解(10)
26 unserialize()序列化 <!-- 题目:http://web.jarvisoj.com:32768 --> <!-- index.php --> <?ph ...
- PHP代码审计分段讲解(9)
22 弱类型整数大小比较绕过 <?php error_reporting(0); $flag = "flag{test}"; $temp = $_GET['password' ...
- PHP代码审计分段讲解(8)
20 十六进制与数字比较 源代码为: <?php error_reporting(0); function noother_says_correct($temp) { $flag = 'flag ...
- PHP代码审计分段讲解(7)
17 密码md5比较绕过 <?php if($_POST[user] && $_POST[pass]) { mysql_connect(SAE_MYSQL_HOST_M . ': ...
随机推荐
- 分布式文档存储数据库之MongoDB分片集群
前文我们聊到了mongodb的副本集以及配置副本集,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13953598.html:今天我们来聊下mongodb的分片 ...
- .NET操作Excel
一.读取Excel数据,并显示 1.配置文件 <configuration> <system.web> <compilation debug="true&quo ...
- 分布式文档存储数据库之MongoDB备份与恢复
前文我们聊了下mongodb的访问控制以及用户创建和角色分配,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13974656.html:今天我们来了解下mong ...
- 储存与RAID--独立磁盘阵列
存储: 专门用来插硬盘的机器,作用是增加插口,可以多插硬盘. 这种有策略保证硬盘坏了,数据不丢.而本地磁盘坏了,会导致数据丢失,故一般操作系统放在本地磁盘.而数据放在存储盘. 存储里依然有:cpu( ...
- 西数WD2T硬盘分区对齐的方法
新购一个西数2T硬盘,也就是绿盘的那种,淘宝500左右,支持高级格式化. 到手以后,分区格式化,前几天格式化完成以后,fdisk -l 发现如下文字 引用 Partition 1 does not s ...
- Java编发编程 - 线程池的认识(一)
每逢面试都会询问道线程池的概念和使用,但是工作中真正的又有多少场景使用呢?相信大家都会有这样的疑问:面试选拔造汽车,实际进公司就是拧螺丝!但是真正要把这颗螺丝拧紧,拧牢,没有这些最底层的知识做铺垫你可 ...
- 12种不宜使用的Javascript语法 ---阮一峰
原文链接-阮一峰博客 1. == Javascript有两组相等运算符,一组是==和!=,另一组是===和!==.前者只比较值的相等,后者除了值以外,还比较类型是否相同. 请尽量不要使用前一组,永远只 ...
- [代码审计Day1] in_array代码审计
简介 1 简介 in_array() 函数搜索数组中是否存在指定的值. 语法:in_array(search,array,type) 参数 描述 search 必需.规定要在数组搜索的值. arra ...
- 死磕以太坊源码分析之p2p节点发现
死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以 ...
- jdk的切换
1.下载安装新版本的jdk 2.使用该命令,添加新版jdk alternatives --install /usr/bin/java java /opt/jdk1.8.0_144/bin/java 2 ...