web安全测试&渗透测试之sql注入~~

渗透测试概念:

   详见百度百科

http://baike.baidu.com/link?url=T3avJhH3_MunEIk9fPzEX5hcSv2IqQlhAfokBzAG4M1CztQrSbwsRkSerdBe17H6tTF5IleOCc7R3ThIBYNO-q

 

前言:

安全测试范围极广,开门见山,楼主对这行了解的也不是太深,也是在学习探索阶段,此文,也是对自己学习的总结与记录和简单的分享;这里没有具体工具的使用方法,更多的是原理细节的了解和解决方案的探讨。

 

code部分:

html+jsp+mysql,实现登录与新增数据功能。

html

web安全测试&渗透测试之sql注入~~web安全测试&渗透测试之sql注入~~

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>web安全测试之sql注入</title> </head> <body bgcolor="#ffffff"> <form action="chkLogin.jsp" method="POST"> <input type="text" name="user" /><br /> <input type="password" name="pass" /><br /> <input type="Submit" value="登录" /> </form> <form action="insert.jsp" method="POST"> <input type="text" name="user" /><br /> <input type="text" name="pwd" /><br /> <input type="Submit" value="新增" /> </form> </body> </html>

View Code

jsp1

web安全测试&渗透测试之sql注入~~web安全测试&渗透测试之sql注入~~

<%@ page contentType="text/html; charset=utf-8" %> <%@ page import="java.sql.*" %> <html> <head> <title>chkLogin.jsp</title> </head> <body bgcolor="#ffffff"> <% String user = request.getParameter("user"); String pass = request.getParameter("pass"); Connection con = null; PreparedStatement ps = null; ResultSet rs = null; String sql =null; try { Class.forName("com.mysql.jdbc.Driver"); con = java.sql.DriverManager.getConnection("jdbc:mysql://192.168.0.157/webTest?useUnicode=true&characterEncoding=utf-8","root","123456"); sql= "SELECT * FROM user WHERE name='"+user+"' AND pwd ='"+pass+"'"; ps = con.prepareStatement(sql); // ps = con.prepareStatement("SELECT * FROM user WHERE name=? AND pwd =?"); // ps.setString(1, user); // ps.setString(2, pass); rs = ps.executeQuery(); if ( rs.next()) { out.println("登录成功!"); out.println("sql:"+sql); } else { out.println("登录失败!"); out.println("sql:"+sql); } }catch(Exception ex) { out.println("登录异常!"); out.println("sql:"+sql); out.println("Exception:"+ex); }finally{ if ( null != rs) { rs.close(); rs = null; } if ( null != ps) { ps.close(); ps = null; } if ( null != con){ con.close(); con = null; } } %> </body> </html>

View Code

jsp2

web安全测试&渗透测试之sql注入~~web安全测试&渗透测试之sql注入~~

<%@ page contentType="text/html; charset=utf-8" %> <%@ page import="java.sql.*" %> <html> <head> <title>chkLogin.jsp</title> </head> <body bgcolor="#ffffff"> <% String user = request.getParameter("user"); String pass = request.getParameter("pwd"); Connection con = null; PreparedStatement ps = null; ResultSet rs = null; String sql =null; int r = 0; try { Class.forName("com.mysql.jdbc.Driver"); con = java.sql.DriverManager.getConnection("jdbc:mysql://192.168.0.157/webTest?useUnicode=true&characterEncoding=utf-8","root","123456"); sql= "insert into user(name,pwd) values ('"+user+"','"+pass+"')"; ps = con.prepareStatement(sql); // ps = con.prepareStatement("SELECT * FROM user WHERE name=? AND pwd =?"); // ps.setString(1, user); // ps.setString(2, pass); r = ps.executeUpdate(); if (r>0) { out.println("添加成功!"); out.println("sql:"+sql); } else { out.println("添加失败!"); out.println("sql:"+sql); } }catch(Exception ex) { out.println("添加异常!"); out.println("sql:"+sql); out.println("Exception:"+ex); }finally{ if ( null != rs) { rs.close(); rs = null; } if ( null != ps) { ps.close(); ps = null; } if ( null != con){ con.close(); con = null; } } %> </body> </html>

View Code

 

登录原理简介:

html->jsp->db

html页面输入两个参数user、pass,按‘登录’按钮,调用chkLogin.jsp;chkLogin.jsp接收html传入两个参数,去数据库user表里面查询,返回不为null,则登录成功,否则登录失败,异常则登录异常。查询使用的方法是executeQuery,sql组装使用的+参数拼接。

 

正常场景:

数据库用户数据

web安全测试&渗透测试之sql注入~~

页面登录(密码错误)

web安全测试&渗透测试之sql注入~~

页面登录正常

web安全测试&渗透测试之sql注入~~

 

到这里为止,我们的实验的环境有了,现在可以大展手脚了~~开始~

sql注入实例1(不知道用户密码密码情况下,登录):

界面信息输入值

user:test

pwd: ‘ or 1=1; — 

 

效果

web安全测试&渗透测试之sql注入~~

 

sql注入实例2(不知道用户名与密码情况下,登录):

界面信息输入值:

user:’ or 1=1 ; —

pwd:

效果:

web安全测试&渗透测试之sql注入~~

web安全测试&渗透测试之sql注入~~

 

 

上面两个实例攻防升级案例:

初级方案:界面前端控制–界面参数做过滤与限制;比如’ — ;字符,or字符等;

应对方案:通过fiddler等http协议抓包工具,用户名与密码可以自由编辑,注意浏览器做了url编码,直接请求绕过前端字符串控制。

web安全测试&渗透测试之sql注入~~

 

 

实例的升级方案:

中级方案:前端控制+逻辑业务控制,逻辑业务控制舍弃使用+拼接方方式,采取获取参数方式实现:

ps = con.prepareStatement(“SELECT * FROM user WHERE name=? AND pwd =?”);
ps.setString(1, user);
ps.setString(2, pass);

应对方案:

界面字符串输入参数注入与http协议接口方式参数注入失效。

尝试方案(未实践):

对参数进行各种编码转义,这个环节的内容比较多,楼主水平有限,这块有兴趣的欢迎补充。

 

以上,就是一个简单的实例,从以上列子中,也没见到多大的危险性啊,只是进入系统而已~~也没见到能产生多大的危险性与数据泄露的重大风险漏洞啊啊~~好的,大菜开始上场~~

新增数据功能原理:

参考登录~

新增功能正常使用:

web安全测试&渗透测试之sql注入~~

web安全测试&渗透测试之sql注入~~

 

sql注入实例3(任意添加数据):

界面输入数据

test’,’test’),(‘1′,’2’); — 

效果:

web安全测试&渗透测试之sql注入~~

 

好戏从这里开始~~

第一步,获取当前数据库版本,SELECT version()的使用~

sql注入实例4:

界面输入信息

test’,(SELECT version())) — 

