关于PHP的注入问题

By cnbird[H.U.C]河北泊头杨宁
    大家好,我是cnbird[H.U.C]相信读过黑客防线的的朋友对我一定不会陌生吧,对了第二期中的从web漏洞到root权限全展现就是我写的,但是 由于第一次投稿失误,导致黑客防线和黑客手册都同时发布,影响了读者们的阅读兴趣,再这里我向大家真诚的道歉,并且以后多给黑手的朋友们写点有技术含量的 文章,希望大家不要怪罪于我就好了。
今天我要给大家讲解的是一个非常NB的入侵过程,我自己觉得非常的精彩,里面包含了非常多的知识点,这对与完全不懂php的朋友一样能够读懂,并且按照里面的技术自己来进行入侵类似的网站,并且能够得到非常好的效果。
   现在SQL注入漏洞满地揭是,并且开发出很多优秀的工具例如NBSI,和CASI等等。这对于我们这样的菜鸟来说非常好了,因为完全避免了我们自己手动来 一点点的猜测了,大大的提高了入侵率。。好了废话不多说直接进入我们的文章,来一次梦幻之旅,相信你再这里一定能够找到属于你自己的东西。
一.基础知识
首先我还是罗嗦一句php漏洞的形成的基本的原理,很多人认为在PHP+MYSQL下注入一定要用到单引号,或者是没有办法像MSSQL那样可以使用 “declare @a sysname select @a=<command> exec master.dbo.xp_cmdshell @a”这类的命令来消除引号,其实这个是大家对注入的一种误解或这说是对注入认识上的一种误区。
为什么呢?因为不管在什么语言里,在引号(包括单双)里,所有字符串均是常量,即使是dir这样的命令,也紧紧是字符串而已,并不能当做命令执行,除非是这样写的代码:

$command = "dir c:\";
system($command);  
否则仅仅只是字符串,当然,我们所说的命令不单指系统命令,我们这里说的是SQL语句,要让我们构造的SQL语句正常执行,就不能让我们的语句变成字符串,那么什么情况下会用单引号?什么时候不用呢?看看下面两句SQL语句:

①SELECT * FROM article WHERE articleid='$id'
②SELECT * FROM article WHERE articleid=$id  
两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正 确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执 行,我们针对两个句子分别提交两个成功注入的畸形语句,来看看不同之处。

