1. curl
1.1 http
curl http://127.0.0.1:80
向目标主机端口发送http请求
1.2 http+head
curl -H “Host: 18ed3df584cd48328b5839443aa7b42b” http://127.0.0.1:80
1.3 http+path
curl http://127.0.0.1:80/853c64cd218f80d0a59665666fb2ab80
1.4 URL编码路径
(空格转义%20)
curl http://127.0.0.1:80/82cb7091**%20f70a467f/9fcaf321%20**61dff81f
1.5 get传参(略)
1.6 gets多参传递+URL转义符集合
1.7 post传参
curl -X POST http://example.com/api -d “param1=value1¶m2=value2”
curl -X POST http://127.0.0.1:80 -d “a=63fd067f4bff285ea2cbd48f68e9f70b”
多个参数用 & 隔开
1.8 post多参+URL转义符【略】
1.9 JSON请求
要使用curl发送满足要求的HTTP POST请求,包括指定Content-Type为’application/json’并且请求主体是一个JSON对象,可以按照以下方式进行:
curl -X POST http://127.0.0.1:80 \ -H "Content-Type: application/json" \ -d '{"a": "a2058cfa996ff89a3c9a9ae03f9452b3}' # 下面的JSON 数据被双引号包裹,并且内部的双引号进行了转义。这样可以确保服务器能够正确解析JSON 数据 -d "{\"a\": \"a2058cfa996ff89a3c9a9ae03f9452b3\"}"
服务器端无法正确解析单引号包裹的JSON数据所致。在这种情况下,你可以尝试使用双引号来包裹JSON 数据,并在需要转义双引号的地方进行适当的转义。
在这个命令中:
-X POST
表示使用POST方法发送请求。-H "Content-Type: application/json"
指定请求头中的Content-Type为’application/json’。-d '{"a": "a2058cfa996ff89a3c9a9ae03f9452b3}'
表示要发送的JSON格式数据,其中包含一个名为a
,值为a2058cfa996ff89a3c9a9ae03f9452b3
的键值对。
通过这个curl命令,你可以发送满足要求的HTTP POST请求,包括指定了Content-Type为’application/json’并且请求主体是一个JSON对象。
1.10 多个JSON请求
curl -X POST http://127.0.0.1:80 \ -H "Content-Type: application/json" \ -d '{ "a": "4827710bb4f1f050ec59637ee395a687", "b": { "c": "ee810713", "d": ["7d64256a", "deea38fe b3ce496e&619ead70#c62d1f56"] } }'
1.11 目标地址重定向
要使用curl发送能够自动重定向的HTTP请求,你可以通过使用-c参数来实现。以下是详细的步骤:
- 使用curl命令发送HTTP请求,并允许自动重定向。示例命令如下:
curl -L http://127.0.0.1/http://127.0.0.1 【new_url】
在这个命令中,-L参数告诉curl在遇到重定向时继续跟随重定向。确保替换http://example.com/original_url为实际的原始URL。
- 如果你想保存重定向后的结果到文件中,可以使用-o参数。示例命令如下:
curl -L -o output.txt http://example.com/original_url
这个命令会将重定向后的结果保存到output.txt文件中。同样,确保替换http://example.com/original_url为实际的原始URL。
通过以上curl命令,你可以发送能够自动重定向的HTTP请求,并获取重定向后的结果。
1.12 重定向+cookie
通关:
curl -v -H 'Cookie: cookie=6fd6429d2031ea12836e4bd6fba11204' localhost # (cookie在服务端获取,然后修改再次发送) or curl -L --cookie /tmp/cookie localhost # 直接得到flag
杂谈:
使用
curl
发送HTTP请求并添加Cookie可以通过-b
或--cookie
选项来实现。下面是详细的说明:
- 使用单个Cookie:
如果你只需要添加一个Cookie,可以使用-b
或--cookie
选项,后面跟上Cookie的键值对。例如:
curl -b "cookie_name=cookie_value" http://example.com
- 使用多个Cookie:
如果你需要添加多个Cookie,可以将多个键值对用分号分隔,然后作为一个整体传递给
-b
选项。例如:
curl -b "cookie1_name=cookie1_value; cookie2_name=cookie2_value" http://example.com
- 从文件中读取Cookie:
如果你有一个包含Cookie的文本文件,你可以使用
-b
选项并指定文件路径来读取Cookie。例如,假设cookies.txt
包含Cookie信息:
curl -b cookies.txt http://example.com
- 设置Cookie:
如果你需要在请求中设置Cookie,可以使用
-c
或--cookie-jar
选项来保存服务器返回的Cookie。例如:
curl -c cookies.txt http://example.com
这样,你可以使用
curl
命令发送HTTP请求并添加Cookie。记得根据你的具体需求选择合适的选项来处理Cookie。
1.13 发出多个请求
curl -v -H 'Cookie: session=eyJzdGF0ZSI6MX0.ZIdjyA.Il0n0-3Dc92AGqznlmke0NUGbSM' localhost curl -v -H 'Cookie: session=eyJzdGF0ZSI6Mn0.ZIdj-g.xNEcHHpWLkuTjDyiyMlOkpJlhHc' localhost curl -v -H 'Cookie: session=eyJzdGF0ZSI6M30.ZIdkLw.GAPUeUh0rrxafcjsCri18TI506o' localhost
或
curl -L --cookie /tmp/cookie localhost
2. nc
2.1 http
echo -e “GET / HTTP/1.1\nHost: 127.0.0.1\n\n” | nc 127.0.0.1 80
向目标主机端口发送http请求
2.2 http+head
echo -e “GET / HTTP/1.1\nHost: b1ed1fd1d66462968551d7b54f849fb7\n\n” | nc 127.0.0.1 80
hacker@talking-web~level5:/challenge$ echo -e "GET / HTTP/1.1\nHost: b1ed1fd1d66462968551d7b54f849fb7\n\n" | nc 127.0.0.1 80 HTTP/1.1 200 OK Server: Werkzeug/3.0.1 Python/3.8.10 Date: Fri, 22 Mar 2024 16:52:40 GMT Content-Length: 58 Server: pwn.college Connection: close pwn.college{gC3ahWYU5mOWiX-HjMXNm43aMyg.dJzNyMDLwYTM2QzW}
2.3 http+path
echo -e “GET /60f5e17a50a4dcd970df6b2e65f005d0 HTTP/1.1\n\n” | nc 127.0.0.1 80
hacker@talking-web~level8:/challenge$ echo -e "GET /60f5e17a50a4dcd970df6b2e65f005d0 HTTP/1.1\n\n" | nc 127.0.0.1 80 HTTP/1.1 200 OK Server: Werkzeug/3.0.1 Python/3.8.10 Date: Fri, 22 Mar 2024 17:01:58 GMT Content-Length: 58 Server: pwn.college Connection: close
2.4 URL编码路径
空格转义%20
echo -e “GET /69083c2d%20528d9e1c/08799ad8%202f6a1ceb HTTP/1.1\n\n” | nc 127.0.0.1 80
2.5 get传参
echo -e “GET /path/to/resource?param1=value1¶m2=value2 HTTP/1.1\r\nHost: example.com\r\n\r\n” | nc example.com 80
echo -e "GET /?a=f3cc3f27f532ccdc94c199bfdfa730fc HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n" | nc 127.0.0.1 80
2.6 gets多参传递+URL转义符集合
2.7 post传参
使用nc(netcat)命令发送POST请求并传递参数比较复杂,因为nc本身并不提供HTTP协议的支持。但是,你可以手动构建一个HTTP POST请求并使用nc发送。以下是一个示例:
DATA="param1=value1¶m2=value2" LENGTH=$(echo -n $DATA | wc -c) { echo "POST /api HTTP/1.1" echo "Host: example.com" echo "Content-Type: application/x-www-form-urlencoded" echo "Content-Length: $LENGTH" echo "" echo $DATA } | nc example.com 80
在这个示例中:
DATA
变量包含要发送的参数数据。LENGTH
变量计算参数数据的长度。- 然后,使用大括号
{}
来组合HTTP请求的各个部分,包括请求行、头部和主体。 - 最后,通过管道将构建的HTTP请求发送到目标服务器。
请注意,这种方法相对复杂且容易出错,推荐使用更专门的工具(如curl)来发送带有参数的POST请求。
2.8 post多参+URL转义符【略】
2.9 JSON请求
通关:
/$ nc localhost 80 POST / HTTP/1.1 Content-Type: application/json Content-Length: 41 {"a": "53313aa20b8e449ead12861551d51ddf"}
杂谈:
要使用nc命令发送符合要求的HTTP POST请求,包括Content-Type为application/json和JSON格式的请求主体,你可以按照以下步骤进行:
- 构建HTTP请求:
- 构建HTTP POST请求,包括请求头和请求主体。请求主体是一个JSON对象,包含一个名为
a
的键和值为53313aa20b8e449ead12861551d51ddf
的对。
- 使用nc发送请求:
- 使用nc命令连接到目标服务器的HTTP端口,并手动构建HTTP POST请求。以下是一个示例:
echo -e "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Type: application/json\r\nContent-Length: <length>\r\n\r\n{\"a\": \"53313aa20b8e449ead12861551d51ddf\"}" | nc <server_ip> <port>
请将<server_ip>
替换为目标服务器的IP地址,<port>
替换为目标服务器的端口号,并确保替换<length>
为实际请求主体的长度。然后运行上述命令即可发送符合要求的HTTP
echo -e "POST / HTTP/1.1\r\nHost: 127.0.0.1:80\r\nContent-Type: application/json\r\nContent-Length: 39\r\n\r\n{\"a\": \"53313aa20b8e449ead12861551d51ddf\"}" | nc 127.0.0.1 80
2.10 多个JSON请求【⭐】
解析:
要使用nc(netcat)命令来发送一个HTTP请求,你需要构建一个有效的HTTP POST请求,其中包含正确的头部和JSON主体。下面是一个基于你给出的要求的示例命令:
echo -e "POST / HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Type: application/json\r\nContent-Length: <your_content_length>\r\n\r\n{\"a\":\"22128d91815c9485b2d9593513694301\",\"b\":{\"c\":\"a817fbb0\",\"d\":[\"656b4721\",\"721c816e 352a1731&e1f09370#9786b4c1\"]}}" | nc 127.0.0.1 80
注意:
- <your_content_length>需要替换为JSON主体内容的实际长度。你可以使用echo -n “your_json_string” | wc -c来得到这个长度。
- 这个命令使用echo -e来发送多行字符串,并使用管道|将字符串传递给nc命令。
- HTTP请求的/表示你正在请求根路径。如果你的flag位于其他路径,请相应地更改它。
- 确保nc命令已安装在你的系统上,并且你有权限执行它。
首先,你可以使用以下命令来计算JSON主体的长度:
json_string='{"a":"22128d91815c9485b2d9593513694301","b":{"c":"a817fbb0","d":["656b4721","721c816e 352a1731&e1f09370#9786b4c1"]}}' content_length=$(echo -n "$json_string" | wc -c)
然后,使用上面计算出的content_length来发送HTTP请求:
echo -e "POST / HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Type: application/json\r\nContent-Length: $content_length\r\n\r\n$json_string" | nc 127.0.0.1 80
这个命令会向127.0.0.1的80端口发送一个HTTP POST请求,其中包含了你指定的JSON主体。
通关:
hacker@talking-web~level29:~/Desktop$ sh $ json_string='{"a":"22128d91815c9485b2d9593513694301","b":{"c":"a817fbb0","d":["656b4721","721c816e 352a1731&e1f09370#9786b4c1"]}}' $ content_length=$(echo -n "$json_string" | wc -c) $ echo -n "$json_string" {"a":"22128d91815c9485b2d9593513694301","b":{"c":"a817fbb0","d":["656b4721","721c816e 352a1731&e1f09370#9786b4c1"]}}$ echo -n "$content_length" 116 $ ^C $ exit
echo -e "POST / HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Type: application/json\r\nContent-Length: 116\r\n\r\n{\"a\":\"22128d91815c9485b2d9593513694301\",\"b\":{\"c\":\"a817fbb0\",\"d\":[\"656b4721\",\"721c816e 352a1731&e1f09370#9786b4c1\"]}}" | nc 127.0.0.1 80
2.11 目标地址重定向 【⭐】
解析:
要使用nc(netcat)命令向127.0.0.1的80端口发送HTTP请求并获取重定向后的“flag”,您需要发送一个HTTP请求,并解析服务器返回的重定向响应。由于nc不支持自动重定向,您必须手动处理这一过程。
下面是一个步骤指南,用于完成此挑战:
- 发送HTTP GET请求: 首先,使用nc命令发送一个HTTP GET请求到服务器的根路径(/)。
echo -e "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n" | nc 127.0.0.1 80
- 解析重定向响应: 服务器将返回一个HTTP响应,其中可能包含一个Location头,指示重定向的URL。您需要从这个响应中提取出Location头的值。
# 发送请求并保存响应 RESPONSE=$(echo -e "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n" | nc 127.0.0.1 80) # 提取Location头的值 LOCATION=$(echo "$RESPONSE" | grep -oP 'Location: \K[^ ]+')
- 发送重定向请求: 一旦您有了重定向的URL(即Location头的值),您可以发送另一个HTTP GET请求到这个URL。
# 如果LOCATION不为空,则发送重定向请求 if [ -n "$LOCATION" ]; then echo -e "GET $LOCATION HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n" | nc 127.0.0.1 80 else echo "No redirect found in the response." fi
- 处理重定向响应: 这次,服务器将返回最终的“flag”。您需要查看这个响应的内容。
# 保存重定向响应 REDIRECT_RESPONSE=$(echo -e "GET $LOCATION HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n" | nc 127.0.0.1 80) # 打印重定向响应的内容 echo "$REDIRECT_RESPONSE"
请注意,这个脚本假设重定向URL不包含空格或其他特殊字符,并且重定向是通过标准的Location头实现的。如果重定向逻辑更复杂,或者重定向URL包含特殊字符,您可能需要调整脚本来适应这些情况。
此外,由于nc不支持HTTP重定向,这个过程相对复杂。在实际应用中,使用像curl这样的工具会更加简单和可靠,因为它会自动处理重定向。如果您有权限使用其他工具,我强烈建议您考虑使用它们来完成此任务。
通关:
hacker@talking-web~level32:~/Desktop$ echo -e "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n" | nc 127.0.0.1 80 HTTP/1.1 302 FOUND Server: Werkzeug/3.0.2 Python/3.8.10 Date: Sat, 27 Apr 2024 15:32:01 GMT Content-Length: 253 Location: /c86377902e90e4795cb9df47f5c6ad1a Server: pwn.college Connection: close <!doctype html> <html lang=en> <title>Redirecting...</title> <h1>Redirecting...</h1> <p>You should be redirected automatically to the target URL: <a href="/c86377902e90e4795cb9df47f5c6ad1a">/c86377902e90e4795cb9df47f5c6ad1a</a>. If not, click the link.
echo -e “GET $Location / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n” | nc 127.0.0.1 80
hacker@talking-web~level32:~/Desktop$ echo -e "GET /c86377902e90e4795cb9df47f5c6ad1a HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n" | nc 127.0.0.1 80 HTTP/1.1 200 OK Server: Werkzeug/3.0.2 Python/3.8.10 Date: Sat, 27 Apr 2024 15:33:31 GMT Content-Length: 58 Server: pwn.college Connection: close pwn.college{88GwFMOepaw5cE8Ds2N_WaIZDxO.dlTOyMDLwYTM2QzW
2.12 cookie+重定向 【⭐】
nc 127.0.0.1 80 <<EOF GET / HTTP/1.1 Host: 127.0.0.1 Connection: close EOF
hacker@talking-web~level35:~/Desktop$ sh 1.sh HTTP/1.1 302 FOUND Server: Werkzeug/3.0.2 Python/3.8.10 Date: Sat, 27 Apr 2024 15:54:29 GMT Content-Length: 189 Location: / Set-Cookie: cookie=e1ef8a65c82383229e1f9a1c2e2ab952; Path=/ Server: pwn.college Connection: close <!doctype html> <html lang=en> <title>Redirecting...</title> <h1>Redirecting...</h1> <p>You should be redirected automatically to the target URL: <a href="/">/</a>. If not, click the link.
nc 127.0.0.1 80 <<EOF GET / HTTP/1.1 # GET $Location HTTP/1.1 Host: 127.0.0.1 Cookie: cookie=e1ef8a65c82383229e1f9a1c2e2ab952 Connection: close EOF
2.13 发出四种不同cookie的请求
# 请求1: 初始化会话,可能设置cookie nc 127.0.0.1 80 <<EOF GET / HTTP/1.1 Host: 127.0.0.1 Connection: close EOF # 请求2: 使用提取的cookie值 nc 127.0.0.1 80 <<EOF GET / HTTP/1.1 Host: 127.0.0.1 Cookie: session=eyJzdGF0ZSI6MX0.Zi0jvQ.3WG9G44lx8SYGdrbwJaGQ6kJT9g Connection: close EOF # 请求3: 使用从第二个回显提取出cookie值 nc 127.0.0.1 80 <<EOF GET / HTTP/1.1 Host: 127.0.0.1 Cookie: session=eyJzdGF0ZSI6Mn0.Zi0jvQ.8XI9eHJCMGDJG70kewnK-123TRs Connection: close EOF # 请求4: 使用从第三个回显提取出cookie值 nc 127.0.0.1 80 <<EOF GET / HTTP/1.1 Host: 127.0.0.1 Cookie: session=eyJzdGF0ZSI6Mn0.Zi0jvg.q_SJa48mvwO6rr5482DcOhqMoh0 Connection: close EOF # 请求5: 使用从第三个回显提取出cookie值 nc 127.0.0.1 80 <<EOF GET / HTTP/1.1 Host: 127.0.0.1 Cookie: session=eyJzdGF0ZSI6M30.Zi0klQ.fGrFAUeWXHGzIVFsN0G01OdsFlg Connection: close EOF