深度剖析上传内幕,我们可以通过分析数据包获取web上传漏洞,假如我们再合法的文件明后面跟一个\0之后是什么情况,我们可以构造数据包实现木马上传,也可以作为避免木马侵扰的基本功
现在有很多
Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于
java的
Commons FileUpload
、还有
Struts1.x和
Struts2中带的上传文件功能(实际上,
Struts2在底层也使用了
Commons FileUpload)。在
asp.net中也有相应的上传文件的控件。
虽然现在有很多上传组件可以利用,但是了解
Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理。在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件了。
众所周知,在客户端代码中需要使用
来选择要上传的文件,并上传,代码如上:
<!----><
html
>
<
head
>
<
title
>
upload
<!---->title
>
<
meta
http-equiv
="description"
content
="this is my page"
>
<
meta
http-equiv
="content-type"
content
="text/html; charset=GB18030"
>
<!---->head
>
<
body
>
<
form
action
="servlet/UploadFile"
method
="post"
enctype
="multipart/form-data"
>
<
input
type
="file"
name
="file1"
id
="file1"
/>
<
input
type
="file"
name
="file2"
id
="file2"
/>
<
input
type
="submit"
value
="上传"
/>
<!---->form
>
<!---->body
>
<!---->html
>
从上面的代码可以看出,有两个文件选择框(
file1和
file2),在上传文件时,
标签必须加上
enctype="multipart/form-data"
,否则浏览器无法将文件内容上传到服务端。下面我们来做个实验。在
Servlet
的
doPost
方法中编写如下的代码,如果想使用
asp.net
或其他的语言或技术,也可以很容易实现相应的功能。
<!---->
public
void
doPost(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException
{
java.io.InputStream is
=
request.getInputStream();
java.io.FileOutputStream fos
=
new
java.io.FileOutputStream(
"
d:\\out.txt
"
);
byte
[] buffer
=
new
byte
[
8192
];
int
count
=
0
;
while
((count
=
is.read(buffer))
>
0
)
{
fos.write(buffer,
0
, count);
}
fos.close();
}
上面的功能非常简单,只是通过
request
获得一个
InputStream
对象,并通过这个对象从客户端获得发送过来的字节流(注意,一定要用字节流,因为,上传的文件可能是二进制文件,如图象文件,因此,使用字节流会更通用)。并将这些字节流保存在
D
盘的
out.txt
文件中。然后我们打开
out.txt
,文件的内容如图
1
所示:
图1
由于
out.txt是使用文本形式打开的,并且
file1上传的是
a.jpg(一个图象文件
),因此,显示的是一些乱码。我们可以不用管它们。只需要看看这些内容的头部。我们很快就可以找到规律。每一个文件内容的头部都由“
-----------------------------30514443229777”分隔,然后是这个文件的属性,如下:
Content-Disposition: form-data; name="file1"; filename="a.jpg"
Content-Type: image/jpeg
其中包含了文件选择框的
name属性,还有上传的文件名(
filename字段),要注意的,
firefox在上传时,这个
filename属性值只是文件名,如果使用
IE,就是带路径的文件名,如
D:"a.jpg。
接下来的规则就和
HTTP的头一样了,以一个空行(
"r"n)分隔。后面就是文件的具体内容。现在最关键的文件的结尾,从图
1可以看出,文件的结尾也是“
-----------------------------30514443229777”,因此,可以断定,第一个上传的文件(包括文件头)是夹在两个“
-----------------------------30514443229777”之间的。而“
-----------------------------30514443229777”就是
multipart/form-data协议的分隔符。但这里还有一个最关键的问题。这个分隔符每次上传都不一样,服务端是如何知道每次上传的这个分隔符的呢?
实际上,这个分隔符是通过
HTTP请求头的
Content-Type字段获得,可通过下面的代码输出这个字段值:
System.out.println(request.getHeader("Content-type"));
输出的内容如下:
multipart/form-data; boundary=---------------------------106712230227687
只要在服务端获得
boundary后面的值即可。经过测试,
Content-Type中的分隔符号中的“
-”比实际上传的“
-”少两个,不知是怎么回事。不过这没关系,我们可以认为每一个文件块是以
""r"n—“结尾的,或是直接将从
boundary获得的分隔符加两个“
—”。而最后结尾的分隔符是“
---------------------------106712230227687—”,后面多了两个“
—”。
综合上述,也就是说,一个文件块是以“
---------------------------106712230227687”开头,以“
—”结尾,从图
2可以看出这一切。
图
2
至于剩下的工作,就是按着上面的规则来分析这些字符流了。分析的方法很多。在这里就不详述了。
分享到:
相关推荐
深度剖析BREW实现原理 深度剖析BREW实现原理 深度剖析BREW实现原理
《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web 应用程序中存在的漏洞,防患于未然。 《Web安全深度...
《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web 应用程序中存在的漏洞,防患于未然。 《Web安全深度...
《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web 应用程序中存在的漏洞,防患于未然。 《Web安全深度...
《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web 应用程序中存在的漏洞,防患于未然。 《Web安全深度...
《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web应用程序中存在的漏洞,防患于未然。 《Web安全深度剖析...
C深度剖析C深度剖析C深度剖析C深度剖析C深度剖析
深度剖析双摄像头原理及优势,有望走向普及.docx
深度剖析Spring Boot自动装配机制实现原理(csdn)————程序
c语言深度剖析 c语言深度剖析 c语言深度剖析 c语言深度剖析
深度剖析C语言知识体系原理+实践
本书总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web应用程序中存在的漏洞,防患于未然。
C非常不错的语言深度剖析,适合有一定基础的C语言爱好者阅读