① 指定变量$id为:
1' and 1=2 union select * from user where userid=1/*
此时整个SQL语句变为:
SELECT * FROM article WHERE articleid='1' and 1=2 union select * from user where userid=1/*'
②指定变量$id为:
1 and 1=2 union select * from user where userid=1
此时整个SQL语句变为:
SELECT * FROM article WHERE articleid=1 and 1=2 union select * from user where userid=1  
看出来了吗?由于第一句有单引号,我们必须先闭合前面的单引号,这样才能使后面的语句作为SQL执行,并要注释掉后面原SQL语句中的后面的单引号,这样 才可以成功注入,如果php.ini中magic_quotes_gpc设置为on或者变量前使用了addslashes()函数,我们的攻击就会化为乌 有,但第二句没有用引号包含变量,那我们也不用考虑去闭合、注释,直接提交就OK了。
知道原理了,我们就可以很容易的来入侵网站了,今天我们的目标是http://www.ycxljy.com/西陵区教育信息网,貌似看起来做的还挺全面的,如图1所视,但是不知道安全性如何呢?我大概的看了一下新闻,http://www.ycxljy.com/show.php?id=1742从 地址格式上来看是PHP的,我很习惯的在1742后面输入了一个’,现在成了职业病了,结果却大跌眼镜,如图二所视,报错了,而且直接把web的路径都给 暴露出来了,路径为F:\xljyxxw\show.php,有了这个东东我们下面的事就很好办了,无非就是构造语句了,我们接着输入and 1=1, and 1=2测试出有php注入漏洞。
下面详细介绍一下我们要用到的一个mysql的函数load_file(),因为很多东西都用的到这个函数。我们知道,在SQL语句中,可以使用各种 MySQL内置的函数,经常使用的就是DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()、 CURRENT_USER()这些函数来获取一些系统的信息,还有一个应用得比较多的函数,就是load_file(),该函数的作用是读入文件,并将文 件内容作为一个字符串返回。
看到这里,应该可以想到我们可以做什么了,就是读取一些机密文件,但是也是有条件限制的:
· 欲读取文件必须在服· 务器上
· 必须指· 定文件完整的路径
· 必须有权限读取并且文件必须完全可读
· 欲读取文件必须小于 max_allowed_packet
如果该文件不存在,或因为上面的任一原因而不能被读出,函数返回空。比较难满足的就是权限,在windows下,如果NTFS设置得当,是不能读取相关的文件的,当遇到只有administrators才能访问的文件,users就别想load_file出来。
在实际的注入中,我们有两个难点需要解决:
· 绝对物理路径
· 构造有效的畸形语句
第一个绝对物理路径我们已经解决了,构造有效的语句就是小意思了。
           二.构造SQL注入语句
    php注入与asp注入还是有区别的,我们要进行的是跨表查询要用到UNION.UNION是连接两条SQL语句,UNION后面查选的字段数量、字段类型都应该与前面SELECT一样.通俗点说如果查寻对的话就出现正常的页面.接着注入http://www.ycxljy.com/show.php?id=1742%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10/*出现的是错误的页面.说明还没有找对字段.不停的改变select后面的数字,当数字改变为19候出现了正常的页面如图三,我们直接读取用户和密码,经过N多测试终于找到了我就直接把地址给出http://www.ycxljy.com/show.php?id=1742%20and%201=2%20union%20select%201,username,3,4,5,password,7,8,9,10%20from%20user/*如图4,得到了用户名是admin007,密码是我是中国人。。。。真变态啊。下面我们直接进入后台http://www.ycxljy.com/admin/ 然后输入我们得到的用户和密码,呵呵登陆成功如图5。我们点击添加资料,呵呵出现了一个可以上传的地方如图6,我们直接把我们的php上传我以为到这里入 侵就结束了,但是结果往往不是那么简单的,我们得到了失败的提示如图7到这里看来这条路走不通了,我们继续走load_file()的道路吧。
三.另外的思路
看来后台是没有什么可以利用的了,我们还是用我们以前介绍的load_file()来入侵吧,我们构造语句。因为从暴错的路径上来看是windows的, 但是具体是什么版本到现在我还没有弄清楚,我们下面来读取c:\boot.ini文件就可以得到windows操作系统的版本了,具体的构造语句如下http://www.ycxljy.com/show.php?id=1742%20and%201=2%20union%20select%201,2,3,4,5,load_file(char(99,58,92,98,111,111,116,46,105,110,105)),7,8,9,10/*
如图8得到了windows的操作系统为Windows Server 2003, Enterprise的,下面我们就不用手动的方法了,相信菜鸟朋友也不会看清楚,我直接用CASI4.0来进行下面的操作,输入有漏洞的地址,然后点 ScanNum如图9,我们点CASI的暴代码按钮,我们在目标文件绝对路径中输入我们得到的路径F:\xljyxxw\show.php,插入位置选择 9,如图10我们得到了show.php的源代码,顺藤摸瓜看代码最后在F:\xljyxxw\bbs\admin\config.php中找到了 root的密码为junly608,但是用Mysql连接的时候说错误,估计防火墙过滤了。我们继续用CASI的得到webshell功能,结果也没有得 到webshell,现在入侵一切进入了一个无底的黑洞了。暂时没有了思路,和CnhCerKF聊了半天,也没有找到好办法。一个小时的就这样过去了,算 了陪老婆睡觉吧。也许明天就能有思路了。
四.最后的思路
    没办法,继续用admin007密码我是中国人登陆到后台看了一下,我上次没有看到可以上传图片的,我也试了一下用php+gif的方法,也失败了。我无意的看到了上传的目录是img下。我就输入http://www.ycxljy.com/img/结果出呼了我的意料,如图10,我晕原来是目录设置错误了,可以读取img的目录下的文件,我仔细找了半天,我靠竟然有以外收获,我说我以前的后台不能上传文件呢,原来早就有人捷足先登了,如图11,有人上传了okphp.php的文件,到这里思路就清楚了,我们直接输入http://www.ycxljy.com/img/okphp.php结 果需要密码,但是没关系我们可以读取okphp.php的文件拿到密码不就可以登陆了嘛?okphp.php的具体路径是F:\xljyxxw\img\ okphp.php,如图12,我们已经得到了源文件,我靠,结果却又让我失望了,为什么,你一次一次的给我希望又一次一次的摧残我,原来是源文件加密 了,这可如何是好啊?没办法了,因为我虽然懂PHP脚本但是还没有自己解过密,我自己也没有当真,就没有当回事,直接把这个东西发到了www.chinaunix.com上 面,让他们来解吧,果然不到20分钟的时间就有人回复了,还真快,告诉我如何解密,原来这么简单,都怪我太大意了,如图13我们已经知道如何解了,我们直 接就把源代码输入到Zend里面,然后在我自己构件的apache+php+mysql平台上执行就得到了如图14的结果。我点击右键查看源代码,呵呵, 我们需要的结果都出来了,如图15。我们赶紧输入密码dhyhack,如图16登陆成功.呵呵终于经过艰难万苦得到了webshell。
    具体的提权交给大家去做吧。我们总结一下我们的思路首先找到PHP注入点->登陆后台->上传PHPWEBshell结果失败了->利 用load_file()函数读取一些重要的文件->找到服务器目录设置不严格的权限得到了别的黑客的后门->解密以后得到密码->得 到webshell,看着非常简单,其实非常的难,一步一步的衔接没有我文章写的那么简单,我是详细分析了很长时间才最终的得到webshell的,我的 意思不是说我多牛X,我说的就是入侵就像罗积木只有一点点的积累才能最终得到你所想要的结果。呵呵,希望大家喜欢这期的文章,我会更加努力的为大家奉献上 更加精彩的文章,敬请期待。