九、HTTP协议及Python HTTP编程

从家用路由器被披露的漏洞情况来看,大部分的漏洞都存在于路由器中的Web服务器程序,这些漏洞往往是由Web服务器程序没有正确解析攻击者发送的请求数据造成的,而这种请求数据往往采用HTTP协议,所以,对于HTTP这样的基础协议,我们非常有必要对其做深入的学习。

学习前,我们首先使用wireshark捕获一下浏览器登录路由器Web管理页面的HTTP协议数据:
在这里插入图片描述
参考上面这个真实的、完整的HTTP协议数据我们可以知道,HTTP请求由3部分组成,分别是请求行、消息报头和请求正文。

HTTP协议请求行

请求行中包含了请求方法(POST)、请求URI(goform/formLogin)、协议版本(1.1)。关于请求方法,常用的无外乎有两种,分别是GET和POST。GET方法也存在对应的请求行、消息报头部分,与POST部分不同的是,GET方法协议的请求正文是作为URL请求的一部分出现的,所以不能用于提交大量的数据。而POST方法则将携带的消息正文,也就是数据部分与URL分开存放的,就如图中的POST请求一样。

HTTP协议消息报头

图中的第二个红色方框中就是消息的报头部分,其中包括了主机IP地址、用户使用的浏览器信息、有的路由器甚至在消息报头中存储了用户登录时使用的Web管理员用户名和密码。

HTTP协议请求正文

请求正文部分往往包含了重要的参数,在上面的图片中包含了Web管理员的用户名和密码(admin:MTIzNDU2)。这里包含的密码被使用Base64做了一次编码,原文对应为"123456",感兴趣的读者可以将密码拷贝到在线加密解密的站点中进行测试:
http://tool.oschina.net/encrypt?type=3
在这里插入图片描述
Python+HTTP编程

以上是HTTP协议的基本格式,对于分析人员来说,除了要了解这些基础知识外,在进行漏洞分析时,我们还应该懂得如何使用像Python这样的脚本语言编写HTTP请求,以便向路由器的Web服务器发送带有畸形或恶意参数的HTTP数据,来验证和分析路由器存在的漏洞。

Python提供了很多方便的HTTP访问的库,我们可以使用urllib和httplib来实现一个HTTP客户端程序。

首先我们使用nc命令模拟一个Web服务器程序:

test@ubuntu:~$ sudo nc -l 80
[sudo] password for test: 

然后使用几行Python代码向这个模拟的Web服务器程序发送HTTP请求:

import httplib,urllib

params = urllib.urlencode({'username':"admin", "passwd":"123456"})
headers = {'Content-Type':"application/x-www-form-urlencoded", "Accept":"text/plain"}

conn = httplib.HTTPConnection("127.0.0.1:80")
conn.request("POST", "index.php", params, headers)

response = conn.getresponse()

print response.status, response.reason
print response.read()

conn.close()   

使用python命令执行这几行代码,就可以在nc命令模拟的Web服务器端看到其接收到的HTTP请求了,其中就包括了HTTP客户端发来的用户名及密码等参数,在实际的漏洞分析过程中,我们很多时候都是以此为基础,通过修改和尝试各种可能的HTTP请求参数来对漏洞进行分析,甚至是在某些参数中附带一些可执行的汇编代码来对漏洞进行验证:
在这里插入图片描述
今天的内容我主要分享了HTTP协议的基础知识,然后通过Python结合httplib和urllib实现了一个HTTP客户端,依次来让读者快速的了解如何进行HTTP编程。

最后,希望本次的分享能够为你带来帮助,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值