基于libcap的网络包分析问题集锦(http post方式上传文件)

来源:互联网 发布:vr图片制作软件 编辑:程序博客网 时间:2024/05/21 07:00

1. 关于http post方式中boudary

Content-type一行中有boundary关键字,=号后面就是boundary的值,如

boundary=---------------------------16541483331115

---------------------------16541483331115是分隔符,分隔多个文件、表单项。其 中16541483331115是即时生成的一个数字,用以确保整个分隔符不会在文 件或表单项的内容中出现。Form每个部分用分隔符分割,分隔符之前必须 加上"--"着两个字符(--{boundary})才能被http协议认为是Form的分隔符, 表示结束的话用在正确的分隔符后面添加"--"表示结束。

2. 以boundary来分隔form时,如果有多个form,该如何得出上传文件长度?

答:因为从POST包中Conteng-Length后面就知道上传包的长度,但这部分长度包括以boundary的值开始到boundary结束的长度,有多个form的话,中间就有多个boundary

POST /cgi-bin/recv_post_file.cgi HTTP/1.1

Host 192.168.0.129

User-Agent Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3

Accept-Encoding gzip, deflate

Connection keep-alive

Referer http://192.168.0.129/cgi-bin/show.cgi

Cookie FOSWIKIPREF=%7CTwistyPlugin_loginhelp%3D1

Content-Type multipart/form-data; boundary=---------------------------23986132909161

Content-Length 1624

----------------------------23986132909161

Content-Disposition: form-data; name="file_name";filename="start.ica"

Content-Type: application/x-ica

XXX

XXX

...

XXX

-----------------------------23986132909161--

其中Content-Length 1624就是指红色部分的所有内容的总长度,如果只有一个form,可以直接剔除红色部分的头部和尾部来得到正文数据的长度,但是如果又多个form,比如下面这种情况

----------------------------23986132909161

Content-Disposition: form-data; name="file_name";filename="start.ica"

Content-Type: application/x-ica

XXX

XXX

...

XXX

-----------------------------23986132909161

Content-Disposition: form-data; name="user_name"

Xxx

-----------------------------23986132909161

Content-Disposition: form-data; name="upload"

xxx

-----------------------------23986132909161--

这样的情况,要剔除头部和boundary来得到正文数据内容的长度就要麻烦一点。

3. 如何确定数据包的开始及结束位置?

答:数据包以“POST”开始,结束之后的下一个包就是以“HTTP/1.1”或“HTTP/1.0”开始的响应包,所以根据这两个特征包可以判定整个数据的开 始及结束。

4. 多个文件从不同地方上传时,如何根据监听到的网络包信息,判断某个文件是否上传完?

答:以两个文件上传为例,如下的两种情况:


如何来匹配一个文件的开始上传和上传完成,从而得出整个上传时间?根据源ip和源port来配对,每个网络包的ip头有源地址和目的地址,tcp头有源端口和目的端口号,监测到一个文件开始上传的网络包时,以源ip和源port唯一标识这个文件(方便起见,将ipport结合在一起形成一个字符串,如192.168.0.129:56793,然后计算这个字符串的hash值,放到hash表里,以hash_key来标识),继续监听网络包,如果监听到一个文件上传完成,根据当前包的源ip和源port计算hash值,查找hash表,看是否有对应的hash_key,从而完成配对,记录信息的时候就可以记录包的时间,从而在配对的时候就知道了开始时间和结束时间,从而得出整个上传时间。

5. 如何区分不同上传文件的三次握手?

答:每个包的tcp头里有flag标识信息,如FINSYNRSTPUSHACK等,三次握手的第一个包包含了SYN,第二个包包含了SYNACK,第三个包是ACK应答,根据这几个包的特征就可以判断出是否是三次握手(为了进一步确认,可以检查每个包的源ipport和目的ipport)。

6. 多个文件同时上传时,网络包中各文件的先后顺序,是每一个包随机的传某个文件还是,一段连续的包传文件1,接下来的一段连续的包传文件2,然 后依次交替?

答:经验证,网络包的顺序是按第二种方式,也就是交替的一段连续的包传不同的文件,每次多少个连续的包不清楚。

7. 如何区分同一个上传文件的网络包之间的时间间隙,比如某个文件上传一段时间之后暂停(期间有其他文件在上传),后来再续传时?

答:两个包的时间间隙如果太长,有可能是网络的问题,也有可能是上传暂停等,为此,就需要监测两个包的时间间隙。这里区分两个概念,“相邻网络包”和“同一个文件的相邻网络包”,前者就是按照网络包的时间顺序,紧挨着的两个包(一前一后),后者就是多个文件同时上传时,同一个文件的两个逻辑上相邻的包,如下所示:


监测文件的相邻网络包的时间间隙的方法:同问题3中所述,采用hash表,以源ipport的字符串生成的hash_key标识某一个文件,hash表里记录了这个文件上一个包的时间,在根据这个文件的当前包的时间,两个时间相减即得“同一文件的相邻网络包的时间间隙”,根据这个时间间隙大小做不同的处理,每次都更新该文件的上一个包的时间(就是之前的处理完后,将当前包的时间值赋给hash表中该文件的上一个包的时间)。

原创粉丝点击