网安之web攻防第四十八天笔记

目录

#知识点:

#前置知识:

函数使用:

魔术方法:

#原理-反序列化魔术方法-调用理解

#CTF-反序列化漏洞利用-构造&RCE

#CTF-CISCN2019华北-JWT&反序列化

#代码审计-自动化工具-bandit安装及使用


#知识点:

1、Python-反序列化函数使用

2、Python-反序列化魔术方法

3、Python-反序列化POP链构造

4、Python-自动化审计bandit使用

#前置知识:

函数使用:

pickle.dump(obj, file) : 将对象序列化后保存到文件

pickle.load(file) : 读取文件, 将文件中的序列化内容反序列化为对象

pickle.dumps(obj) : 将对象序列化成字符串格式的字节流

pickle.loads(bytes_obj) : 将字符串格式的字节流反序列化为对象

魔术方法:

__reduce__() 反序列化时调用

__reduce_ex__() 反序列化时调用

__setstate__() 反序列化时调用

__getstate__() 序列化时调用

这个py的反序列化和php的差不多,都有这个魔术方法。下面直接上案例

#原理-反序列化魔术方法-调用理解

这个主要就是对这些魔术方法的调用了解一下

这个是__reduce__()魔术方法的调用,这个魔术方法是反序列化的时候调用,这里也是成功的调出了电脑的计算器。但这个魔术方法要触发还有个条件,就是需要有return,如果没有的话就会报错。__reduce_ex__()和它的调用一样,也需要有return。

执行之后:

接着是__setstate__()魔术方法的调用,这个也是在反序列化的时候被调用,如果把反序列化那一行代码注释掉,则不会弹出计算器。

最后一个则是__getstate__()魔术方法的调用,这个是在序列化的时候调用,跟前面三个不一样。

那么漏洞是怎么产生的呢,比如下面直接执行的话,他会打开电脑的计算器,但如果我们把calc改成ipconfig,那么他就会执行ipconfig。这就是漏洞的产生。

另外__init__这个是用来初始化的,当我们调用这个类去传参,传的参数就直接给这个初始化函数__init__。

#CTF-反序列化漏洞利用-构造&RCE

环境介绍:利用Python-flask搭建的web应用,获取当前用户的信息,进行展示,在获取用户的信息时,通过对用户数据进行反序列化获取导致的安全漏洞!

这个题在资源库中,直接用pycharm打开即可(本来文件名不叫app.py,前面有个前缀,但直接运行打不开,要把文件名改成app.py。)。我们分析一下:首先可以看到里面有反序列化函数,那么就可以想到之前讲的魔术方法,只要出现反序列化就执行的魔术方法。

番外知识,如果想要把flask搭建的网站在同局域网下访问的话,就需要公开网站,不然默认的是只能在本机访问。直接在pycharm的终端执行 flask run --host=0.0.0.0即可。就可以让虚拟机去访问。

并且这里是运用了flask搭建了一个web网站,可以看到直接访问提示的是guest,那么我们可以利用魔术方法去执行命令,也就是rce漏洞。

首先去构造user的值,因为它是接受cookie的user值,并且先进行base64解码然后再进行反序列化。那我们构造payload就要反着来,先进性序列化再base64编码即可。这里直接找刚才我们学过的出现反序列就会触发的魔术方法,这里就用__reduce__()了。

然后把构造的payload,通过抓包放到cookie里面,这里也是用的虚拟机来模拟攻击机,成功的调出了计算器。

那么我们把命令改一下,尝试反弹shell。也就是说用kali模拟攻击机,用真实机模拟受害者,把受害者的cmd权限反弹到自己的服务器。

步骤跟刚才一样,把得到的payload粘贴过去就行。也是成功的反弹shell。但这里用的是nc这个工具,如果对方主机没有nc那也是不行的,在棱角社区里面有很多反弹shell的命令,可以看看,总会有一个你用的到的。

注意:这里你构造payload的py版本要和目标主机的一致,不然可能会出一些问题,而辨别版本最简单的方法就是print。py2的print不带括号,而py3的print带括号,因为py3把print当成了函数。

也可以不用burp去抓包,直接在后面写点命令,在pycharm里面run之后直接就会自动反弹shell,相当于省去了抓包这一步。

#CTF-CISCN2019华北-JWT&反序列化

流程:通过提示->寻找LV6->购买修改支付逻辑->绕过admin限制需修改jwt值->爆破jwt密匙->重组jwt值成为admin->购买进入会员中心->源码找到文件压缩源码->Python代码审计反序列化->构造读取flag代码进行序列化打印->提交获取

首先直接在buuctf上面直接搜索CISCN2019,全名为“[CISCN2019 华北赛区 Day1 Web2]ikun”

打开之后,可以注意到让我们找lv6,这里我们可以右键检查会发现,在js代码中,每个v等级都叫lv.png,那么我们可以利用脚本直接找哪一页有这个lv6.png即可。脚本在资源库中。名为ikun-lv6.py

注意:ikun-lv6.py记得py3执行

ikun-flag.py记得py2执行(提供的源码采用py2开发,payload生成也一样)

py脚本:

最终在181页停了下来,那么lv6就在181页,直接找过去。

当我们注册一个账户发现这个资金只有一千,但这个需要一亿多,肯定是买不了了。那就尝试抓包,看看能不能修改一些东西。这里发现它有优惠券,那抓包之后把0.8改成0.00000008,那肯定是可以购买成功了。

但改了之后提示只能管理员访问,那这里肯定有验证身份的东西,

cookie里面果不其然有jwt,这个我们之前学过,类似cookie和session。有三部分组成,分别是header.claims.signature。把它的值放到网站JWT进行解码就会发现,username是xiaopei不是admin,我们改成admin之后还要知道它的密钥,也就是signature

通过工具c-jwt-cracker把密钥爆破出来,获得密钥为“1Kun”,然后把username改成admin,密钥填进去,得到的jwt的值替换一下,就可以成功了。

到这一步之后,页面上的东西点不了了,点那个“一键成为大会员”没反应,于是我们右键源代码,果然发现了端倪。

这里把zip文件下载下来,解压之后放到pycharm里面,这才到咱今天学的py反序列化的地方。前面只是为了找到这个源代码。

进到源代码里面之后我们直接输入py的反序列化函数去全局搜索,果然还是找到了,这里接受的了become参数,先进行url的解码,然后进行反序列化,那我们构造payload的话就反着来,就是先序列化然后url编码。

这里有一点跟之前不一样的就是这里用的是eval执行python代码,而之前的是用的system执行的系统命令。这里生成payload之后看怎么触发这个payload

这里直接来到init这个文件下,最后一个就是,并且你会发现这个路径就是之前那个“一键成为大会员”的那个页面,直接post提交become等于刚才的payload。就得到flag了。

也可以直接右键检查,找到这个name等于become这个地方,把value改成payload,这个值就是become的值。然后点击一键成为大会员,flag就出来了。

#代码审计-自动化工具-bandit安装及使用

参考:Welcome to Bandit — Bandit documentation

安装:pip install bandit

linux:

安装后会在当前Python目录下bin

使用:bandit -r 需要审计的源码目录

windows:

安装后会在当前Python目录下script

使用:bandit -r 需要审计的源码目录

这里我们拿windows主机来做个示范,对刚才拿到的www文件进行审计。

首先在scripts目录下打开cmd,输入以下命令即可进行审计。

这里也是直接找到了密钥为1Kun,

还有反序列化漏洞,也是直接就审计出来了。

更多相关知识参考链接bandit

最后附上本节课思维导图:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaopeisec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值