首页 > 网络安全 > libcurl函数库的安全性

libcurl函数库的安全性

2009年12月23日 发表评论 阅读评论

curl 库是一个免费的超大的客户端URL传输库,官方描述为:

libcurl is a free and easy-to-use client-side URL transfer library, supporting FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS and FILE. libcurl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, Kerberos4), file transfer resume, http proxy tunneling and more!

如果我们想获取一个页面,可用如下简单的代码实现:
PHP code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function get_url( $url ){
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($ch);
$info = curl_getinfo($ch);
if ($result <> ''){
echo $result."
";
} else {
echo "$url: \t no
\r\n";
}
curl_close($ch);
 
}
if( isset($_GET["url"]) ) {
get_url( $_GET["url"] );
exit();
}

接着,我们就可以通过

1
http://www.woyigui.cn/curl.php?url=http://www.google.com

此url来获取google的页面,并输出到当前页面,非常方便。
同样的,用python 更为简单:

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
import urllib,sys
 
f = urllib.urlopen(sys.argv[1])
while 1:
buf = f.read(2048)
if not len(buf):
break
sys.stdout.write(buf)

就可以用以下方式获取页面:

1
$ ./downlaod.py http://www.woyigui.cn/index.php

也可以用:

1
$ ./downlaod.py http://www.woyigui.cn/phpinfo.tar.gz >> phpinfo.tar.gz

来下载文件。
当然了,还有更多的脚本都支持 curl 库。

那么,正因为 curl 的超大,同样支持的协议的非常多,所以安全问题也就随之而来。目前可以想到的可以引起以下几个问题:

1、任意文件查看漏洞
因其支持 file 协议,所以,刚才的 PHP 代码,如果被我们控制了 URL 参数,就可以用如下访问获取机器上的可以读权限的任意文件:

1
http://www.woyigui.cn/php_vul/curl_vul.php?url=file:///etc/passwd

这段代码用于获取/etc/passwd文件,在知道网站绝对路径的情况下,可以直接读取网站任意文件源代码:

1
http://192.168.9.30/php_vul/curl_vul.php?url=file:///var/www/config.inc.php

python 语言可以直接读取,也可以加协议头,我们用上面的python脚本:

1
2
3
4
woyigui@fvck:~/python$ ./downlaod.py /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
....
1
2
3
4
5
woyigui@fvck:~/python$ ./downlaod.py file:///etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
.....

2、绕过防火墙,渗透内网
假如有一个简单的网络拓扑结构:

1
A (攻击者:10.0.0.1) ---》 B (WEB 服务器:10.0.0.10) ---》 C (防火墙:防止外网IP访问内网机器,只允许 WEB 与内网之间传输数据) ---》D(内网:192.168.9.2/254)

在这样的一个简单的网络环境中,如果WEB服务器存在一处可由用户构造的CUL 参数的页面,攻击者就可以利用 curl 的功能,进行内网访问数据,因为当执行 CURL 命令,进行网络请求时,都是由 WEB 服务器进行发起的,所以是可以实现的。
1) 访问 内网 ftp 资源:

1
http://ww.woyigui.cn/php_vul/curl_vul.php?url=ftp://test:test@192.168.9.27

当然,如果确认此机器存在 ftp 服务器时,也可以通过返回值进行暴力破解。
2) 访问内网 http 资源:

1
http://www.woyigui.cn/php_vul/curl_vul.php?url=http://192.168.0.1

在很多情况下,很多大的公司都会在内网进行搭建内部网站,或者论坛,然后提供一些公开内部资料可供下载等等,这时候,就可以利用 CURL 去请求内部HTTP服务器的文件。另外,也可以通过返回值,进而扫描内部 WEB 服务器。同样,在有些情况下,也可以通过请尔内部网站,发送GET 请尔, XSS 内部网站,同时,再利用 XSS ping 等方式,进一步做攻击。
3) telnet 渗透内部服务器

4) 利用 scp 协议访问主机资源

3、在线网页代理
这个不算攻击范畴。
因其可以获取远程页面,所以可以找一台米国肉J,或者shell也行,不过要支持 curl 库,可以参数 phpinfo 信息。做一个获取页面PHP文件,这样以后看网页就可以不被墙了。

因各种原因,另外几种就不提供测试方法,只要攻击者熟悉各种 协议,比如 smb:// ftp:// 等,就可以达到攻击的目的。当然,肯定有其他的多种方法可扩展攻击性,使攻击最大化!这就要看各位看官了。
虽然此库在一般的WEB开发中,很少用。但是在一些WEB网络应用的网站,还是大大存在的。而且 curl 库支持多种脚本,所以在其他脚本或者语言中也可能存在问题,目前我只测试了 php 和 python 。
这个是官方提供的一个支持语言名单:

Ada95,Basic,C,C++,Ch,Cocoa,D,Dylan,Eiffel,Euphoria,Falcon,Ferite,Gambas,glib/GTK+,Haskell,ILE/RPG,Java,Lisp,Lua,Mono,.NET,Object-Pascal,OCaml,Pascal,Perl,PHP,Postgres,Python,R,Rexx,Ruby,Scheme,S-Lang,Smalltalk,SP-Forth,SPL,Tcl,Visual Basic,Visual FoxPro,Q,wxWidgets,XBLite

文中肯定没有把此功能攻击最大化,还需要各位的挖掘了。。:)

纠正:以下的python示例并不是使用了curl提供的库,而是使用自身的 urllib。curl 库对 python 提供了 pyUrl 库:http://pycurl.sourceforge.net/

参考:

1
2
http://curl.haxx.se/libcurl/
http://www.acunetix.com/blog/websecuritynews/acusensor-curl-and-zen-cart/

转载请注明:woyigui's blog [http://www.woyigui.cn/]
本文标题:libcurl函数库的安全性
本文地址:http://www.woyigui.cn/2009/12/23/libcurl-security/

分类: 网络安全 标签:
  1. se
    2009年12月23日23:57 | #1

    gui哥叼B了。  gui哥是处男鉴定完毕,只有处男才有这么持久的爆发力!

    [回复]

  2. wy
  3. 游客
    2009年12月24日11:49 | #3

    那段python代码与curl库没关系吧

    [回复]

    woyigui 回复:

    非常感谢指出错误,我是python小学者。。

    [回复]

  4. menzhi007
    2010年3月4日07:35 | #4

    学习了

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
*