黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第五章 WEB黑客(1)WEB库

黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第五章 WEB黑客(1)WEB库



写在前面

分析web应用程序的能力对于任何攻击者或渗透测试人员来说都是一项绝对关键的技能。在大多数现代网络中,web应用程序呈现出最大的攻击面,这也是访问web应用程序本身的最常见途径。
我们会发现许多用Python编写的优秀web应用程序工具,包括w3af和sqlmap。坦率地说,像SQL注入这样的主题已经烂大街了,可用的工具已经足够成熟,我们不需要重新造轮子。相反,我们将探讨Python与web交互的基础知识,然后基于这些知识创建侦察和暴力工具。通过创建一些不同的工具,我们将会学习到构建特定攻击场景所需的任何类型的web应用程序评估工具所需的基本技能。
在本章中,我们将研究三种攻击web应用程序的场景。在第一个场景中,假设我们已经知道目标使用的web框架,并且该框架碰巧是开源的。web应用程序框架包含许多文件和目录。我们将创建一个地图,在本地显示web应用程序的层次结构,并使用该信息定位实际目标上的真实文件和目录。在第二个场景中,我们只知道目标的URL,因此我们将使用单词列表生成目标上可能存在的文件路径和目录名的列表,从而强制使用相同类型的映射。然后,我们将尝试连接到针对活动目标的可能路径的结果列表。在第三个场景中,我们只知道目标的基本URL及其登录页面。我们将检查登录页面并使用单词列表强行登录。

WEB库

首先,我们将介绍可用于与web服务交互的库。在执行基于网络的攻击时,我们可能正在使用自己的计算机或正在攻击的网络中的计算机。如果我们在一台受到威胁的机器上,那必须将就一下,这可能是一个基本的Python2.x或Python3.x安装。接下来我们将会介绍在在这类情况下,使用标准库可以做些什么。假定我们使用的都是最新的软件包。

用于Python 2.x的urllib2库

这一节我们将会介绍用Python2.x编写的代码中使用的urllib2库。这是一个标准库,与编写网络工具的socket库很相似,常用来创建与web服务交互的工具。让我们看一下向No Starch Press网站发出非常简单的GET请求的代码:

import urllib2
url = 'https://www.nostarch.com'
response = urllib2.urlopen(url)
print(response.read())
response.close()

上述代码展示了向网站发出GET请求的最简单示例。我们向urlopen函数传递一个URL(默认是发送SET请求),该函数返回一个类似文件的对象,允许我们读回远程web服务器响应的内容。由于我们只是从No Starch网站获取原始页面,因此不会执行JavaScript或其他客户端侧脚本。
然而,在大多数情况下,我们需要对如何发出这些请求进行更细粒度的控制,包括能够定义特定的http头、处理cookie和创建POST请求。urllib2库包含一个Request类,它为您提供了这种级别的控制。以下示例展示如何使用request类和定义自定义User Agent HTTP头来创建相同的GET请求:

import urllib2
url = 'https://www.nostarch.com'
headers = {'User-Agent': 'Googlebot'}

request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)

print(response.read())
response.close()

Request对象的构造与前一个示例略有不同。为了创建自定义头,我们定义了一http头的字典,允许我们设置要使用的http头的键和值。在本示例中,我们将使Python脚本看起来像是Googlebot。然后,我们创建Request对象并传入url和headers字典,再将Request对象传递给urlopen函数调用。这将返回一个普通的类文件对象,我们可以使用它从远程网站获取数据。

用于Python 3.x的urllib库

在Python3.x中,标准库里面包含了urllib包,它将urllib2包中的功能拆分为urllib.request和urllib.error子包。另外,urllib中还通过子包urllib.parse增加了URL解析功能。
在使用此包发送HTTP请求时,可以使用with语句将请求用作上下文管理器。结果响应包含一个字节类型的字符串。以下是如何发出GET请求:

import urllib.parse
import urllib.request

url = 'http://boodelyboo.com'
with urllib.request.urlopen(url) as response:  # GET
    content = response.read()

print(content)

上述代码中,我们导入所需的包并定义目标URL。然后,使用urlopen方法作为上下文管理器,发出请求并读取响应数据。
如果要创建POST请求,我们会将数据字典传递给请求对象,采用字节编码。数据字典中应包含目标web应用程序所需的键值对。在下面的示例中,信息字典将会包含登录目标网站所需的凭据(用户、密码):

info = {'user': 'tim', 'passwd': '31337'}
data = urllib.parse.urlencode(info).encode() # data is bytes type now

req = urllib.request.Request(url, data)
with urllib.request.urlopen(req) as response:  #POST
    content = response.read()

print(content)

上述代码中,我们对包含登录凭据的数据字典进行编码,使其成为字节对象;然后将其放入传输凭据的POST请求中,并接收对登录尝试的web应用程序的响应。

requests库

