bugkuweb

1.滑稽

F12查看即可,又是考视力= =

滑稽


2.计算器

小学算数,答案是111,但是输入1之后就输入不进去了,直接改前端代码

计算器

把maxlength删了或者把1改大一点就行了,提交


3.GET

GET

简单的代码审计,直接GET传参

1
?what=flag

GET2


4.Simple_SSTI_1

页面提示我需要绕过一个叫flag的参数,然后F12说:你知道,在flask中,我们经常设置一个secret_key变量。

![Simple_SSTI_1.1]Simple_SSTI_1.1.png)

flask的模板注入:(注意:这里的SECRET_KEY需要大写)

1
?flag={{config.SECRET_KEY}}

Simple_SSTI_1.2

Flask是一个使用Python编写的轻量级Web应用框架。它的设计目标是简单明了,易于扩展和维护。Flask提供了基本的Web开发所需的组件,如路由、请求和响应处理、会话管理、模板渲染等,同时还支持各种第三方扩展和插件,可以轻松地实现各种复杂的Web应用开发。Flask框架也因其灵活性和简易性而广受欢迎,被许多Web开发者用于构建Web应用和API。Flask是一个使用Python编写的轻量级Web应用框架。它的设计目标是简单明了,易于扩展和维护。Flask提供了基本的Web开发所需的组件,如路由、请求和响应处理、会话管理、模板渲染等,同时还支持各种第三方扩展和插件,可以轻松地实现各种复杂的Web应用开发。Flask框架也因其灵活性和简易性而广受欢迎,被许多Web开发者用于构建Web应用和API。

flask使用jinjia2渲染引擎进行网页渲染,当处理不得当,未进行语句过滤,用户输入,会导致渲染出恶意代码,形成注入

注:SSTI 就是服务器端模板注入(Server-Side Template Injection)当前使用的一些框架,比如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式,用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。

漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。

详见


5.POST

1
2
3
4
$what=$_POST['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';

比较简单,post方式提交what变量即可:

POST

提交就得到flag


6.矛盾

1
2
3
4
5
6
7
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}

GET方式获得num,先判断num不是数字,然后num还要等于1,才输出flag

想了一下,写出以下payload:num=1 and 1

以此类推就是条件判断就行了,写num=1 and 1or 1这种也行,交上去就有flag了


7.alert

进入场景是一个弹窗,写着flag就在这:

alert1

F12或者ctrl+u看见一串编码:

1
flag{3a4468f259075269f634de4ca4a1f60b}

直接放burp里Smart decode,html解密就得到flag:

alert2


8.你必须让他停下

进入页面,两行字:

I want to play Dummy game with others£¡But I can’t stop!

Stop at panda ! u will get flag

我想到的是,burp直接拦呗,放到repeater模块一直send:

你必须让他停下1

这里每次刷新得到的的页面都不同,故返回页面也不一样,10.jpg是flag所在的包。


9.头等舱

啥也没有,F12,ctrl+u都没有,抓个包看看:

头等舱

我一想,既然包里有,那F12网络一栏应该也有,这里是肯定的,这里就不演示了。


10.eval

页面给出了代码:

1
2
3
4
5
6
 <?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>

先学习一下:var_dump() 函数用于输出变量的相关信息。

file() 函数把整个文件读入一个数组中。

命令执行嘛,先看看全局变量。构造?hello=$GLOBALS

eval1

没看见有flag相关的变量,那应该在文件里,构造?hello=file(‘flag.php’)

eval2


11.网站被黑

题目描述:网站被黑了,黑客会不会留下后门

看样子是提示我们找后门,那就御剑扫一波,发现index.php和shell.php

访问index.php和之前没啥区别,看看shell.php:

网站被黑1

应该是后门密码,万能密码试了一下,不行,页面提示不是自己的马不要乱骑!

还挺有意思,直接burp暴破,字典里的密码都不对,在网上看了一下wp,密码是hack

然后就拿到flag了


12.本地管理员

打开页面是这样的:

本地管理员1

试试弱口令,页面回显是“**IP禁止访问,请联系本地管理员登陆,IP已被记录.**”

看样子要改ip:X-Forwarded-For:127.0.0.1

发过去之后提示:Invalid credentials! Please try again!

应该是密码错了,F12看一下,发现了一串字符,应该是base64编码

本地管理员2

dGVzdDEyMw==

burp解码一下:是test123,这应该是密码,提交试试

本地管理员3


13.变量1

1
2
3
4
5
6
7
8
9
10
11
12
13
flag In the variable ! 
<?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){ // // 这个正则表达式的意思是匹配任意 [A-Za-z0-9_] 的字符,就是任意大小写字母和0到9以及下划线组成
die("args error!");
}
eval("var_dump($$args);");
}
?>

