美文网首页sql注入SQL用法java
浅谈Web漏洞攻防----SQL注入篇

浅谈Web漏洞攻防----SQL注入篇

作者: HaleyLiu | 来源:发表于2017-11-30 00:06 被阅读108次

各位粉丝,不好意思最近有点忙导致简书脱更了一段时间,最近刚好在做web项目,突然想到一些网络攻防的东西,想和大家分享一下。

所谓Web漏洞攻防这东西心正之人用之则正,心术不正之人用之则邪,本文目的旨在大家了解web漏洞防御,切勿利用此文去攻击网站。

在了解web漏洞之前,必须了解web数据传输:


web数据传输.png

我们常见的Web漏洞类型主要有SQL注入、XSS、远程命令执行以及越权等。

SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

不扯犊子了直接上代码

CREATE TABLE `users` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(64) NOT NULL,

  `password` varchar(64) NOT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `username` (`username`)

  ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ;

  添加一条记录用于测试:

  INSERT INTO users (username,password,email)

  VALUES('HaHa',aes('Hey'));

贴上页面源码:

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

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

下面重头戏来了,在用户名输入框中输入:’ or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:

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

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

select * from users 没错,该sql语句的作用是检索users表中的所有字段,后果可想而知。

然而又有人问,你说了这么多,那要怎么防呢?当然有办法:
其实最好的办法是用shiro框架,当然用存储过程也可以解决,以下是简单技术用来解决sql注入的问题,未用到框架;有些shiro框架可能包含了,shiro框架我们以后详细说明。

 1.使用正则表达式过滤传入的参数

要引入的包:

import java.util.regex.*;

正则表达式:

private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;

判断是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具体的正则表达式:

检测SQL meta-characters的正则表达式 :

/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix

修正检测SQL meta-characters的正则表达式 :/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i

典型的SQL 注入攻击的正则表达式 :/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

检测SQL注入,UNION查询关键字的正则表达式 :/((\%27)|(\’))union/ix(\%27)|(\’)

检测MS SQL Server SQL注入攻击的正则表达式:

/exec(\s|\+)+(s|x)p\w+/ix

等等…..

 

2.字符串过滤

比较通用的一个方法:

(||之间的参数可以根据自己程序的需要添加)

public static boolean sql_inj(String str)

{

String inj_str = "'|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

String inj_stra[] = split(inj_str,"|");

for (int i=0 ; i &lt; inj_stra.length ; i++ )

{

if (str.indexOf(inj_stra[i])&gt;=0)

{

return true;

}

}

return false;

}

 

3.jsp中调用该函数检查是否包函非法字符

 

防止SQL从URL注入:

sql_inj.java代码:

 

package sql_inj;

import java.net.*;

import java.io.*;

import java.sql.*;

import java.text.*;

import java.lang.String;

public class sql_inj{

public static boolean sql_inj(String str)

{

String inj_str = "'|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

//这里的东西还可以自己添加

String[] inj_stra=inj_str.split("\\|");

for (int i=0 ; i &lt; inj_stra.length ; i++ )

{

if (str.indexOf(inj_stra[i])&gt;=0)

{

return true;

}

}

return false;

}

}

 

4.JSP页面判断代码:

 

使用javascript在客户端进行不安全字符屏蔽

功能介绍:检查是否含有”‘”,”\\”,”/”

参数说明:要检查的字符串

返回值:0:是1:不是

函数名是

function check(a)

{

return 1;

fibdn = new Array (”‘” ,”\\”,”/”);

i=fibdn.length;

j=a.length;

for (ii=0; ii<i; ii++)

{ for (jj=0; jj<j; jj++)

{ temp1=a.charAt(jj);

temp2=fibdn[ii];

if (tem’; p1==temp2)

{ return 0; }

}

}

return 1;

} 

相关文章

  • 浅谈Web漏洞攻防----SQL注入篇

    各位粉丝,不好意思最近有点忙导致简书脱更了一段时间,最近刚好在做web项目,突然想到一些网络攻防的东西,想和大家分...

  • PHP宽字节注入

    在PHPMySql语句中存在着宽字节注入漏洞,MySQL宽字节注入漏洞是SQL注入漏洞攻防技术相互促进的一个典型例...

  • SQL注入三部曲-初级

    目录 什么是SQL注入SQL注入产生的原因SQL注入攻击方式如何进行SQL注入SQL注入三部曲 1.渗透攻防WEB...

  • 数据库-4.1.开发过程中的SQL优化

    总览:⭐⭐⭐⭐⭐   1.常见的低效果sql   2.sql注入漏洞攻防 1.常见的低效sql 1.1.Oracl...

  • web安全及防御 - SQL注入漏洞

    SQL注入漏洞(SQL injection)是Web层面最高危的漏洞之一。在2008年至2010年期间,SQL注入...

  • SQL注入原理

    SQL注入漏洞(SQL injection) 是Web层面最高危的漏洞之一。 在2005年前后,SQL漏洞随处可见...

  • SQL 注入

    什么是SQL注入 SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。...

  • 关于SQL注入与避免

    什么是SQL注入 SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。...

  • 避免SQL注入

    什么是SQL注入 SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。...

  • web安全测试(2)

    本章主要介绍常见web安全漏洞。 一、SQL注入 SQL注入(SQL Injection),是最常见影响非常广泛的...

网友评论

本文标题:浅谈Web漏洞攻防----SQL注入篇

本文链接:https://www.haomeiwen.com/subject/ujkmbxtx.html