Python官方文档建议使用requests库来实现更高级别的HTTP客户端接口,所以requests不在标准库中,需要我们自行安装,直接执行pip install requests命令即可进行安装,然鹅我的kali上已经装好了,我猜是最新的python3已经自带了这个库,或者kali自带的python3包含了这个库(反正两年前我使用python3的时候没有自带requests库),如下图。
在这里插入图片描述
requests库是很有用的,它可以自动处理cookie,正如我们将要在下面的每个示例中看到的那样,特别是在我们攻击WordPress网站的示例中,这将会在后面的“强制HTML表单验证”的示例中讨论。接下来我们执行以下操作发出一个HTTP请求:

import requests
url = 'http://boodelyboo.com'
response = requests.get(url) # GET
data = {'user': 'tim', 'passwd': '31337'}
response = requests.post(url, data=data)  # POST
# response.text is string type, and response.content is tytestring type
print(response.text)

在上述代码中,如果我们需要打印文本字符串就使用response.text属性,如果要打印自己字符串就使用response.content属性。

lxml和BeautifulSoup包

一旦我们有了HTTP响应,lxml或BeautifulSoup包都可以帮助我们解析相关的内容。在过去几年里,这两个包变得更加相似;我们可以将lxml解析器与BeautifulSoup包一起使用,也可以将Beautiful Soup解析器和lxml包一起使用。我们将会看到其他黑客使用其中的一个或另一个的代码。Lxml包稍快一些,而BeautifulSoup包具有自动检测目标HTML页面编码的逻辑。在这里,我们将使用lxml包,首先使用pip安装软件包,我发现这两个包在我的kali上也是安装好的,确实应该是kali或者最新的python自带的,我没有安装过
在这里插入图片描述
假设我们将http请求返回的HTML内容存储在名为content的变量中。使用lxml,我们可以检索内容并解析链接,如下所示:

from io import BytesIO
from lxml import stree

import requests

url = 'https://nostarch.com'
# GET
r = requests.get(url)
# content is of type 'types'
content = r.content

parser = etree.HTMLParser()
#  Parse into tree
content = etree.parse(BytesIO(content), parser=parser)
#find all 'a' anchor elements.
for link in content.findall('//a'): 
    print(f"{link.get('href')} -> {link.text}")

上述代码中,我们从io模块导入BytesIO类,因为我们在解析HTTP响应时需要使用字节字符串作为文件对象。接下来,我们正常执行GET请求,然后使用lxml的HTML解析器来解析响应。解析器需要类似文件的对象或文件名。BytesIO类使我们能够使用返回的字节字符串内容作为类似文件的对象传递给lxml解析器。我们使用一个简单的查询来查找返回内容中所有的标签a(这里面包含了链接),并打印结果。每个a标签定义一个链接,并且其中的href属性指定链接的URL。
需要注意的是,上面最后一行代码中f字符串的使用,在Python 3.6及更高版本中,可以使用f字符串创建包含变量值的字符串。这允许我们更加轻松地在字符串中包含函数调用的结果(例如这里的link.get(‘href’))或普通值(例如这里的link.text)。
使用BeautifulSoup,我们可以用这段代码进行同样的解析。如您所见,该技术上与使用lxml的示例非常相似:

from bs4 import BeautifulSoup as bs
import requests
url = 'http://bing.com'
r = requests.get(url)
# parse into tree
tree = bs(r.text, 'html.parser')
# find all 'a' tag elements.
for link in tree.find_all('a'):
    print(f"{link.get('href')} -> {link.text}")

语法几乎相同。我们将内容解析为树,遍历链接(a标签),并打印目标(href属性)和链接文本(link.text)。
如果我们在一台受到威胁的机器上工作,我们可能会避免安装这些第三方软件包,以避免产生太多网络噪音,因此我们只能使用手头的任何东西,这可能是一个基本的Python2或Python3安装,这意味着我们将会使用标准库(urllib2或urllib)。
在接下来的示例中,我们假定处于攻击框中,也就是说我们可以使用requests包联系web服务器,并使用lxml解析获得的输出。
既然我们已经掌握了与web服务器和网站对话的基本方法,那么接下来我们将会为任何web应用程序攻击或渗透测试创建一些有用的工具。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用和的内容来自《黑帽Python第二版》这本书的第二章,主题是网络工程基础。在这一章中,作者介绍了TCP客户端/服务端和SSH与SSH隧道的相关内容。在TCP客户端/服务端部分,书中讲解了如何使用Python编写TCP客户端和服务端程序,以及如何进行简单的网络通信。而在SSH与SSH隧道部分,书中介绍了使用Paramiko进行SSH连接和操作的方法,还提到了SSH隧道的概念和使用方法。通过这些内容,读者可以学习到如何使用Python<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [黑帽python第二版Black Hat Python 2nd Edition读书笔记 之 第二章 网络工程基础(1)TCP客户端/服务端...](https://blog.csdn.net/lipeixinglive/article/details/127079453)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [黑帽python第二版Black Hat Python 2nd Edition读书笔记 之 第二章 网络工程基础(3)SSH与SSH隧道](https://blog.csdn.net/lipeixinglive/article/details/127132402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值