现在的位置: 首页 > 综合 > 正文

浅试sql(mysql)注入(php,apache,mysql环境)

2014年06月26日 ⁄ 综合 ⁄ 共 1664字 ⁄ 字号 评论关闭

先语:

本人作为开发者.

个人学习所用.

 不断更新.

2014/02/27.

2014/02/28.

情况1:密码不加密

如果不加密,密码在数据库中为明文.

$sql  = "SELECT * FROM `user` WHERE `name`='$user' AND `pwd`= '$pwd'";

如果密码为

$pwd = "1' OR '1'='1";

即可登陆成功

$sql = "SELECT * FROM `user` WHERE `name`=".$user." AND `pwd`= ".$pwd."";

如果密码为

$pwd = "1 OR 1=1";

即可登陆成功.

注释:

明文密码在这个时代是很少见的.所以这种简单的sql注入还是很少见的.

对策:

上述注入密码加密就可以避免了.

情况2:密码加密

如果密码md5加密,

数据库内容如图

密码经过md5加密,不是很复杂的密码,有兴趣的可以解密.

跳过登陆验证:

$sql  = "SELECT * FROM `user` WHERE `name`='$user' AND `pwd`= '$pwd'";

如果用户名为

$user = "' OR 1=1 -- ";

即可登陆成功.

$sql = "SELECT * FROM `user` WHERE `name`=".$user." AND `pwd`= ".$pwd."";

如果用户名为

$user = "1 OR 1=1 -- ";

即可登陆成功

对策:

$user = str_replace(' ','',$user);
$pwd = str_replace(' ','',$pwd);

即可解决此两种风格问题.

$user = addslashes($user);
$pwd = addslashes($pwd);
$sql = "SELECT * FROM `user` WHERE `name`=".$user." AND `pwd`= ".$pwd."";

以上风格无法解决.

$sql  = "SELECT * FROM `user` WHERE `name`='$user' AND `pwd`= '$pwd'";

以上风格可解决.

推荐上述两种处理数据方式一并使用.
 mysql_real_escape_string()和addslashes()函数作用类似.

注释:默认情况下,PHP
指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

重设密码波及其他用户甚至管理员账号(举例使用一种,代码风格变化类推即可)

此时密码加密但并未进行其他的保护措施.

$sql = "UPDATE `user` SET `pwd`='$pwd' WHERE `name`='$user'";

用户名及密码为

//波及名字内含有1的所有用户
$user = "' OR `name` LIKE '%1%'; -- ";
$pwd = "123";
//波及名字内含有admin的所有用户,默认管理员账户往往为admin或与admin相关
$user = "' OR `name` LIKE '%admin%'; -- ";
$pwd = "123";
//波及所有用户
$user = "' OR `name`<>''; -- ";
$pwd = "123";

以上即可将目标用户密码更改为123

从而威胁用户使用安全

对策:

$user = str_replace(' ','',mysql_real_escape_string($user));
$pwd = str_replace(' ','',mysql_real_escape_string($pwd));

即可.

通过限制查询

有些限制环节,比如只允许查询与自己相近的上下10条的资料

$sql = "SELECT * FROM `user` WHERE id='1' LIMIT 1 OFFSET $offset";

在查询处更改

$offset = "0 UNION SELECT * FROM `user` -- ";

即可获得所有用户资料

对策:

$offset = intval($offset);

即可解决此问题.

抱歉!评论已关闭.