前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >web渗透测试--防sql注入

web渗透测试--防sql注入

作者头像
我被狗咬了
发布2019-09-23 17:41:51
2.6K0
发布2019-09-23 17:41:51
举报
文章被收录于专栏:Python乱炖

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

什么时候最易受到sql注入攻击

   当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的 字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问 题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多 网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码, 根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

如何防止SQL注入

  归纳一下,主要有以下几点:

  1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和

  双"-"进行转换等。

  2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

  3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

  4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

  5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

  6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。

例子一、SQL注入实例详解(以上测试均假设服务器未开启magic_quote_gpc)

  1) 前期准备工作

  先来演示通过SQL注入漏洞,登入后台管理员界面

  首先,创建一张试验用的数据表:

  CREATE TABLE `users` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(64) NOT NULL,

  `password` varchar(64) NOT NULL,

  `email` varchar(64) NOT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `username` (`username`)

  ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

  添加一条记录用于测试:

  INSERT INTO users (username,password,email)

  VALUES('MarcoFly',md5('test'),'marcofly@test.com');

  接下来,贴上登录界面的源代码:

<html> <head> <title>Sql注入演示</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head>

<body > <form action="validate.php" method="post"> <fieldset > <legend>Sql注入演示</legend> <table> <tr> <td>用户名:</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密&nbsp;&nbsp;码:</td> <td><input type="text" name="password"></td> </tr> <tr> <td><input type="submit" value="提交"></td> <td><input type="reset" value="重置"></td> </tr> </table> </fieldset> </form> </body> </html>

  当用户点击提交按钮的时候,将会把表单数据提交给validate.php页面,validate.php页面用来判断用户输入的用户名和密码有没有都符合要求(这一步至关重要,也往往是SQL漏洞所在)

  代码如下:

<html> <head> <title>登录验证</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head>

<body> <?php

$conn=@mysql_connect("localhost",'root','') or die("数据库连接失败!");;

mysql_select_db("injection",$conn) or die("您要选择的数据库不存在");

$name=$_POST['username'];

$pwd=$_POST['password'];

$sql="select * from users where username='$name' and password='$pwd'";

$query=mysql_query($sql);

$arr=mysql_fetch_array($query);

if(is_array($arr)){

header("Location:manager.php");

}else{

echo "您的用户名或密码输入有误,<a href=\"Login.php\">请重新登录!</a>";

}

?> </body> </html>

  注意到了没有,我们直接将用户提交过来的数据(用户名和密码)直接拿去执行,并没有实现进行特殊字符过滤,待会你们将明白,这是致命的。

  代码分析:如果,用户名和密码都匹配成功的话,将跳转到管理员操作界面(manager.php),不成功,则给出友好提示信息。

 2) 构造SQL语句

  填好正确的用户名(marcofly)和密码(test)后,点击提交,将会返回给我们“欢迎管理员”的界面。

  select * from users where username='marcofly' and password=md5('test')

  很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。

  比如:在用户名输入框中输入:’ or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:

  select * from users where username='' or 1=1#' and password=md5('')

  语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:

  select * from users where username='' or 1=1#' and password=md5('')

  等价于

  select * from users where username='' or 1=1

SQL注入采用的' OR 1=1 # 是什么意思呢?
最后一个#号有什么意义呢? SELECT * FROM test WHERE name='' OR 1=1 #' AND age='20' 这后面写的 #' 是什么意思呢? 求指教 # 可以注释掉后面的一行SQL代码 相当于去掉了一个where条件

MySQL 注释, 过滤掉后面的SQL语句,使其不起作用

因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:

select * from users 没错,该sql语句的作用是检索users表中的所有字段

小技巧:一个经构造后的sql语句竟有如此可怕的破坏力,相信你看到这后,开始对sql注入有了一个理性的认识了吧~

有漏洞的脚本才有机会给你攻击,比如一个带参数的删除脚本a.asp?action=del&id=2你可以改为a.asp?action=del&id=2 or 1这样就有可能删除全部数据------sql注入就是通过类似的手段来破坏数据.

现在大家已经对SQL Injection的攻击有了初步的了解了,接下让我们学习如何防止SQL Injection。

总的来说有以下几点:

1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。 2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。 3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python乱炖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么时候最易受到sql注入攻击
  • 如何防止SQL注入
    • SQL注入采用的' OR 1=1 # 是什么意思呢?
      • 最后一个#号有什么意义呢? SELECT * FROM test WHERE name='' OR 1=1 #' AND age='20' 这后面写的 #' 是什么意思呢? 求指教 # 可以注释掉后面的一行SQL代码 相当于去掉了一个where条件
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档