SQL 注入漏洞原理以及修复方法

这篇具有很好参考价值的文章主要介绍了SQL 注入漏洞原理以及修复方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

漏洞名称 :SQL注入 、SQL盲注

漏洞描述:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 造成SQL注入漏洞原因有两个:一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。

检测条件 :

1、 Web业务运行正常
2、 被测网站具有交互功能模块,涉及到参数提交等等。
3、 例如待测目标URL,假设为http://www.exmaple.com/page.xxx
4、 待测目标存在参数输入,假设为name=value

检测方法

一、 通过web漏洞扫描工具进行对网站爬虫后得到的所有链接进行检测,或者手工判断是否存在注入点,一旦确认存在漏洞,可利用自动化工具sqlmap去尝试注入。几种常见的判断方法:

1、 数字型。测试方法:
http://host/test.php?id=100 and 1=1 返回成功
http://host/test.php?id=100 and 1=2 返回失败


2、 字符型。测试方法:
http://host/test.php?name=rainman ’ and ‘1’=‘1 返回成功
http://host/test.php?name=rainman ’ and ‘1’=‘2 返回失败


3、 搜索型。搜索型注入:简单的判断搜索型注入漏洞存在不存在的办法是:
3.1)先搜索('),如果出错,说明 90%存在这个漏洞。
3.2)然后搜索(%),如果正常返回,说明 95%有洞了。
3.3)然后再搜索一个关键字,比如(2006)吧,正常返回所有 2006 相关的信息。
3.4)再搜索(2006%'and 1=1 and '%'=')和(2006%'and 1=2 and '%'=')


4、 绕过验证(常见的为管理登陆)也称万能密码
(1) 用户名输入: ‘ or 1=1 or ‘ 密码:任意
(2)Admin’ - -(或‘ or 1=1 or ‘ - -)(admin or 1=1 --) (MS SQL)(直接输入用户名,不进行密码验证)(3)用户名输入:admin 密码输入:’ or ‘1’=’1 也可以
(4) 用户名输入:admin' or 'a'='a 密码输入:任意
(5) 用户名输入:‘ or 1=1 - -
(6) 用户名输入:admin‘ or 1=1 - - 密码输入:任意
(7) 用户名输入:1'or'1'='1'or'1'='1 密码输入:任意


5、 不同的 SQL 服务器连结字符串的语法不同,比如 MS SQL Server 使用
符号+来连结字符串,而 Oracle 使用符号||来连结:
http://host/test.jsp?ProdName=Book’ 返回错误
http://host/test.jsp?ProdName=B’+’ook 返回正常
http://host/test.jsp?ProdName=B’||’ook 返回正常说明有 SQL 注入

二、 如果应用程序已经过滤了’和+等特殊字符,我们仍然可以在输入时过把字符转换成URL编码(即字符ASCII码的16进制)来绕过检查。

修复方案

建议在代码中对数字类型的参数先进行数字类型变换,然后再代入到SQL查询语句中,这样任何注入行为都不能成功。并且考虑过滤一些参数,比如get参数和post参数中对于SQL语言查询的部分。所以防范的时候需要对用户的输入进行检查。特别式一些特殊字符,比如单引号,双引号,分号,逗号,冒号,连接号等进行转换或者过滤。以下为需过滤的敏感字符或者语句:

需要过滤的特殊字符及字符串有:
net user
xp_cmdshell
add
exec master.dbo.xp_cmdshell
net localgroup administrators
select
count
Asc
char
mid


"
insert
delete from
drop table
update
truncate
from
%

常见的几种web语言修复方案如下:

1、 如果网站使用的语言为asp或者aspx,则可参考以下修复方法:

ASP一般编程上可参考以下代码编程思路,过滤GET/POST请求模块代码。

dim SQL_injdata
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncate|char|declare"
SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr ( Request.QueryString
(SQL_Get),SQL_Inj(SQL_DATA))>0
Then
Response.Write "参数中包含非法字符"
Response.end
end if
next
Next

2.对于PHP语言编写的网站,大都是和mysql数据库结合的,可通过如下几种方法结合起来防范SQL注入的漏洞:

(1)修改php中默认配置文件php.ini中的配置,来降低sql注入的风险.

参考路径:/usr/local/apache2/conf/php.ini,不同中间件可能位置不一样。
修改如下几项:

safe_mode = on //开启安全模式
magic_quotes_gpc = On //开启过滤函数
display_errors = Off //禁止错误信息提示
注:把magic_quotes_gpc选项打开,在这种情况下所有的客户端GET和POST的数据都会自动进行addslashes处理,所以此时对字符串值的SQL注入是不可行的,但要防止对数字值的SQL注入,如用intval()等函数进行处理。但如果你编写的是通用软件,则需要读取服务器的magic_quotes_gpc后进行相应处理。

(2)在GET提交的数据中进行过滤select 、update、delete、insert等其他语句。使用正则就构建如下函数:

