zoukankan      html  css  js  c++  java
  • 用原生socket发送HTTP数据包

    分享一个写扫描器和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-socketx00x01aaa
     6 
     7 '''.replace(b'
    ', b'
    ')
     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中后的内容。这样,我们用原生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'
    ', b'
    ')
    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,多多探索,提升你的编程能力。

  • 相关阅读:
    Maven的使用--Eclipse在线安装Maven插件m2e
    Maven的使用--安装
    oracle 函数
    oracle dblink使用
    【JVM】应用CPU冲高问题
    【Git】git操作(转)
    【java】判断两个对象是否相等
    【JDK】JDK自带工具应用——堆分析
    【script】Github上的工具脚本useful-scripts
    【JWT】JWT实现用户认证(转)
  • 原文地址:https://www.cnblogs.com/M0rta1s/p/11503002.html
Copyright © 2011-2022 走看看