首页 > Web开发 > 详细

用原生socket发送HTTP数据包

时间:2019-09-10 22:04:45      阅读:127      评论:0      收藏:0      [点我收藏+]

分享一个写扫描器和POC时的小技巧。 有时候有的漏洞需要一些特殊的数据包,比如说畸形的HTTP头、畸形的Multipart、畸形的chunk包等,此时用编程语言自己的HTTP库可能构造不出这种数据包,此时通常我们需要用原生socket发包,比如:

 1 import socket
 2 
 3 p = b‘‘‘GET /get?a=1 HTTP/1.1
 4 Host: httpbin.org
 5 User-Agent: raw-socket\x00\x01aaa
 6 
 7 ‘‘‘.replace(b‘\n‘, b‘\r\n‘)
 8 with socket.create_connection((‘52.22.188.80‘, ‘80‘), timeout=5) as conn:
 9     conn.send(p)
10     print(conn.recv(10240).decode())

实际情况下你还需要解析HTTP包,但我这里只是一个demo,运行后成功获取结果:

技术分享图片

可见,httpbin.org忽略了User-Agent中\0后的内容。这样,我们用原生socket编写代码,发送了畸形数据包。那么,如果对方使用了HTTPS,我们又如何发送原生数据包呢?其实也很简单,HTTPS实际上就是原生socket外面套一层TLS,所以我们改改代码,访问badssl.com试试:

 1 import ssl
 2 import socket
 3 
 4 context = ssl.create_default_context()
 5 p = b‘‘‘GET / HTTP/1.1
 6 Host: sha512.badssl.com
 7 User-Agent: raw-socket
 8 
 9 ‘‘‘.replace(b‘\n‘, b‘\r\n‘)
10 with socket.create_connection((‘sha512.badssl.com‘, 443), timeout=5) as conn:
11     with context.wrap_socket(conn, server_hostname=‘sha512.badssl.com‘) as sconn:
12         sconn.send(p)
13         print(sconn.recv(10240).decode())

 没有任何问题:

技术分享图片

之前经常看到网上很多人使用socket,还在使用最原始的方式,实际上Python包装了很多有价值的高层API,多多探索,提升你的编程能力。

用原生socket发送HTTP数据包

原文:https://www.cnblogs.com/M0rta1s/p/11503002.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!