我的博客:https://tothemoon2019.github.io
工作室“改革
” 为了加强我们这一届的知识技能 每周3个ctfhub 的 write up。
都到周三了,一道题没做,不是这有事,就是那忙,我是菜鸡,今天晚上赶紧肝一道出来。
2018-TokyoWesterns-Web-shrine
先百度了下题目名shrine
打开后有一堆乱码,不过隐约看见了app.py应该是python网站框架里的文件,然后看到了flask。
应该和flask模板漏洞有关
结果刷新页面的时候突然发现页面没有乱码了,
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '') #替换
blacklist = ['config', 'self'] # 黑名单
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True, port=80)
突然想起来有个脚本sqlmap可以跑ssti模板注入的洞,开kali跑!
成功接下来就是找能调用的类了。
![]() |
![]() |
不过源码里有写过滤,去掉了( ) ; config 和 self也加入了黑名单。不然直接查看app.config应该就能看见flag。
溜了,明天再肝
imback
虽然之前学过django不过只是些皮毛,跟别提jingjia了(虽然相似),看了下其他师傅的write up。
过滤了config,self这种模板注入常用的类,为了绕过,可以用current_app之类的全局函数。
有两个函数包含了current_app ( url_for 和 get_flashed_messages )
注入 url_for
然后利用 current_app 调用 config
全局变量 get_flashed_messages
同理
success
https://www.freebuf.com/column/148886.html
![image-20201007201856791](https://i-blog.csdnimg.cn/blog_migrate/831d654938069ad5f7c0ec8a05224654.png)
2017-赛客夏令营-Web-random
random随机
url栏里可以有num,说明是get传参。
刷新一次数字变化一次,写个python脚本跑跑都有哪些数字,是否有规律。(好久没有编程了。。。)
一直只有一个数字
用burp suite暴力破解试试
跑了半天,突然刷新突然发现random的界限是在0-100
于是随便输入个100以下的数一直提交就有了。
success
2017-赛客夏令营-Web-weakphp
老样子百度了下weakphp的中文意思(虽然知道不可能有,结果有意外收获)
但还没有看题目,不知道有没有用
页面就一句nonono,可以看到能对user和pass传参。
写爬虫遍历了一遍
一直是nonono!
佛了,我还以为是sql呢,看到user和pass,看了师傅的提示: git泄露
![]() |
![]() |
跑出来的源码:
<?php
require_once "flag.php";
if (!isset($_GET['user']) && !isset($_GET['pass'])) {
header("Location: index.php?user=1&pass=2");
}
$user = $_GET['user'];
$pass = $_GET['pass'];
if ((md5($user) == md5($pass)) and ($user != $pass)){
echo $flag;
} else {
echo "nonono!";
}
?>
看了半天不就是一个md5绕过吗。
用数组绕过md5的比较。
结果weakphp与反序列化无关就是单纯嘲讽php咯。