`
liu0107613
  • 浏览: 74133 次
  • 性别: 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注入的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