电子商务网站建设与管理感想,阿勒泰建设招聘网站,php主做哪种类型网站,创建团购网站[CISCN2019 华东南赛区]Web4 文章目录 [CISCN2019 华东南赛区]Web4掌握知识解题思路代码分析正式解题 关键paylaod 掌握知识
根据url地址传参结构来判断php后端还是python后端#xff1b;uuid.getnode()函数的了解#xff0c;可以返回主机MAC地址十六进制#xff1b;pyt…[CISCN2019 华东南赛区]Web4 文章目录 [CISCN2019 华东南赛区]Web4掌握知识解题思路代码分析正式解题 关键paylaod 掌握知识
根据url地址传参结构来判断php后端还是python后端uuid.getnode()函数的了解可以返回主机MAC地址十六进制python网站源码多半处于/app.app.py代码审计session欺骗session的加解密
解题思路
打开题目链接发现有一个超链接可以点击点击之后发现实现了跳转来到了百度界面看url地址发现是远程文件包含的可能但懒得开服务器测试了试一试是否可以本地文件包含。包含/etc/passwd成功回显内容确认可疑文件包含。尝试包含/flag文件直接显示黑客 尝试查看网站源码一开始还以为依旧是php的后端查看/var/www/html/index.php发现页面返回无响应想着去看一看url给出的文件名发现只有read并没有后缀了解了一下发现这是写路由形式是python后端的标志。记住一个知识点url/read?idxxxx这种在url和参数中间又会有一段字符串的可以考虑是写了路由不是php后端可能是python后端。 那就去读取一下python网站的默认源码文件/app/app.py成功回显源码内容简单看了一下感觉是session欺骗的题目又生成了session私钥又给了session字段信息获得flag还需要修改其中的字段信息很明显的session欺骗考察的逻辑
# encoding:utf-8
import re, random, uuid, urllib
from flask import Flask, session, requestapp Flask(__name__)
random.seed(uuid.getnode())
app.config[SECRET_KEY] str(random.random()*233)
app.debug Trueapp.route(/)
def index():session[username] www-datareturn Hello World! a href/read?urlhttps://baidu.comRead somethings/aapp.route(/read)
def read():try:url request.args.get(url)m re.findall(^file.*, url, re.IGNORECASE)n re.findall(flag, url, re.IGNORECASE)if m or n:return No Hackres urllib.urlopen(url)return res.read()except Exception as ex:print str(ex)return no responseapp.route(/flag)
def flag():if session and session[username] fuck:return open(/flag.txt).read()else:return Access deniedif __name____main__:app.run(debugTrue,host0.0.0.0)代码分析
又是老朋友随机数了根据随机数种子生成随机数由于伪随机数漏洞只要确保随机数种子一样版本一样次序一样使用相同的随机数生成代码就能生成同样的随机数所以这里关键的就是uuid.getnode()函数的返回值了。搜索了一下发现函数返回结果为MAC地址的十六进制形式那也很好办之前学习ssti计算PIN码也就遇到读取MAC文件继续文件包含读取MAC地址/sys/class/net/eth0/address。根据源码的文件头注释猜测是python2的可能性大一点因为去在线网站查看了一下相应的头部信息。
random.seed(uuid.getnode())
app.config[SECRET_KEY] str(random.random()*233)/read路劲现在已经没什么用处了这里过滤了flag也就不能直接文件包含读取flag.txt了。/路径是给session字段赋值用户信息的
app.route(/)
def index():session[username] www-datareturn Hello World! a href/read?urlhttps://baidu.comRead somethings/aapp.route(/read)
def read():try:url request.args.get(url)m re.findall(^file.*, url, re.IGNORECASE)n re.findall(flag, url, re.IGNORECASE)if m or n:return No Hackres urllib.urlopen(url)return res.read()except Exception as ex:print str(ex)return no response其实/flag字段也很好理解就是要修改session字段的用户为fuck只需要抓取/flag的请求包将其的session字段使用加解密脚本和私钥进行加解密修改好用户信息之后将新的session字段替换一下发送包即可得到flag。这道题关键也就在确定python后端读取/app/app.py的网站源码信息
app.route(/flag)
def flag():if session and session[username] fuck:return open(/flag.txt).read()else:return Access denied正式解题
整体分析结束其实还可以后面也就是简单的session欺骗过程了。开始抓包获得/flag界面的session字段其实session也都一样为了直接替换的flag方便。直接使用加解密脚本进行对session伪造的操作。由于加密脚本使用命令行会报错所以就使用pycharm自带的功能可以传递形参来替换命令行执行的方式得到加密的session字段 替换原来的session字段发送包成功拿下flag 关键paylaod
python网站源码 /app/app.pyMAC地址文件路径 /sys/class/net/eth0/addresssession解密脚本传参 encode -s 82.684855651 -t {username:fuck}私钥生成脚本
import randommac6ed1b6c952d6
random.seed(int(mac,16))
key str(random.random() * 233)
print key