php漏洞之sql注入攻击简单介绍

sql注入是一种攻击,允许攻击者增加额外的逻辑表达式和命令,以现有的sql查询,种攻击能够成功每当用户提交的数据是不正确验证,并粘有一个合法的sql查询在一起,所以说sql注入攻击并不是php的问题而程序员的问题。

sql注入攻击的一般步骤:

  1、攻 击者访问有sql注入漏洞的站点,寻找注入点

  2、攻击者构造注入语句,注入语句和程序中的sql语句结合生成新的sql语句

  3、新的sql语句被提交到数据库中执行 处理

  4、数据库执行了新的sql语句,引发sql注入攻击

 实例

  数据库

  create table `postmessage` (

  `id` int(11) not null auto_increment,

  `subject` varchar(60) not null default “,

  `name` varchar(40) not null default “,

  `email` varchar(25) not null default “,

  `question` mediumtext not null,

  `postdate` datetime not null default ‘0000-00-00 00:00:00′,

  primary key (`id`)

  ) engine=myisam default charset=gb2312 comment=’运用者的留言’ auto_increment=69 ;

  grant all privileges on ch3.* to ‘sectop’@localhost identified by ‘123456′;

  //add.php 插入留言

  //list.php 留言列表

  //show.php 显示留言

  页面 /show.php?id=71 可能存在注入点,我们来测试

  /show.php?id=71 and 1=1

  返回页面

  一次查询到记录,一次没有,我们来看看源码

  //show.php 12-15行

  // 执行mysql查询语句

  $query = “select * from postmessage where id = “.$_get[“id”];

  $result = mysql_query($query)

  or die(“执行ysql查询语句失败:” . mysql_error());

  参数id传递进来后,和前面的字符串结合的sql语句放入数据库执行 查询

  提交 and 1=1,语句变成select * from postmessage where id = 71 and 1=1 这语句前值后值都为真,and以后也为真,返回查询到的数据

  提交 and 1=2,语句变成select * from postmessage where id = 71 and 1=2 这语句前值为真,后值为假,and以后为假,查询不到任何数据

  正常的sql查询,经过我们构造的语句之后,形成了sql注入攻击。通过这个注入点,我们还可以进一步拿到权限,比如说运用 union读取管理密码,读取数据库信息,或者用mysql的load_file,into outfile等函数进一步渗透。

防sql注入方法

$id = intval ($_get[‘id’]);

当然,还有其它的变量类型,如果有必要的话尽量强制一下格式。

字符型参数:

运用 addslashes函数来将单引号”‘”转换成”‘”,双引号”””转换成”””,反斜杠””转换成”\”,null字符加上反斜杠””

  函数原型

  string addslashes (string str)

   str是要检查的字符串

  那么刚才出现的代码漏洞,我们可以这样修补

  // 执行mysql查询语句

  $query = “select * from postmessage where id = “.intval($_get[“id”]);

  $result = mysql_query($query)

or die(“执行ysql查询语句失败:” . mysql_error());

如果是字符型,先判断magic_quotes_gpc能无法 为on,当不为on的时候运用 addslashes转义特殊字符

代码如下

  if(get_magic_quotes_gpc())

  {

  $var = $_get[“var”];

  }

  else

  {

  $var = addslashes($_get[“var”]);

  }

]

sql语句中包含变量加引号

sql代码:

代码如下

select * from article where articleid = ‘$id’

select * from article where articleid = $id

两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的sql语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为sql语句执行,因此,我们要养成给sql语句中变量加引号的习惯。

3. url伪静态化

url伪静态化也就是url重写技术,像discuz!一样,将所有的url都rewrite成类似xxx-xxx-x.html格式,即有利于seo,又达到了一定的安全性,也不失为一个好办法。但是想实现php防sql注入,前提是你得有一定的”正则”基础。

4. 用php函数过滤与转义

php的sql注入比较重要的一点就是gpc的设置问题,因为mysql4以下的版本是不支持子语句的,而且当php.ini里的magic_quotes_gpc为on时,提交的变量中所有的 ” ‘ “(单引号)、” ” “(双引号)、” “(反斜线)和空字符都会自动转为含有反斜线的转义字符,给sql注入带来不少的阻碍。

5. 用php的mysql函数过滤与转义

php的mysql操作函数中有addslashes()、mysql_real_escape_string()、mysql_escape_string()等函数,可将特殊字符或可能引起数据库操作出错的字符转义。

那么这三个功能函数之间有什么区别呢?下面我们来详细讲述下:

① addslashes的问题在于黑客可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,称为一个有效的多字节字符,其中0xbf5c仍会被看做是单引号,所以addslashes无法成功拦截。

当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。

另外对于php手册中get_magic_quotes_gpc的举例:

代码如下

if(!get_magic_quotes_gpc()){ $lastname = addslashes($_post[‘lastname’]);}else{ $lastname = $_post[‘lastname’];}

最好对magic_quotes_gpc已经打开的情况下,还是对$_post[‘lastname’]进行检查一下。

再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:

代码如下

function daddslashes($string, $force = 0, $strip = false) {
if(!magic_quotes_gpc || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force, $strip);
}
} else
{
$string = addslashes($strip ? stripslashes($string) : $string);
}
}
return $string;
}

命令1 – 写任意文件

mysql有一个内置的命令,可用于创建和写入系统文件。 此命令的格式如下:

代码如下

mysq> select “text” into outfile “file.txt”

此命令的一个大缺点是,它可以被附加到一个现有的查询使用union的sql令牌。

例如,它可以被附加到下面的查询:

代码如下

select user, password from user where user=”admin” and password=’123′
结果查询:

select user, password from user where user=”admin” and password=’123′ union select “text”,2 into outfile “/tmp/file.txt” — ‘

作为对上述命令的结果,在/ tmp / file.txt文件将被创建,包括查询结果。
命令2 – 读任意文件
mysql有一个内置的命令,可以用来读取任意文件。 它的语法很简单。 b .我们将利用这个 b命令计划 。

代码如下

mysql> select load_file(“path_to_file”);

web shell

webshell是polpular并广泛用于执行在web浏览器从shell命令的工具。 .有人称之为这些工具的php炮弹。 我们将创建一个非常简单的webshell,将执行shell命令。

下面是执行的代码php的一个非常基本的外壳是将(参数通过加利福尼亚 ):

代码如下

http://www.bkjia.com/phpjc/629607.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/629607.htmltecharticlesql注入是一种攻击,允许攻击者增加额外的逻辑表达式和命令,以现有的sql查询,种攻击能够成功每当用户提交的数据是不正确验证,并粘…

Posted in 未分类