第三篇:php后台注入与安全

时间:2024-03-09 08:02:37

作者:Julie_nana
来自:{ Silic Group }
php以其跨平台的优越性著称。很多网站采用php编写。因为没有像asp那么多的入侵工具,很多人对php的后台并不重视。
我发现很多的get方式登录的后台,但他们大多都不安全。
我们看一个php登陆代码(GET):


  1. $conn=mysql_connect("ip","name","pass");
  2. //连接数据库信息
  3. $query="select uid from admin where adminname=\'$_get["adminname"]\'
  4. "and password =\'$_get["password"]\'";
  5. //判断get来的是否正确
  6. $result=mysql_query($query);

复制代码


既然是GET,当我们的登录名是nm,密码是pa,php源:


  1. select uid from admin where adminname=\'nm\'
  2. and password =\'pa\';
复制代码


地址栏就成了:
adminlogin.php?adminname=nm&password=bar

如果在地址栏后面加\'or\'1\'=\'1
原来的地址就成了:
adminlogin.php?adminname=nm&password=bar\'or\'1\'=\'1

再回来看源:


  1. select uid from admin where adminname=\'nm\'
  2. and password =\'pa\'or\'1\'=\'1\';
复制代码


一次php完美的简单注射就完成了。
其实xss的攻击思想和这个是十分相似的。不知道大家明白了SQL注射没有。所以并不建议大家用get方式接收后台登录验证信息。
我的博客是用get方式请求显示后台登陆,但是验证信息获取并不靠get

这是一次我搞的安全活动的内容:
admin_login.php是后台管理入口,页面有两个表单:管理名和密码。
在原始代码中对应的变量分别是$admin_name和$admin_pass,登录验证代码为:

  1. select * from administrator
  2. where adminname = \'$_GET[admin_name]\' and admin_pass = \'$_GET[admin_pass]\'
复制代码


这时我在两个表单分别填写:
admin\'/*hacking by Juliet!
japanese all are dogs*/\'
结果我就进了管理后台了。请问原因是什么?
提示:答案共分三个要点,数据库,原始页面,和php程序本身。

后来评出来的标准答案:

原始的表单应该有类似下边的代码:
  1. <FORM ACTION=“admin_login.php” METHOD=“get”>
  2. <INPUT TYPE=“text” NAME=“admin_name” VALUE=“”></INPUT>
  3. <INPUT TYPE=“password” NAME=“admin_pass” VALUE=“”></INPUT>
  4. ……
复制代码

当输入表单提交以后,浏览器的地址栏就会出现“admin_login.php?admin_name=admin&admin_pass=password“(假如输入的是admin和password)。这些都表明表单是通过get方式来提交的。
由于admin_login.php没有对敏感字符进行过滤,直接将变量带入SQL语句中验证,结果造成SQL注入漏洞,当提交“admin\'/*hacking by Juliet!”和“japanese all are dogs*/\'”之后,SQL语句就变成
  1. select * from administrator
  2. where adminname = \'admin\'/*hacking by Juliet!\' and admin_pass = \'japanese all are dogs*/\'\'
复制代码

由于"/*"在SQL语法中表示的是注释,结果后边密码比较的部分就被注释掉,实际执行的SQL语句为:
  1. select * from administrator
  2. where adminname = \'admin\'
复制代码

结果,只要数据库中的administrator表中存在admin这个用户名就可以直接进入后台了。如果没有这个用户名的话,那么就不能进入后台