效果:

web安全测试&渗透测试之sql注入~~

web安全测试&渗透测试之sql注入~~

 

第二步,获取数据库数据库对象,information_schema.TABLES使用~

sql注入实例5:

界面输入参数:

test’,(select table_schema from information_schema.TABLES group by table_schema limit 1)); — 

效果:

dblist

web安全测试&渗透测试之sql注入~~

界面:

web安全测试&渗透测试之sql注入~~

数据:

web安全测试&渗透测试之sql注入~~

后面的过程就是周而复始,你懂的~直到获取所有db

第三步,获取db库下面的表对象与表结构

方法类似,对 information_schema.TABLES熟悉

第四步,获取db用户名信息

哈哈,方式类似,对information_schema.user熟悉

第五步,重置用户密码

哈哈,方式类似,对information_schema熟悉

第六步,获取ip,这个很多方式

 

上面都得到了,差不多可以宣告GG了~~

 

解决方案&探讨:

从两个维度来分析,第一个应用层角度,从前端到业务层再到db层。

第二个维度,从软件七层架构角度来,应用层->传输层->网络层->数据链路层->物理层.

 

具体如下

1.前端对参数严格控制;

2.业务层不要使用拼接字符串实现方式;

3.业务功能请求,增加token字段控制,每次post请求对koken进行有效验证;

4.传输协议,涉及到数据接口参数安全,采取https协议传输;

5.数据库,采取最小原子控制,对用户,用户权限进行严格的权限控制,能做数据读取与数据插入的业务能单独分别使用不同用户尽量区分;

6.应用层访问db,对数据库配置相关信息,特别是pwd字段进行特定算法加密;

7.数据库与应用程序部署在内网环境,与外网进行隔离;

8.系统方面,欢迎运维童鞋补充;

9.其它维度欢迎补充与讨论。

 

现码的,下班~周末快乐~

 

原文链接:https://www.cnblogs.com/webtest/p/4213972.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/17544

(0)
上一篇 2023年4月26日 11:01
下一篇 2023年4月27日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml