sql注入与数据库利用
mysql文件读写
文件读写的限制
具体可以看这里呀,官方是最准的。取决于secure_file_priv变量
查看方式
1 | MySQL [bertram]>show global variables like '%secure_file_priv%'; |
又因为 secure_file_priv 参数是只读参数,不能使用set global命令修改。
1 | MySQL [bertram]> set global secure_file_priv=''; |
在5.6.34版本以上:
1.空字符串:可以写入/读取到任何位置
2.某目录:可以写入/读取到该目录
3.NULL:不可读写
默认:与操作系统有关,windows上默认是NULL;linux上默认是一个指定路径。
在5.6.34版本以下
1.空字符串:可以写入/读取到任何位置
2.某目录:可以写入/读取到该目录
默认:空字符串
读文件
没什么其他的好方法,就两个命令
1 | select * from load_file('/etc/passwd'); |
但是可以读一些比较有用的文件。
1.各种配置文件
1 | MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件,如: |
2.代码审计
如果存在一个注入点,又知道网站绝对路径(也可以通过先读默认中间件配置文件,获取网站根路径,再读文件),那么可以读取网站源码,逐个读取后,进行审计。
写文件
into outfile
1 | select '111' into outfile '/tmp/1.txt'; |
linux下
linux下,mysql为mysql用户权限,是一个低权限用户,如果web目录有权限的话,可以尝试写入webshell到web目录。
windows下
windows,如果管理员配置mysql服务不当(很可能),那么可以写入到任意目录,当然前提是secure_file_priv变量没限制。就可以写webshell写启动项、各种写了。
windows下还有个mof提权,太老了,windows2003的,有兴趣可以看看这里
写log文件!
这个函数是不受secure_file_priv变量限制的。
查看 general log状态:
1 | show variables like "%general%"; |
1 | show variables like "%general%"; |
一般 general_log 默认是关闭的,不过这个配置我们可以手动开起来。
设置日志输出类型为文件:
有时候 mysql 默认日志输出类型不是 FILE 而是 TABLE。
如果是TABLE的话,是不会将日志输出为文件格式的。
需要将其类型设置为 FILE
1 | set global log_output="FILE"; |
设置输出文件路径:
1 | set global general_log_file="/var/www/html/1.php"; |
开启 general log:
1 | set global general_log=on; |
由于一开启 general log,此时在 mysql 上的所有操作都会被记录下来。为了让输出的文件杂质少一点。我们细节一点最后再开启 general log
同时这里也可以用慢查询的日志来写入,这样可以让日志杂质更少一点。
udf相关
- udf简介:
- UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过 自定义函数 来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像本机函数如ABS()或SOUNDEX()一样方便。
- UDF官方介绍以及其函数定义请参考(http://dev.mysql.com/doc/refman/5.5/en/adding-functions.html、https://dev.mysql.com/doc/refman/5.5/en/create-function-udf.html)
- udf提权原理
- 在udf.dll/udf.so文件中自定义一些能够以mysql权限执行系统命令的函数,然后将该函数导入到mysql数据库中,通过mysql数据库去以mysql权限执行系统命令。
版本限制
收到两个变量的双重限制plugin_dir和secure_file_priv
这一块总体趋向于越来越安全,具体的可以看老外的这个文章
https://osandamalith.com/2018/02/11/mysql-udf-exploitation/
先了解下plugin_dir变量
1 | show variables like "%plugin%" |
>=5.0.67版本:
udf文件必须位于插件目录,插件目录来自于变量plugin_dir,且该变量在默认为@@BASEDIR/lib/plugin,在之前的版本中默认为空
如果变量plugin_dir为空,那么udf文件必须位于动态链接库能找到的地方,比如:
1 | mysql二进制文件所在的地方 |
写入权限限制
可能plugin目录并不存在,那么可以尝试用webshell去创建该目录,再写入udf文件到该目录;如果webshell没有权限创建该目录,windows下可以用ntfs的特性尝试利用mysql去创建。
具体看看这里就好了
1 | https://www.cnblogs.com/zzjdbk/p/12990164.html |
udf编译
我们完全可以自己定制一个udf,这个网上也有源码,贴几个案例
1 | https://xz.aliyun.com/t/2365 |
两个有名的cve
具体漏洞分析没找到,直接看利用吧
1 | https://xz.aliyun.com/t/1122 |
ssrf+mysql
其实已经超出mysql的范畴,更像是利用ssrf
1 | https://book.hacktricks.xyz/pentesting-web/sql-injection/mysql-injection/mysql-ssrf |
读客户端文件
这个还是一个比较有意思的利用,通过构造恶意的服务端,可以读取客户端的文件。在一些php/jsp/asp探针上均可以利用。而且在某些情况下还能rce(当然我觉得都是理论存在而已)
1 | https://www.anquanke.com/post/id/106488 |