后面的题目相对于之前的题目难度稍微提升了一些,所以对每道题进行单独的分析

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)的更多相关文章

  1. PHP代码审计分段讲解(14)

    30题利用提交数组绕过逻辑 本篇博客是PHP代码审计分段讲解系列题解的最后一篇,对于我这个懒癌患者来说,很多事情知易行难,坚持下去,继续学习和提高自己. 源码如下: <?php $role = ...

  2. PHP代码审计分段讲解(13)

    代码审计分段讲解之29题,代码如下: <?php require("config.php"); $table = $_GET['table']?$_GET['table']: ...

  3. PHP代码审计分段讲解(5)

    11 sql闭合绕过 源代码为 <?php if($_POST[user] && $_POST[pass]) { $conn = mysql_connect("**** ...

  4. PHP代码审计分段讲解(1)

    PHP源码来自:https://github.com/bowu678/php_bugs 快乐的暑期学习生活+1 01 extract变量覆盖 <?php $flag='xxx'; extract ...

  5. PHP代码审计分段讲解(12)

    28题 <!DOCTYPE html> <html> <head> <title>Web 350</title> <style typ ...

  6. PHP代码审计分段讲解(10)

    26 unserialize()序列化 <!-- 题目:http://web.jarvisoj.com:32768 --> <!-- index.php --> <?ph ...

  7. PHP代码审计分段讲解(9)

    22 弱类型整数大小比较绕过 <?php error_reporting(0); $flag = "flag{test}"; $temp = $_GET['password' ...

  8. PHP代码审计分段讲解(8)

    20 十六进制与数字比较 源代码为: <?php error_reporting(0); function noother_says_correct($temp) { $flag = 'flag ...

  9. PHP代码审计分段讲解(7)

    17 密码md5比较绕过 <?php if($_POST[user] && $_POST[pass]) { mysql_connect(SAE_MYSQL_HOST_M . ': ...

随机推荐

  1. 面经手册 · 第17篇《码农会锁,ReentrantLock之AQS原理分析和实践使用》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 如果你相信你做什么都能成,你会自信的多! 千万不要总自我否定,尤其是职场的打工人.如 ...

  2. 学习.NET 挑战赛

    今天访问dot.net 网站看到了一个学习.NET 挑战赛,发现已经赛程过半了,这是一个为那些想更多地了解 C# 和 .NET 的人举办的一个完全免费的课程活动,这些模块必须在 11 月底前完成.参加 ...

  3. ctf堆叠注入总结(持续更新)

    第一种 1';USE db_name;SET @sql=CONCAT('sql contents');PREPARE stmt_name FROM @sql;EXECUTE stmt_name; 第二 ...

  4. gcc编译链接用到的环境变量

    PATH ----  可执行程序寻找路径 C_INCLUDE_PATH  ---- 头文件寻找路径 CPLUS_INCLUDE_PATH  --- g++ 头文件路径 LD_LIBRARY_PATH  ...

  5. JsonPath在接口自动化中的应用

    我理解jsonpath于json而言,就像是xpath在XML中的作用.用来确定json中某部分数据的语言.我更喜欢叫jsonpath表达式,因为这样好像是数学问题. 以前和小伙伴一起写接口自动化的时 ...

  6. 【java从入门到精通】day10-Java流程控制2-switch多选择结构

    1.switch多选择结构 switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. switch语句中的变量类型可以是: byte.short.int或者char 从j ...

  7. ceph的pg的分布的快速查看

    前言 本篇的内容实际上是另外一篇文章的字篇章,在另外一篇文章当中,将会对crush的分布的调整的做一次总结,用比较简单的方式来展示各种crush的区别 在做这个工作过程中,为了更好的能展示出效果,就有 ...

  8. ubuntu配置简单的DNS服务器

    之所以说是简单的服务器,实现的功能很简单,通过这个dns server 查询制定域名的时候,能够根据设置的值来返回IP,当前的需求是需要轮询的返回IP DNS 轮询机制会受到多方面的影响,如:A记录的 ...

  9. 彻底卸载MySQL5.7(msi,exe)版

    1,停止MySQL服务 2,右键找到任务管理器 3,在程序中卸载MySQL 4,删除MySQL安装目录 有的是在C:\Program Files下,我的是在(X86)下 5,删除隐藏文件中的MySQL ...

  10. Jmeter 添加 计数器

    第一步: 添加 > 配置元件  > 计数器    如下图所示: 第二步: 设置递增值与引用名称 第三步:使用引用名称 第四步:执行脚本,查看结果