先学一下:

isset()函数用于检测变量是否已设置并且非 NULL。

prep_match: 用于执行一个正则表达式匹配。

error_reporting(0)关闭错误显示。

还是老规矩,先看看全局变量,虽然不让传’$’,但是在var_dump()函数中给出了‘$’,还是挺有意思的:

变量1


14.Simple_SSTI_2

进入页面,提示:You need pass in a parameter named flag

get传参以读取系统文件

1
?flag={{config.__class__.__init__.__globals__['os'].popen('ls /').read() }}

Simple_SSTI_2.1

app这个文件夹有点奇怪,进去看看

1
?flag={{config.__class__.__init__.__globals__['os'].popen('ls /app').read() }}

发现有flag,直接cat

1
?flag={{config.__class__.__init__.__globals__['os'].popen('cat /app/flag').read() }}

Simple_SSTI_2.2


15.Flask_FileUpload


16.game1

让我玩游戏,先玩两把摸个鱼,然后看了看源码,没啥收获,直接在游戏结束时抓包,修改score的值,但是即使我改的了很高的分数,依然是失败game11

那就没这么简单了,看了一下大佬的wp,给出的思路是:说明有其他的参数来验证分数的真实性;这个参数可能是 sign或者可能在 cookie里。

game2

很明显,当分数不同时不同的包差距在于 score和 sign

对比sign发现 sign是由 zM + xxx + == 构成

zM是很好看出来的,等号那有点难看,那好办,去base64解码看看就知道了,MjU=解密出来是25,MjU==出来是25=,所以后面俩等号是固定的

那就好办了,把分数和sign同时改高就行了,这里我改成9999:

game3

这里我还试了一下单改sign,发现不行,说明两个参数是同时校验的。

做完之后突然想到能不能用intruder同时暴破两个地方,答案是肯定的,我写了个脚本,给出了300-1000之间的数字,然后为了实验成功,我在最后加了9999,intruder选择Pitchfork模式,Payload Sets选择Custom iterator,在Payload Processing选择Add,选base64加密,也能成功:

game14

总结:

1.游戏类的一般都是通过修改分数来的,要嘛改高(999999) ,要嘛改低(-999999)

2.控制分数的参数可能不止一个,如果有加密的就得尝试解密。一般就多试几次,找到因分数不同而改变的参数,然后对该参数进行分析


17.bp

提示:密码top1000?z?????

TOP1000的字典跑一下,没区别

bp1

发现每个包都有一段js代码,这时需要用到Intruder中的Grep-Match功能:该功能可以帮我们分析Response中是否含有给定字符串。

Intruder模块Options,打开Grep-Extract

Add一条code: ‘bugku10000’

bp2

zxc123应该就是密码了,登录即可。


18.社工-伪造

一进来是这种

社工-伪造1

皮一下

社工-伪造2

不知道干啥,看看空间

社工-伪造3

说只有他男朋友在qq空间问他,他才能交出flag,试试暴破一下,我猜如果是他男朋友的号,包会有所不同,试了一下,速度太慢,然后server error了,看下面评论说要登自己qq,试了一下

社工-伪造4

还真是,然后把自己的QQ昵称改成他男朋友的:

社工-伪造5

不愧是社工的题,我的评价是,我还是脑洞不够大,我还是不够BT,没想到把昵称改了。


19.社工-初步收集

点下载辅助,下载了个exe文件,被拦了,说可能损坏电脑,仍要运行就行:

社工-初步收集1

这里的话,涉及一个知识点就是遇到这种开挂的软件或者别的软件时,我们可以查看流量的走向。

打开wireshark,监听wlan,然后再开始刷

社工-初步收集2

也算是考眼力吧,拿到账号密码了以为到此结束了,没想到不对,看着像base64编码,解码看看

bugkuku@163.com

XSLROCPMNWWZQDZL

怪不得有bugku@163的流量包,去网易邮箱看看,但是账号密码登录失败了,这里还有一个知识点:邮箱登录的方式,主流是两种,一种是密码登录,一种是授权码登录,官网提供的邮箱登录一般是账号+密码登录,第三方邮件系统登录的一般都是客户端+授权码登录。
很显然,我们解出来的那串base64不是密码,那么应该就是授权码了,网上wp是用foxmail,还有用QQ邮箱手机版的,都成功登录了,找到了一个邮件:

社工-初步收集3

有账号密码,御剑扫后台发现了登陆界面:

社工-初步收集4

去登录就行了。



bugkuweb
http://example.com/2023/05/05/bugkuweb/
作者
想有双手
发布于
2023年5月5日
许可协议