cURL
####将内容输出到文件中: -O -o
我们看到cURL不像web浏览器那样呈现HTML/JavaScript/CSS代码,而是以原始格式打印它。然而,作为渗透测试人员,我们主要对请求和响应上下文感兴趣,它通常比web浏览器更快、更方便。
我们也可以使用cURL下载页面或文件,并使用-O标志将内容输出到文件中。如果我们想指定输出文件名,我们可以使用-o标志并指定名称。否则,我们可以使用-O,cURL将使用远程文件名,如下所示:
Tanin@htb[/htb]$ curl inlanefreight.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
...SNIP...
Tanin@htb[/htb]$ curl -O inlanefreight.com/index.html
Tanin@htb[/htb]$ ls
index.html
跳过cURL的证书检查:-k
现代网络浏览器也会这样做,警告用户不要访问具有无效SSL证书的网站。
我们在测试本地web应用程序或使用托管用于实践目的的web应用程序时可能会面临这样的问题,因为此类web应用程序可能尚未实现有效的SSL证书。要跳过cURL的证书检查,我们可以使用-k标志:
Tanin@htb[/htb]$ curl -k https://inlanefreight.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
...SNIP...
查看完整的HTTP请求和响应:-v
在我们前面的cURL示例中,我们只指定了URL,并得到了返回的响应体。然而,cURL还允许我们预览完整的HTTP请求和完整的HTTP响应,这在执行web渗透测试或编写漏洞时会变得非常方便。要查看完整的HTTP请求和响应,我们可以简单地在前面的命令中添加-v verbose标志,它应该同时打印请求和响应:
Tanin@htb[/htb]$ curl inlanefreight.com -v
* Trying SERVER_IP:80...
* TCP_NODELAY set
* Connected to inlanefreight.com (SERVER_IP) port 80 (#0)
> GET / HTTP/1.1
> Host: inlanefreight.com
> User-Agent: curl/7.65.3
> Accept: */*
> Connection: close
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 401 Unauthorized
< Date: Tue, 21 Jul 2020 05:20:15 GMT
< Server: Apache/X.Y.ZZ (Ubuntu)
< WWW-Authenticate: Basic realm="Restricted Content"
< Content-Length: 464
< Content-Type: text/html; charset=iso-8859-1
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
...SNIP...
-vvv标志显示了一个更加详细的输出。
只显示响应标头:-i
我们看到了将-v标志与cURL一起使用如何向我们显示HTTP请求和响应的全部细节。如果我们只对查看响应标头感兴趣,那么我们可以使用-I标志发送HEAD请求,并且只显示响应标头。此外,我们可以使用-i标志来显示标题和响应主体(例如HTML代码)。两者的区别在于,-I发送一个HEAD请求(将在下一节中看到),而-I发送我们指定的任何请求并打印头。
以下命令显示了使用-I标志的示例输出:
curl -I https://www.inlanefreight.com
Host: www.inlanefreight.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/605.1.15 (KHTML, like Gecko)
Cookie: cookie1=298zf09hf012fh2; cookie2=u32t4o3tb3gg4
Accept: text/plain
Referer: https://www.inlanefreight.com/
Authorization: BASIC cGFzc3dvcmQK
Date: Sun, 06 Aug 2020 08:49:37 GMT
Connection: keep-alive
Content-Length: 26012
Content-Type: text/html; charset=ISO-8859-4
Content-Encoding: gzip
Server: Apache/2.2.14 (Win32)
Set-Cookie: name1=value1,name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT
WWW-Authenticate: BASIC realm="localhost"
Content-Security-Policy: script-src 'self'
Strict-Transport-Security: max-age=31536000
Referrer-Policy: origin
设置请求标头:-H
除了查看标头之外,cURL还允许我们使用-H标志设置请求标头,这将在后面的部分中看到。有些标头,如用户代理或Cookie标头,有自己的标志。例如,我们可以使用-A来设置我们的用户代理,如下所示:
Tanin@htb[/htb]$ curl https://www.inlanefreight.com -A 'Mozilla/5.0'
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
...SNIP...
当我们使用基本的HTTP auth时,我们看到我们的HTTP请求将Authorization头设置为basic YWRtaW46YWRtaW4=,这是admin:admin的base64编码值。如果我们使用现代的身份验证方法(例如JWT),则授权类型为Bearer,并且将包含更长的加密令牌。
让我们尝试在不提供凭据的情况下手动设置授权,看看它是否允许我们访问该页面。我们可以使用-H标志设置头,并将使用上面HTTP请求中的相同值。我们可以多次添加-H标志来指定多样( multiple ?)标头:
Tanin@htb[/htb]$ curl -H 'Authorization: Basic YWRtaW46YWRtaW4=' http://<SERVER_IP>:<PORT>/
<!DOCTYPE html
<html lang="en">
<head>
...SNIP...
HTTP Basic Auth:-u
当我们访问本节末尾的练习时,它会提示我们输入用户名和密码。与使用HTTP参数来验证用户凭据(例如POST请求)的常见登录表单不同,这种类型的身份验证使用基本的HTTP身份验证,由web服务器直接处理,以保护特定的页面/目录,而无需直接与web应用程序交互。
要访问该页面,我们必须输入一对有效的凭据,在这种情况下为admin:admin:
Tanin@htb[/htb]$ curl -u admin:admin http://<SERVER_IP>:<PORT>/
<!DOCTYPE html>
<html lang="en">
<head>
...SNIP...
这一次我们确实得到了响应中的页面。还有另一种方法,我们可以提供基本的HTTP身份验证凭据,它直接通过URL作为(username:password@URL),正如我们在第一节中所讨论的。如果我们对cURL或浏览器进行同样的尝试,我们也可以访问该页面:
Tanin@htb[/htb]$ curl http://admin:admin@<SERVER_IP>:<PORT>/
<!DOCTYPE html>
<html lang="en">
<head>
...SNIP...
用户代理:-A
浏览器通常会在请求头中发送用户代理信息,以告诉服务器使用的是哪个浏览器及其版本。而 curl
命令默认情况下发送的请求没有用户代理信息,可能会导致服务器返回不同的结果或者是基于用户代理的动态网页内容。
您可以尝试使用 -A
或 --user-agent
参数在 curl
命令中设置一个用户代理,以模拟特定的浏览器行为,例如:
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" <URL>
Cookie:-b –cookie
浏览器通常会在请求头中发送与该网站相关的 Cookie 信息,以便服务器可以识别用户并提供相应的内容。而 curl
命令默认情况下不会自动发送 Cookie。
如果该网站依赖于 Cookie 来提供特定的内容或功能,您可以使用 -b
或 --cookie
参数在 curl
命令中设置一个或多个 Cookie 值,以模拟浏览器发送的 Cookie 信息。
curl -b "cookie1=value1; cookie2=value2" <URL>
重定向:-L –location
浏览器通常会自动处理服务器返回的重定向(例如,HTTP 3xx 状态码),并在必要时自动跳转到新的 URL。而 curl
命令默认情况下不会自动处理重定向。
如果服务器返回了重定向响应,您可以使用 -L
或 --location
参数来让 curl
命令自动跟随重定向,并获取最终的内容。
curl -L <URL>
####请求方式:-X
Tanin@htb[/htb]$ curl -X POST -d 'username=admin&password=admin' http://<SERVER_IP>:<PORT>/
...SNIP...
<em>Type a city name and hit <strong>Enter</strong></em>
...SNIP...
Tip: Many login forms would redirect us to a different page once authenticated (e.g. /dashboard.php). If we want to follow the redirection with cURL, we can use the -L flag.
POST
我们将使用-X POST标志来发送POST请求。然后,为了添加POST数据,我们可以使用-d标志并在其后面添加上述数据,如下所示:
Tanin@htb[/htb]$ curl -X POST -d 'username=admin&password=admin' http://<SERVER_IP>:<PORT>/
...SNIP...
<em>Type a city name and hit <strong>Enter</strong></em>
...SNIP...
有了经过身份验证的cookie,我们现在应该能够与web应用程序交互,而无需每次都提供凭据。为了测试这一点,我们可以在cURL中设置带有-b标志的上述cookie,如下所示:
Tanin@htb[/htb]$ curl -b 'PHPSESSID=c1nsa6op7vtk7kdis7bcnbadf1' http://<SERVER_IP>:<PORT>/
...SNIP...
<em>Type a city name and hit <strong>Enter</strong></em>
...SNIP...
正如我们所看到的,我们确实通过了身份验证并进入了搜索功能。也可以将cookie指定为标头,如下所示:
curl -H 'Cookie: PHPSESSID=c1nsa6op7vtk7kdis7bcnbadf1' http://<SERVER_IP>:<PORT>/
格式化json :| jq
我们看到结果是以JSON字符串的形式发送的。为了将其正确格式化为JSON格式,我们可以将输出通过管道传输到jq实用程序,后者将正确格式化它。我们还将使用-s静音任何不需要的cURL输出,如下所示:
Tanin@htb[/htb]$ curl http://<SERVER_IP>:<PORT>/api.php/city/london
[{"city_name":"London","country_name":"(UK)"}]
Tanin@htb[/htb]$ curl -s http://<SERVER_IP>:<PORT>/api.php/city/london | jq
[
{
"city_name": "London",
"country_name": "(UK)"
}
]
静默 -s
curl -s
是一个命令行工具的选项组合。它使用的是 curl
这个工具,用于在命令行中进行网络数据传输。
具体而言,-s
选项表示 “silent”(静默)的意思。当你在执行 curl
命令时,使用 -s
选项会禁止输出任何进度信息或错误消息。它使得 curl
在执行请求时不会产生额外的输出,只会返回请求的结果。