记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

java代码审计入门-SQL注入

2017-03-25 09:10

java代码审计入门-SQL注入-Web安全

来看一下代码,首先看statement的,当然现在已经几乎没人用了,首先这里使用拼接语句,直接将id带入查询而Statement每次执行sql语句都是进行编译导致的产生

//接受传参
//接受传参
String id=request.getParameter("id");
//链接数据库
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost/codeaudit","root","root");
Statement statement=conn.createStatement();

//执行SQL语句
ResultSet rs=statement.executeQuery("select * from news where id="+id);

//显示内容
while(rs.next())
{
	out.print("<hr>"+"<br />");
	out.println("ID:"+rs.getString(1)+"<br />");
	out.println("标题:"+rs.getString(2)+"<br />");
	out.println("内容:"+rs.getString(3)+"<br />");
	out.print("<hr>");
}

实际结果如下图:
java代码审计入门-SQL注入-Web安全

下面在说prepareStatement,因为prepareStatement是预编译的并且具有过滤sql注入的功能从而很安全,但是如果是拼接字符串还是会出问题
代码


//接受传参
String id=request.getParameter("id");
//链接数据库
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost/codeaudit","root","root");

//执行SQL语句
PreparedStatement ps=conn.prepareStatement("select * from news where id=?"+id);
ResultSet rs=ps.executeQuery();

//显示内容
while(rs.next())
{
	out.print("<hr>"+"<br />");
	out.println("ID:"+rs.getString(1)+"<br />");
	out.println("标题:"+rs.getString(2)+"<br />");
	out.println("内容:"+rs.getString(3)+"<br />");
	out.print("<hr>");
}

测试图:
java代码审计入门-SQL注入-Web安全

其实PreparedStatement有提供给我们一个(1,999)的方法给我们

//执行SQL语句
PreparedStatement ps=conn.prepareStatement("select * from news where id=?");
ps.setString(1, id);
ResultSet rs=ps.executeQuery();

从而避免了sql注入的产生
java代码审计入门-SQL注入-Web安全

好在介绍一种在登录出如果使用了拼接字符串的问题

Login.html

 

账号: 
密码: 

 

 

sql_injection.jsp

String id=request.getParameter("id");
String pw=request.getParameter("pw");

Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost/codeaudit","root","root");
PreparedStatement ps=conn.prepareStatement("select * from admin where username='"+id+"' &amp;&amp; password='"+pw+"'");
ResultSet rs=ps.executeQuery();
if(rs.next())
{
	out.println("<span style="color: red; font-size: 300%;">登陆成功</span>");
}
else
{
	out.println("<span style="color: red; font-size: 300%;">账号或密码错误</span>");
}

测试如图:

java代码审计入门-SQL注入-Web安全

java代码审计入门-SQL注入-Web安全

 

上面的代码因为拼接的问题导致了万能密码的出现,所以在实际开发中我们一定要避免拼接字符串的代码
应该使用prepareStatement提供的(1,999)

PreparedStatement ps=conn.prepareStatement("select * from admin where username=? &amp;&amp; password=?");
ps.setString(1, id);
ps.setString(2, pw);
ResultSet rs=ps.executeQuery();

上述代码都是在网络看到的案例,如果想交流代码审计请加群:604571800

知识来源: www.0-sec.org/2017/03/24/java%e4%bb%a3%e7%a0%81%e5%ae%a1%e8%ae%a1%e5%85%a5%e9%97%a8-sql%e6%b3%a8%e5%85%a5/

阅读:282225 | 评论:0 | 标签:Java 代码审计 注入

想收藏或者和大家分享这篇好文章→复制链接地址

“java代码审计入门-SQL注入”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云

本页关键词