`
liu0107613
  • 浏览: 74592 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

java SQL注入分析程序

    博客分类:
  • java
阅读更多

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(45) NOT NULL,
  `passwd` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

 

 

 

 

package com.liuxt;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SqlInjection {
 Connection conn=null;
 
 private void initDB(){
  
  try{
   Class.forName("com.mysql.jdbc.Driver");
   conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" +
                                      "user=root&password=G@111111");

  }catch(Exception e){
    e.printStackTrace(); 
  }
  
  
 }

 private boolean queryPreUser(String name, String passwd) {
  PreparedStatement statement=null;
  try {
   String sql=this.ceatePreSql(name,passwd);
   statement=this.conn.prepareStatement(sql);
   System.out.println("sql....."+sql);
   statement.setString(1,name);
   statement.setString(2,passwd);
   ResultSet res=statement.executeQuery();
   int count=0;
   while(res.next()){
    count=res.getInt(1);
    
   }
   
   if(count==1) return true;
   else return false;
   
  } catch (SQLException e) {
   e.printStackTrace();
  }
  finally{
   try {
    statement.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
   
  }
  return false;
 }
 
 
 

 
 private String ceatePreSql(String name, String passwd) {
  StringBuilder sb=new StringBuilder();
  sb.append("select count(*) as cc from user ");
  sb.append("where name=? ");
  sb.append("and passwd=? ");
  return sb.toString();
 }


 private boolean queryUser(String name, String passwd) {
  Statement statement=null;
  try {
   statement=this.conn.createStatement();
   String sql=this.creatSql(name,passwd);
   System.out.println("sql ....."+sql);
   ResultSet res=statement.executeQuery(sql);
   int count=0;
   while(res.next()){
    count=res.getInt(1);
    
   }
   
   if(count==1) return true;
   else return false;
   
  } catch (SQLException e) {
   e.printStackTrace();
  }
  finally{
   try {
    statement.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
   
  }
  return false;
 }
 
 
 private String creatSql(String name, String passwd) {
  
  StringBuilder sb=new StringBuilder();
  sb.append("select count(*) as cc from user ");
  sb.append("where name='"+name+"' ");
  sb.append("and passwd='"+passwd+"'");
  //sb.toString();
  return sb.toString();
 }

 public static void main(String[] args) {
  
  SqlInjection dbTest=new SqlInjection();
  dbTest.initDB();
  boolean result;
  result=dbTest.queryUser("test","111");
  System.out.println("query result(in Statement) is ===="+result);
  result=dbTest.queryUser("", "' or 1=1 --'");
  System.out.println("query result(in Statement) is ===="+result);
  result=dbTest.queryUser("' or 1=1 --'", "x");
  System.out.println("query result(in Statement) is ===="+result);
  
  result=dbTest.queryPreUser("test","111");
  System.out.println("query result(in PreparedStatement) is ===="+result);
  result=dbTest.queryPreUser("", "' or 1=1 --'");
  System.out.println("query result(in PreparedStatement) is ===="+result);
  result=dbTest.queryPreUser("' or 1=1 --'", "x");
  System.out.println("query result(in PreparedStatement) is ===="+result);
 }

}

 

运行结果:

 

sql .....select count(*) as cc from user where name='test' and passwd='111'
query result(in Statement) is ====true
sql .....select count(*) as cc from user where name='' and passwd='' or 1=1 --''
query result(in Statement) is ====true
sql .....select count(*) as cc from user where name='' or 1=1 --'' and passwd='x'
query result(in Statement) is ====false
sql.....select count(*) as cc from user where name=? and passwd=?
query result(in PreparedStatement) is ====true
sql.....select count(*) as cc from user where name=? and passwd=?
query result(in PreparedStatement) is ====false
sql.....select count(*) as cc from user where name=? and passwd=?
query result(in PreparedStatement) is ====false

 

 

分享到:
评论
5 楼 liomao 2009-07-15  
SQL注入无处不在
有数据输入查询数据库而不加以限制就很容易产生注入
我在C# 的界面程序也试过SQL注入成功
4 楼 fengzhongtian 2009-07-14  
<div class="quote_title">liu0107613 写道</div>
<div class="quote_div">
<p>DROP TABLE IF EXISTS `user`;<br>CREATE TABLE `user` (<br>  `id` int(10) unsigned NOT NULL auto_increment,<br>  `name` varchar(45) NOT NULL,<br>  `passwd` varchar(45) NOT NULL,<br>  PRIMARY KEY  (`id`)<br>) ENGINE=InnoDB DEFAULT CHARSET=gb2312;</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>package com.liuxt;</p>
<p>import java.sql.Connection;<br>import java.sql.DriverManager;<br>import java.sql.PreparedStatement;<br>import java.sql.ResultSet;<br>import java.sql.SQLException;<br>import java.sql.Statement;</p>
<p>public class SqlInjection {<br> Connection conn=null;<br> <br> private void initDB(){<br>  <br>  try{<br>   Class.forName("com.mysql.jdbc.Driver");<br>   conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" + <br>                                      "<a href="mailto:user=root&amp;password=G@111111">user=root&amp;password=G@111111</a>");</p>
<p>  }catch(Exception e){<br>    e.printStackTrace(); <br>  }<br>  <br>  <br> }</p>
<p> private boolean queryPreUser(String name, String passwd) {<br>  PreparedStatement statement=null;<br>  try {<br>   String sql=this.ceatePreSql(name,passwd);<br>   statement=this.conn.prepareStatement(sql);<br>   System.out.println("sql....."+sql);<br>   statement.setString(1,name);<br>   statement.setString(2,passwd);<br>   ResultSet res=statement.executeQuery();<br>   int count=0;<br>   while(res.next()){<br>    count=res.getInt(1);<br>    <br>   }<br>   <br>   if(count==1) return true;<br>   else return false;<br>   <br>  } catch (SQLException e) {<br>   e.printStackTrace();<br>  }<br>  finally{<br>   try {<br>    statement.close();<br>   } catch (SQLException e) {<br>    e.printStackTrace();<br>   }<br>   <br>  }<br>  return false;<br> }<br> <br> <br> </p>
<p> <br> private String ceatePreSql(String name, String passwd) {<br>  StringBuilder sb=new StringBuilder();<br>  sb.append("select count(*) as cc from user ");<br>  sb.append("where name=? ");<br>  sb.append("and passwd=? ");<br>  return sb.toString();<br> }</p>
<p><br> private boolean queryUser(String name, String passwd) {<br>  Statement statement=null;<br>  try {<br>   statement=this.conn.createStatement();<br>   String sql=this.creatSql(name,passwd);<br>   System.out.println("sql ....."+sql);<br>   ResultSet res=statement.executeQuery(sql);<br>   int count=0;<br>   while(res.next()){<br>    count=res.getInt(1);<br>    <br>   }<br>   <br>   if(count==1) return true;<br>   else return false;<br>   <br>  } catch (SQLException e) {<br>   e.printStackTrace();<br>  }<br>  finally{<br>   try {<br>    statement.close();<br>   } catch (SQLException e) {<br>    e.printStackTrace();<br>   }<br>   <br>  }<br>  return false;<br> }<br> <br> <br> private String creatSql(String name, String passwd) {<br>  <br>  StringBuilder sb=new StringBuilder();<br>  sb.append("select count(*) as cc from user ");<br>  sb.append("where name='"+name+"' ");<br>  sb.append("and passwd='"+passwd+"'");<br>  //sb.toString();<br>  return sb.toString();<br> }</p>
<p> public static void main(String[] args) {<br>  <br>  SqlInjection dbTest=new SqlInjection();<br>  dbTest.initDB();<br>  boolean result;<br>  result=dbTest.queryUser("test","111");<br>  System.out.println("query result(in Statement) is ===="+result);<br>  result=dbTest.queryUser("", "' or 1=1 --'");<br>  System.out.println("query result(in Statement) is ===="+result);<br>  result=dbTest.queryUser("' or 1=1 --'", "x");<br>  System.out.println("query result(in Statement) is ===="+result);<br>  <br>  result=dbTest.queryPreUser("test","111");<br>  System.out.println("query result(in PreparedStatement) is ===="+result);<br>  result=dbTest.queryPreUser("", "' or 1=1 --'");<br>  System.out.println("query result(in PreparedStatement) is ===="+result);<br>  result=dbTest.queryPreUser("' or 1=1 --'", "x");<br>  System.out.println("query result(in PreparedStatement) is ===="+result);<br> }</p>
<p>}</p>
<p> </p>
<p>运行结果:</p>
<p> </p>
<p><span style="color: #ff6600;">sql .....select count(*) as cc from user where name='test' and passwd='111'<br>query result(in Statement) is ====true<br>sql .....select count(*) as cc from user where name='' and passwd='' or 1=1 --''<br>query result(in Statement) is ====true<br>sql .....select count(*) as cc from user where name='' or 1=1 --'' and passwd='x'<br>query result(in Statement) is ====false<br>sql.....select count(*) as cc from user where name=? and passwd=? <br>query result(in PreparedStatement) is ====true<br>sql.....select count(*) as cc from user where name=? and passwd=? <br>query result(in PreparedStatement) is ====false<br>sql.....select count(*) as cc from user where name=? and passwd=? <br>query result(in PreparedStatement) is ====false<br></span></p>
<p> </p>
<p> </p>
</div>
<p> </p>
3 楼 guoxu1231 2009-06-11  
哟  漏点了  我要报告管理员才行   绝对不能让这么不河蟹的图片出现在JE上!
2 楼 iaimstar 2009-06-10  
ls图片 好不河蟹啊
1 楼 neusoft 2009-06-10  
在每次查询后 把记录数输出 大家就全明白了

相关推荐

    SQL注入过滤 (Java版)

    总之,Java中的SQL注入过滤器是保护应用程序免受SQL注入攻击的重要手段之一。通过在请求处理前对参数进行检查和清理,可以有效地降低被注入的风险。同时,结合其他安全措施,如使用预编译的SQL语句,可以进一步增强...

    java防sql注入攻击过滤器

    在Java开发中,SQL注入是一种常见的安全威胁,它允许攻击者通过输入恶意SQL代码来操纵数据库,获取、修改或删除敏感数据。为了防止此类攻击,开发者通常会使用一种称为“SQL注入过滤器”的机制。本篇文章将深入探讨...

    SQL注入攻击原理分析及JavaWeb环境下的防范措施.pdf

    本文在分析了SQL 注入原理的基础上,提出了几点Java Web 环境下防范措施。   随着Ineternet 技术的迅猛发展,为了能更充分地使用互联网这个世界上最大的交流平台,许多单位或个人纷纷建立自己的网站。但是...

    SQL注入源码+SQL注入命令

    SQL注入是一种常见的网络安全威胁,它发生在应用程序不恰当地处理用户输入数据时,导致攻击者能够构造恶意SQL语句,从而获取、修改、删除或者控制数据库中的敏感信息。在这个实验中,我们将关注Java语言如何处理SQL...

    java web Xss及sql注入过滤器.zip

    本项目"java web Xss及sql注入过滤器.zip"就是针对这两种威胁提供的一种解决方案,基于流行的Spring Boot 2.0框架进行开发。 XSS 攻击是通过在网页中插入恶意脚本,当其他用户访问该页面时,这些脚本会被执行,从而...

    SQL注入漏洞检测原型工具

    其次,SQL漏洞静态代码检测工具则从源代码层面进行分析,对程序进行深度扫描,寻找可能导致SQL注入的编程错误。这种工具通常会检查SQL查询语句的构造方式,例如是否存在字符串拼接构建SQL语句的情况,或者是否使用了...

    防止sql注入解决方案

    为了防止SQL注入,开发者需要采取一系列的预防措施,确保应用程序的安全性。以下是一些核心的解决方案: 1. **预编译语句(PreparedStatement)**: 题目中提到的预编译语句是防止SQL注入的关键技术。预编译语句在...

    基于ESAPI的防sql注入jar包及使用示例.rar

    **基于ESAPI的防SQL注入技术** 在网络安全领域,SQL注入是一种常见的攻击手段,通过恶意构造SQL语句,攻击者可以获取、修改甚至删除数据库中的敏感数据。为了防止这种攻击,开发人员通常会采用各种防御策略,其中一...

    SQL注入攻击PPt

    SQL注入是一种常见的网络攻击方式,攻击者通过在Web应用程序接收的请求中插入恶意SQL语句,以此来操纵目标数据库执行非授权操作。这类攻击通常发生在应用程序没有对用户输入的数据进行充分验证的情况下。 **SQL注入...

    防止sql注入的java代码

    本文将详细分析一个用于防止SQL注入的Java过滤器类——`Checksql`。 #### 类结构与功能 `Checksql`类实现了`javax.servlet.Filter`接口,主要负责对HTTP请求中的参数进行检查,以确保其不包含可能导致SQL注入攻击...

    防止sql注入demo

    SQL注入是由于应用程序未能正确验证和清理用户输入的数据导致的。当用户提交的输入被直接拼接到SQL查询中时,攻击者可以构造特定的字符串来操纵查询的逻辑。例如,一个简单的登录表单可能接收用户名和密码,但如果...

    SQL注入原理以及Spring Boot如何防止SQL注入(含详细示例代码)

    SQL注入是一种严重的安全威胁,它允许攻击者通过在应用程序的输入字段中插入恶意SQL代码来执行未经授权的数据库操作。攻击者通常寻找没有适当验证和过滤的用户输入,然后利用这些漏洞来构造能改变原始SQL语句意图的...

    mybatis如何防止SQL注入

    SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过提交恶意的SQL代码到应用程序的输入字段中(如表单、URL等),利用这些输入来操控数据库执行非预期的操作,进而获取敏感数据、修改数据甚至破坏整个数据库...

    SQL注入之如何检测与判断详细过程

    SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过向数据库提交恶意SQL代码来获取敏感数据、修改数据或执行其他非法操作。随着网络安全意识的提高和技术的发展,传统的SQL注入检测方法(如简单的字符串匹配)...

    自己动手编写SQL注入漏洞扫描工具

    标题中的“自己动手编写SQL注入漏洞扫描工具”指的是创建一个能够自动检测Web应用程序是否存在SQL注入漏洞的软件。SQL注入是一种常见的网络安全威胁,攻击者通过在输入字段中插入恶意的SQL语句来操纵数据库,获取...

    如何解决sql注入问题

    SQL注入是一种常见的安全漏洞,攻击者通过在应用程序的输入字段中插入恶意SQL语句,利用这些语句来操控数据库,获取未授权的数据访问,修改或破坏数据。这种攻击方式广泛存在于Web应用程序中,尤其是在那些使用动态...

    程序分析技术在SQL注入防御中的应用研究.pdf

    "程序分析技术在SQL注入防御中的应用研究" 程序分析技术在SQL注入防御中的应用研究是指利用程序分析技术来防御SQL注入攻击的方法。SQL注入攻击是一种常用且易于实施的攻击手段,对Web应用程序的安全构成严重危害。...

    java-sql-inspector:用于测试Java代码是否存在SQL注入漏洞的实用程序

    Java SQL Inspector是一款强大的工具,专为检测Java代码中的SQL注入漏洞而设计。SQL注入是一种常见的安全威胁,攻击者可以通过在输入字段中插入恶意SQL代码来操纵数据库查询,从而获取敏感信息、修改数据甚至完全...

    SQL注入攻击与防御

    本书作者均是专门研究SQL注入的安全专家,他们集众家之长,对应用程序的基本编码和升级维护进行全面跟踪,详细讲解可能引发SQL注入的行为以及攻击者的利用要素,并结合长期实践经验提出了相应的解决方案。针对SQL...

Global site tag (gtag.js) - Google Analytics