如何替换 url 中的参数值?

2014-12-17 10:02:00 +08:00
 hack2012
大家好,我是python新手,想写一个测试目录遍历的小脚本,遇到了问题,求各位大牛指教!

python 2.7.8 windows 7 x64位

测试url: http://www.waitalone.cn/index.php?id=123&abc=456&xxx=ooo

其实参数名值对个数不是固定的,这里我只是以3个为准测试。

payloads = ('../boot.ini','../etc/passwd','../windows/win.ini','../../boot.ini','../../etc/passwd')

我想要实现的是这样的功能,首先遍历payloads,然后使用其payload替换url中的参数值,但是要在替换第一个参数值的时候其它两个或者多个参数名值对保护不变,举例如下:

http://www.waitalone.cn/index.php?id=../boot.ini&abc=456&xxx=ooo
http://www.waitalone.cn/index.php?id=../etc/passwd&abc=456&xxx=ooo
.....
http://www.waitalone.cn/index.php?id=../../etc/passwd&abc=456&xxx=ooo

当替换第2个参数值的时候其它的不变:

http://www.waitalone.cn/index.php?id=123&abc=../boot.ini&xxx=ooo
...
http://www.waitalone.cn/index.php?id=123&abc=../../etc/passwd&xxx=ooo

第3个或者多个参数名值对同上面。。

我只知道如何一次性的把所有的参数值给替换掉,但是不知道如何保持其它两个不变,求大牛们指教!
7237 次点击
所在节点    Python
17 条回复
Delbert
2014-12-17 10:39:01 +08:00
先用=进行split,
之后对每个元素用&进行split,
替换掉[0],
依次循环呗。
kmvan
2014-12-17 10:48:13 +08:00
py 这么麻烦,果然 php 才是最好的语言
timonwong
2014-12-17 10:54:13 +08:00
bits = list(urlparse.urlparse(url))
qs = urlparse.parse_qs(bits[4]) # 注意value是一个list
# 修改qs,略
bits[4] = urllib.urlencode(qs, True)
url = urlparse.urlunparse(bits)
realityone
2014-12-17 10:54:26 +08:00
也可以对&来split,然后再对=split
替换掉之后join回来

这些参数有点奇怪啊…
jarlyyn
2014-12-17 11:09:29 +08:00
感觉你是需要克隆一个字典
jarlyyn
2014-12-17 11:11:24 +08:00
hack2012
2014-12-17 14:42:35 +08:00
有人能写出一个完整的代码吗?
hack2012
2014-12-17 14:50:38 +08:00
@kmvan 哥,你用php折腾一个出来也可以的呀,我好参考改成python版的。
kingxsp
2014-12-17 14:53:01 +08:00
purl 库应该是你需要的
kmvan
2014-12-17 15:47:53 +08:00
@hack2012 哥,你用php折腾一个出来也可以的呀,我好参考改成python版的。
参考 wp 的 add_query_arg().
timonwong
2014-12-17 17:16:56 +08:00
@hack2012
完整的我已经给了
hack2012
2014-12-17 17:47:32 +08:00
@timonwong 感谢兄弟提供的代码,但是中间的处理,我也不会做,哥能帮我写个完整的代码实现吗?
mythhack
2014-12-17 19:31:33 +08:00
大概是 拆分?号 然后拆分=号 然后你就懂了
robbielj
2014-12-17 19:55:27 +08:00
http://ideone.com/Jbfmst

```
payloads = ('../boot.ini','../etc/passwd','../windows/win.ini','../../boot.ini','../../etc/passwd')

s1 = ['123']*5
s2 = ['456']*5
s3 = ['ooo']*5

a = zip(payloads, s2, s3) + zip(s1, payloads, s3) + zip(s1, s2, payloads)

for item in a:
x, y, z = item
print ("http://www.waitalone.cn/index.php?id=%s&abc=%s&xxx=%s" %(x,y,z))
```

数量不多,随便了,多了可以loop
hack2012
2014-12-17 22:15:03 +08:00
谢谢楼上的兄弟!!
hack2012
2014-12-19 11:17:20 +08:00
感谢楼上所有提供思路的兄弟们,目前已经得到了解决,最终代码如下!

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
hack2012
2014-12-19 11:19:13 +08:00
这里代码居然不能高亮显示,请大家在这里看吧。。

http://www.waitalone.cn/replace-url-params.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/154518

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX