热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP漏洞之SQL注入攻击简单介绍_PHP教程

PHP漏洞之SQL注入攻击简单介绍。SQL注入是一种攻击,允许攻击者增加额外的逻辑表达式和命令,以现有的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的一个非常基本的外壳是将(参数通过加利福尼亚 ):

代码如下

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


推荐阅读
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
author-avatar
路人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有