zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    選定下拉列表的方法
    JAVA学习路线
    封装
    重写(Overriding)
    java内存泄露
    学习实例.文章管理.文章类.Article.java
    方法重载
    学习实例.文章管理.分页查询类.Page.java
    学习实例.文章管理.目标与经验总结
    Java多线程1
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/13306386.html
Copyright © 2011-2022 走看看