大数跨境

[CTF每日一题]FBCTF-Products Manager

[CTF每日一题]FBCTF-Products Manager Linus SEO海外流量玩家
2019-07-02
10
导读:FBCTF 刚结束不久,玩了几题刚不动,最近几天复现一哈~开更第一篇,难度星级⭐⭐

前言

2019 FBCTF 刚结束不久,玩了几题刚不动,最近几天复现一哈~开更第一篇,难度星级⭐⭐,主要是知识点需要注意

2019FBCTF - Web1 - products manager

题目描述

Come play with our products manager application!

http://challenges.fbctf.com:8087

Written by Vampire

(This problem does not require any brute force or scanning. We will ban your team if we detect brute force or scanning).

过来玩一哈我们的产品管理应用吧!作者是 Vampire。该题不需要爆破和扫描,如果被发现的话我们会办了你。

干它!

题目里面有源码下载,先不急打开源码,看看系统有啥功能先:

查看 TOP 5 产品:

添加一个产品界面,需要产品名和密钥:

通过产品名和密钥查看:

OK,十分清晰了。见到 PHP 源码,不管37二十八先放到 Seay 源代码审计系统里面过一遍先:

好的,再见。

自动化工具虽好,可不要 贪杯 过于依赖啊,打开 VScode 看一波代码先:

数据库操作的相关代码都使用了预编译操作,因此存在常规 SQL 注入的情形很小了,注意到没有过滤:

看 db.php, 发现 flag 存放在了 facebook 这个产品的 描述 里面,因此,我们需要想办法把这一行整出来。去查看产品查询处看看相关操作吧:

此处利用的还是 db.php 中的查询操作,刚刚已经说过没有 SQL 注入问题,我们把目光移到 get_product 操作,这里没有鉴权,而是依赖于上一步是否查询成功。注意到建表语句中的 name 这个字段不是唯一字段,而 get_product 函数中使用了 fetch_assoc() 函数返回查询结果中的一行,那么我们是否可以伪造一个 name 为 facebook 的产品绕过检查 secret 的那一步,进而 SELECT 出 facebook 呢?

啊,果不其然提示失败了……太可恶了,在 add.php 39行中先检查了一遍 product_name,有点难受。

思来想去想不出来,睡了一觉,梦中有个头上发着绿光的秃顶大佬告诉我:“用户参数没有经过如 trim 等过滤操作时,MySQL 有一个非常给力的特性:

当值后面有一个或多个空格的时候,MySQL 的 CHAR 类型会把 'neverSec' 和 'neverSec '(后面有个空格)当作是一样的东西,具体为什么请看文末参考文档 CHAR/VARCHAR数据类型特性[1]。你懂了吗?”

大佬的一席话把我震醒了,打开赛题地址,增加产品界面中输入 facebook(后带几个空格看你心情,多敲几个),POST 参数如这样:name=facebook%20%20&secret=neverSec1235&description=3

然后到查询界面,name 填入 facebook,secret 填入 neverSec1235,flag 就出来啦

总结

嗝,该题足够 easy,利用的是 MySQL 中的一个小特性达成了注入效果,赶紧记下来!

环境搭建

当前环境已经挂了QWQ http://challenges.fbctf.com:8087

但是可以自行搭建:

1.下载源码,放到 PHPstudy,MySQL 建议选择 5.7 版本2.db.php 处注释为建表语句,自行修改,添加数据库啥的不用说了吧3.添加 config.php,指定 MySQL 的相关配置4.完事,开搞吧!源码和 Dockerfile 见:https://github.com/fbsamples/fbctf-2019-challenges

References

[1] CHAR/VARCHAR数据类型特性: https://dev.mysql.com/doc/refman/5.7/en/char.html


【声明】内容源于网络
0
0
Linus SEO海外流量玩家
1234
内容 24
粉丝 0
Linus SEO海外流量玩家 1234
总阅读136
粉丝0
内容24