<?php
function inject_check($sql_str)
{
return eregi('select|insert|update|delete|'|
function verify_id($id=null)
{
if (!$id) { exit('没有提交参数!'); } // 是否为空判断
elseif (inject_check($id)) { exit('提交的参数非法!'); } // 注
射判断
elseif (!is_numeric($id)) { exit('提交的参数非法!'); } // 数
字判断
$id = intval($id); // 整型化
return $id;
}
?>
然后进行对某个参数的过滤:
<?php
if (inject_check($_GET['id']))
{
exit('你提交的数据非法,请检查后重新提交!');
}
else
{
$id = verify_id($_GET['id']); // 这里引用了我们的过滤函数,
对$id进行过滤
echo '提交的数据合法,请继续!';
}
?>

(3)在POST提交的数据中,使用函数addslashes()是最终的比较好的方法,构建如下函数:

<?php
function str_check( $str )
{
if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否打开
{
$str = addslashes($str); // 进行过滤
}
$str = str_replace("_", "\_", $str); // 把 '_'过滤掉
$str = str_replace("%", "\%", $str); // 把' % '过滤掉
return $str;
}
?>
对于大批量的数据,修改为如下:
<?php
function post_check($post)
{
if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打
开
{
$post = addslashes($post); // 进行magic_quotes_gpc没有打开的
情况对提交数据的过滤
}
$post = str_replace("_", "\_", $post); // 把 '_'过滤掉
$post = str_replace("%", "\%", $post); // 把' % '过滤掉
$post = nl2br($post); // 回车转换
$post= htmlspecialchars($post); // html标记转换
return $post;
}
?>

(4)对于MySQL用户,可以使用函数mysql_real_escape_string( ):

<?php
$clean = array();
$mysql = array();
$clean['last_name'] = "O'Reilly";
$mysql['last_name'] =
mysql_real_escape_string($clean['last_name']);
$sql = "INSERT
INTO user (last_name)
VALUES ('{$mysql['last_name']}')";
?>

(5)使用支持参数化查询语句和占位符的数据库操作类(如PEAR::DB, PDO等),如使用PEAR::DB的例子:

<?php
$sql = 'INSERT
INTO user (last_name)
VALUES (?)';
$dbh->query($sql, array($clean['last_name']));
?>

以上方法结合使用,则可有效的防止在PHP语言网站的SQL注入。

3、 对于jsp语言类型的网站,建议采用如下方法进行修复:

(1)通过参数化查询方式进行SQL注入攻击防护,参考代码:

using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
//为每一条数据添加一个参数
comm.CommandText = "select COUNT(*) from Users where
Password = @Password and UserName = @UserName";
comm.Parameters.AddRange(
new SqlParameter[]{
new SqlParameter("@Password", SqlDbType.VarChar)
{ Value = password},
new SqlParameter("@UserName", SqlDbType.VarChar)
{ Value = userName},});
comm.ExecuteNonQuery();
}
//以‚?‛等位符进行参数化查询
PreparedStatement pstmt = con.prepareStatement("select * from
table where name = ?");
pstmt.setString(1, para);
ResultSet rs = pstmt.executeQuery();

(2)使用MyBatis技术,通过Mapper.xml文件定义SQL语句进行SQL注入攻击防护,参考代码:

<mapper namespace="TestUser">//命名空间
<select id="getById" parameterType="java.lang.String"
resultMap="TestFlowResult">
select
<include refid="TestFlowColumns" />
<![CDATA[
from TEST_TABLE
where
INSPECT_ID = #{id}
]]>
</select>
</mapper>

注:在编写mybatis的映射语句时,尽量采用‚#{xxx}‛这样的格式。若不得不使用‚${xxx}‛这样的参数,要手工地做好过滤工作,来防止sql注入攻击。

(3)使用特殊字符过滤程序防护SQL注入攻击,参考代码:

public static bool SqlCheck(string OldString)
{
bool Checkvalue = false;
string NewString = OldString.ToLower();
string Replace =
"'|and|exec|insert|select|delete|update|count|*|;
|%|union|chr|mid|master|truncate|char|declare|asc|cast|
set|fetch|varchar|sysobjects|drop|alert|script|<|>";
string[] arrReplace = Replace.Split('|');
for (int i = 0; i < arrReplace.Length; i++)
{
if (NewString.IndexOf(arrReplace[i].ToString()) >= 0)
{
bolvalue = true;
break;
}
}
return Checkvalue;
}

4、 除此之外,还可以进行对数据库方面进行加固,来防止sql注入的产生:

(1)、 不要以sysadmin的身份连接数据库。而是使用特定的数据库用户,只具有读取,写入和更新数据库中适当数据的适当特权。此帐户定期检查,确定它所具有的特权。
(2)、 以安全的方式创建SQL。让数据库来完成创建SQL的工作,而不是在代码中完成。使用参数化SQL语句,同时也能提高查询的效率。
(3)、 保证数据库用户连接信息非明文保存。

5、 除此之外,还可以进行对管理方面进行加固,来防止sql注入的产生

(1)、 加强编程人员良好的安全编码意识,系统地学习安全编码的知识,减少源代码泄露的风险。
(2)、 建立起良好的代码审核、审查体系。由专人负责代码的审计,增加安全监督环节。文章来源地址https://www.toymoban.com/news/detail-821057.html

到了这里,关于SQL 注入漏洞原理以及修复方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网站代码sql注入攻击漏洞修复加固防护措施

    什么是SQL注入攻击? SQL注入是一种网站的攻击方法。它将SQL代码添加到网站前端GET POST参数中,并将其传递给mysql数据库进行分析和执行语句攻击。 如何生成SQL注入漏洞的? 1。网站程序员以及运维技术是不能保证所有的前端输入都被安全效验与拦截过滤。 2。攻击者使用发送

    2024年02月01日
    浏览(43)
  • 漏洞原理 SQL 注入

    OWASP漏洞原理启航(第一课)-CSDN博客 OWASP漏洞原理<最基础的数据库 第二课>-CSDN博客 小皮面板(phpstudy

    2024年02月20日
    浏览(41)
  • Web安全:SQL注入漏洞测试.

    SQL注入就是 有些 恶意用户在提交查询请求的过程中 将SQL语句插入到请求内容 中,同时程序的本身对用户输入的内容过于相信, 没有对用户插入的SQL语句进行任何的过滤 ,从而 直接被SQL语句直接被服务端执行 ,导致数据库的原有信息泄露,篡改,甚至被删除等风险。 SQL注

    2024年02月05日
    浏览(54)
  • 【网络安全】初探SQL注入漏洞

    要想玩SQL注入,一个简单的数据交互页面是需要的,故我们用PHP做一个简易网页,有登录、注册和首页三块内容。 登录需要输入账号密码,等待提交后进入系统; 注册需要输入名字,密码,手机号,照片,等待提交后进入系统; 首页需要利用PHP和数据库联动后的查询语句,

    2024年02月16日
    浏览(40)
  • web安全漏洞-SQL注入攻击实验

    实验目的 学习sql显注的漏洞判断原理 掌握sqlmap工具的使用 分析SQL注入漏洞的成因 实验工具 sqlmap是用python写的开源的测试框架,支持MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Firebird,Sybase,SAP,MAXDB并支持6种SQL注入手段。 实验内容 SQL注入(SQL I

    2024年02月06日
    浏览(55)
  • Web安全:SQL注入漏洞测试(防止 黑客利用此漏洞.)

    SQL注入就是 有些 恶意用户在提交查询请求的过程中 将SQL语句插入到请求内容 中,同时程序的本身对用户输入的内容过于相信, 没有对用户插入的SQL语句进行任何的过滤 ,从而 直接被SQL语句直接被服务端执行 ,导致数据库的原有信息泄露,篡改,甚至被删除等风险。 SQL注

    2024年02月13日
    浏览(39)
  • Web安全 SQL注入漏洞测试.(可以 防止恶意用户利用漏洞)

    SQL注入就是 有些 恶意用户在提交查询请求的过程中 将SQL语句插入到请求内容 中,同时程序的本身对用户输入的内容过于相信, 没有对用户插入的SQL语句进行任何的过滤 ,从而 直接被SQL语句直接被服务端执行 ,导致数据库的原有信息泄露,篡改,甚至被删除等风险。 SQL注

    2023年04月20日
    浏览(47)
  • SQL注入原理以及Spring Boot如何防止SQL注入(含详细示例代码)

    点击下载《SQL注入原理以及Spring Boot如何防止SQL注入(含详细示例代码)》 SQL注入是一种针对数据库的攻击技术,攻击者通过在应用程序的输入字段中插入或“注入”恶意的SQL代码,从而在数据库服务器上执行非授权的SQL查询。这种攻击可能导致数据泄露、数据篡改、甚至执

    2024年02月20日
    浏览(40)
  • SQL注入漏洞复现:探索不同类型的注入攻击方法

    这篇文章旨在用于网络安全学习,请勿进行任何非法行为,否则后果自负。  准备环境 sqlilabs靶场 安装:Sqli-labs靶场搭建(适合新手小白围观)_sqlilabs靶场搭建-CSDN博客   注入讲解 介绍         基于错误的注入(Error-based Injection)是一种 利用应用程序返回的错误信息来

    2024年02月11日
    浏览(43)
  • 金山终端安全系统V9.0 SQL注入漏洞复现

         金山终端安全系统是一款为企业提供终端防护的安全产品,针对恶意软件、病毒和外部攻击提供防范措施,帮助维护企业数据和网络。     金山终端安全系统V9.0 /inter/update_software_info_v2.php页面存在sql注入漏洞,该漏洞是由于金山终端安全系统未对用户的输入进行有效的

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包