密云青岛网站建设,腾讯云cdn加速wordpress,常州网络推广哪家好,网站建设简介是什么意思漏洞名称 #xff1a;SQL注入 、SQL盲注
漏洞描述#xff1a;所谓SQL注入#xff0c;就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串#xff0c;最终达到欺骗服务器执行恶意的SQL命令。具体来说#xff0c;它是利用现有应用程序#xff0c;将SQL注入 、SQL盲注
漏洞描述所谓SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串最终达到欺骗服务器执行恶意的SQL命令。具体来说它是利用现有应用程序将恶意的SQL命令注入到后台数据库引擎执行的能力它可以通过在Web表单中输入恶意SQL语句得到一个存在安全漏洞的网站上的数据库而不是按照设计者意图去执行SQL语句。 造成SQL注入漏洞原因有两个一个是没有对输入的数据进行过滤过滤输入还有一个是没有对发送到数据库的数据进行转义转义输出。
检测条件
1、 Web业务运行正常 2、 被测网站具有交互功能模块涉及到参数提交等等。 3、 例如待测目标URL假设为http://www.exmaple.com/page.xxx 4、 待测目标存在参数输入假设为namevalue
检测方法
一、 通过web漏洞扫描工具进行对网站爬虫后得到的所有链接进行检测或者手工判断是否存在注入点一旦确认存在漏洞可利用自动化工具sqlmap去尝试注入。几种常见的判断方法
1、 数字型。测试方法 http://host/test.php?id100 and 11 返回成功 http://host/test.php?id100 and 12 返回失败 2、 字符型。测试方法 http://host/test.php?namerainman ’ and ‘1’‘1 返回成功 http://host/test.php?namerainman ’ and ‘1’‘2 返回失败 3、 搜索型。搜索型注入简单的判断搜索型注入漏洞存在不存在的办法是 3.1先搜索如果出错说明 90%存在这个漏洞。 3.2)然后搜索%如果正常返回说明 95%有洞了。 3.3)然后再搜索一个关键字比如2006吧正常返回所有 2006 相关的信息。 3.4)再搜索2006%and 11 and %和2006%and 12 and % 4、 绕过验证常见的为管理登陆也称万能密码 (1) 用户名输入 ‘ or 11 or ‘ 密码任意 (2)Admin’ - -或‘ or 11 or ‘ - -(admin or 11 --) (MS SQL)(直接输入用户名不进行密码验证)(3)用户名输入admin 密码输入’ or ‘1’’1 也可以 (4) 用户名输入admin or aa 密码输入任意 (5) 用户名输入‘ or 11 - - (6) 用户名输入admin‘ or 11 - - 密码输入任意 (7) 用户名输入1or11or11 密码输入任意 5、 不同的 SQL 服务器连结字符串的语法不同比如 MS SQL Server 使用 符号来连结字符串而 Oracle 使用符号||来连结 http://host/test.jsp?ProdNameBook’ 返回错误 http://host/test.jsp?ProdNameB’’ook 返回正常 http://host/test.jsp?ProdNameB’||’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 splitSQL_Injdata,|
If Request.QueryString Then
For Each SQL_Get In Request.QueryString
For SQL_Data0 To UboundSQL_inj
if instr Request.QueryString
SQL_Get,SQL_InjSQL_DATA0
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($idnull)
{
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] OReilly;
$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 namespaceTestUser//命名空间
select idgetById parameterTypejava.lang.String
resultMapTestFlowResult
select
include refidTestFlowColumns /
![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、 建立起良好的代码审核、审查体系。由专人负责代码的审计增加安全监督环节。