处理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, urllib


def url_values_plus(url, vals):
    ret = []
    u = urlparse.urlparse(url)
    qs = u.query
    pure_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] = val
            tmp_qs = urllib.unquote(urllib.urlencode(tmp_dict))
            ret.append(pure_url + "?" + tmp_qs)
    return ret

url = "http://www.waitalone.cn/index.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 urllib

def url_values_plus(url, vals):
    ret = []
    u = parse.urlparse(url)
    qs = u.query
    pure_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] = val
            tmp_qs = parse.unquote(parse.urlencode(tmp_dict))
            ret.append(pure_url + "?" + tmp_qs)
    return ret

url = "http://www.waitalone.cn/index.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。指定列和行就可以进行逐个进行模糊测试。

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

发布了248 篇原创文章 · 获赞 337 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/qq_37865996/article/details/96561110