处理urlparseurllib.parse中修改url参数结果的奇思异想

时间: 2023-08-18 admin IT培训

处理urlparse/urllib.parse中修改url参数结果的奇思异想

处理urlparse/urllib.parse中修改url参数结果的奇思异想

最近,同事埋头于对多参url中的每个参数进行模糊测试,达到测试函数能否进行的结果。在写脚本的时候,我开始给他的建议是,将完整的url进行切割,以针对每个list元素进行替换的思路完成脚本,翻了一下之前的脚本,大致如下:

import re
url="www.baidu.com/?a=1&b=2&c=3&d=4&e=5"a=[]
a=re.split(r'[=&]\s*',url) 
urlNew=""
print(a)
for i in range(0,len(a)):if i<len(a)-1:if i%2==0 :urlNew=urlNew+a[i]+"="else:urlNew=urlNew+"sahdfkhsadf"+"&"else:urlNew=urlNew+"sahdfkhsadf"
print(urlNew)

当然了,上面的代码是将所有的参数都进行了替换,根据实际情况调整即可。

但是显而易见,多一个要求就是多一大段代码,而且实际操作中,逐参数替换是一个很现实很实用的要求。找来下面关于python2中,使用urlparse相关函数进行处理的代码:

# -*- coding: utf-8 -*-
import urlparse, copy, urllibdef url_values_plus(url, vals):ret = []u = urlparse.urlparse(url)qs = u.querypure_url = url.replace('?'+qs, '')qs_dict = dict(urlparse.parse_qsl(qs))for val in vals:for k in qs_dict.keys():tmp_dict = copy.deepcopy(qs_dict)tmp_dict[k] = valtmp_qs = urllib.unquote(urllib.urlencode(tmp_dict))ret.append(pure_url + "?" + tmp_qs)return returl = ".php?id=123&abc=456&xxx=ooo"
payloads = ('../boot.ini','../etc/passwd','../windows/win.ini','../../boot.ini','../../etc/passwd')
urls = url_values_plus(url, payloads)
for pure_url in urls:print pure_url

因为python3中urlparse已经并入到了urllib中,可以通过from urllib import parse进行引用,这里我给出我的代码:

# -*- coding: gbk -*-
# -*- coding: utf-8 -*-
import copy
from urllib import parse
import urllibdef url_values_plus(url, vals):ret = []u = parse.urlparse(url)qs = u.querypure_url = url.replace('?'+qs, '')qs_dict = dict(parse.parse_qsl(qs))for val in vals:for k in qs_dict.keys():tmp_dict = copy.deepcopy(qs_dict)tmp_dict[k] = valtmp_qs = parse.unquote(parse.urlencode(tmp_dict))ret.append(pure_url + "?" + tmp_qs)return returl = ".php?id=123&abc=456&xxx=ooo&ih=6&lf=1"
payloads = ('../boot.ini','../etc/passwd','../windows/win.ini','../../boot.ini','../../etc/passwd')
urls = url_values_plus(url, payloads)
for pure_url in urls:print(pure_url)

那么接下来是要解决什么呢?因为这是针对每个参数进行模糊测试,思路是先找一个绝对错误的payload,然后后面的payload尝试对同一个参数注入,而上面的代码生成结果是这样的:

如各位所见,处理结果中,是每个payload逐参数进行替换,那我们如何按照所替换参数将其分成 参数数量 个分组呢?

我的想法是使用先将list转为数组,升维变成二维矩阵,再指定列进行读取,即完成逐参数分组。

b=np.array(target)
mulb=b.reshape((len(payloads),num))

通过读取mulb(:,0)可读取第一列的内容,即可得到全部替换第一个参数的url。指定列和行就可以进行逐个进行模糊测试。

就到这儿了,我要去吃早饭啦,各位下次再见~