危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2289 浏览18791473

PHP小马的初写

PHP小马的初写

最近危险漫步正在学习PHP。尽管介绍PHP的书才看了几页,却产生了自己写个PHP小马的强烈想法。于是在仅看了几个PHP函数后,仗着有PHP手册就开工了。

考虑到刚接触PHP,知道的东西实在有限,因此设定我要写的PHP小马就一个功能:写一个文件到Web服务器上,也就是能实现小马传大马的功能,和ASP的小马类似。

第一次写的代码为:



把上面代码保存为diy.php,放到我虚拟机里的PHP环境的Web根目录下。因为我是新手,给关键PHP代码都做了注释。diy.php在用浏览器打开。界面太丑,大家包涵,哈哈。

界面很简单,上面两行显示了网站的根目录和当前小马所在的路径,接下来是输入要保存文件的文件名的输入框,下面是输入要保存文件内容的输入框,最后是一个名为“保存”的按钮。这个PHP小马的功能就是写入一个文件到Web服务器上。“文件名”后面的输入框中是要保存文件的名字,支持带路径,不带路径光输入文件名字的话是在PHP小马当前目录下写入文件,下面的大输入框中输入要写入文件的内容,比如PHP大马的代码。点“保存”按钮后写入文件。

来测试下这个小马是否能完成我预想的功能。来写入一个文件看下。文件名我写x.php,内容写hackerxfiles,点“保存”按钮后没有错误提示,来到diy.php所在的目录,发现已经生成了文件x.php。用记事本程序打开x.php,要写入的内容hackerxfiles成功写入了。

再来尝试写一个PHP大马上去,我用的大马是PhpSpy 2011。文件名写phpspy.php,把PhpSpy的源代码复制到输入框中,点“保存”按钮后在diy.php当前目录下成功生成了phpspy.php,访问,却出现了错误提示。怎么出错了呢?用记事本打开刚写入的php spy.php,和正常的PhpSpy 2011的源代码对比一下,发现了问题:新生成的phpspy.p hp中’\等符号前面都被加了转义字符\。为了更直观的看到被加了转义字符,我再来写入一个文件,文件名为test.php,内容就一个字符\,然后用记事本打开写入的文件test.php,看到的内容却是\\。

因为\在PHP中是特殊字符,所以前面被加了转义字符\,写入的文件中就成了两个\\。怎么才能去掉转义字符呢?这个问题困扰了我两天。后来在PhpSpy 2011的源代码中找到了解决问题的方法,在PhpSpy 2011中是用stripslashes()函数去掉的转义字符,我也用它。



用修改后的diy.p hp再写入一个PhpSpy 2011,文件名为phpspy_on.php,访问之,功能正常。再写一个字符\到文件,打开文件,内容就是\,不再是\\了。看来PHP小马完成了。

作为一个PHP小马,要保证在各种情况下都功能正常。提到转义字符,不得不提到PHP中一个重要的配置选项--magic_quotes_gpc。当打开时,所有的’(单引号),”(双引号),\(反斜线)和NULL字符都会被自动加上一个反斜线进行转义。这和addslashes()函数作用完全相同。从PHP 5开始,默认magic_quotes_gpc=On,也就是magic_quotes_gpc打开。我虚拟机中PHP的版本为5.2.8,默认也是maglc_quotes_gpc=On,所以才导致了没用stripslashes()函数处理时\被自动加上一个反斜线进行转义。现在的小马在magic_quotes_gpc=On时能正常使用,在magic_quotes_gpc=OffH寸是否也能正常使用呢?下面来测试下。

来到虚拟机中PHP的安装目录下,用记事本打开文件php.ini,搜索“magic_quotes_gpc”。

果然是默认的magic_quotes_gpc=On,修改为magic_quotes_gpc一Off,保存对php.ini的修改,重启Web服务器软件(我这里为Apache)。再次打开,再次写一个PhpSpy 2011到diy.php所在目录下,文件名为phpspy_offphp。访问,没看到PhpSpy 2011的登录页面,却看到了错误提示。提示“Parse error: parse error in C:\Program Files\Apache Group\Apache2\htdocs\phpspy_off.php on line8”,提示第八行出现错误,用记事本打开phpspy_off.php,来到第八行,就能够查找到代码,在这里就不多赘述了。



很明显的phpspy_off.php中的代码少了一个\。怎么少的呢?想到了stripslashes()函数。在maglc_quotes_gpc=On的时候因为\会自动被加上一个转义字符\变成\\,经过stripslashes()函数去掉转义字符,正好又变回原本的\,没有任何问题,但现在m_agic_quotes_gpc=Off,提交的数据根本没有被加上转义字符,还要经过stripslashes()函数去转义字符,有时候就会产生误去。比如define(‘IS_WIN',DIRECTORY_SEPARATOR==“\\”;中的\\,被错误的处理成了\。能想到的解决办法就是当magic_quotes_gpc=On的时候用stripslashes0函数去掉转义字符,在magic_quotes_gpc=Off的时候直接把POST过来的文件内容写入文件。怎样知道magic_quotes_gpc- On还是magic_quotes_gpc=Off呢?这时候就需要用到get_magic_quotes_gpc()函数了。这个函数当magic_quotes_gpc=On时返回1,当magic_quotes_gpc=Off时返回O。思路是对于POST过来的数据,先放到一个变量中,通过get_magic_quotes_gpc()函数判断是magic_quotes_gpc=On还是magic_quotes_gpc= Off,如果magic_quotes_gpc= On就把数据经过stripslashes()函数去掉转义字符后写入文件;如果magic_quotes_gpc= Off,则把数据直接写入文件。


用最新的diy.php再次写一个PhpSpy 2011,文件名为phpspy_offl.php,然后访问,这次没有什么问题了。

把magic_quotes_gpc= Off修改为maglc_quotes_gpc=0n,再次写大马上去成功。又试了带路径写入文件,都成功。至此,我的这个PHP小马就写完了,当然,它还有很多不完善的地方,比如是否写入文件成功没有提示,界面太丑陋等。因为是刚开始接触PHP,就只能先写到这里了。等以后可能会完善它,哈哈。

由于是以前写的文章,知道的东西太少,写的PHP小马有什么bug或逻辑不严谨,不过都在进步嘛,我危险漫步也是一样!

相关推荐