web安全测试&渗透测试之sql注入~~
渗透测试概念:
详见百度百科
http://baike.baidu.com/link?url=T3avJhH3_MunEIk9fPzEX5hcSv2IqQlhAfokBzAG4M1CztQrSbwsRkSerdBe17H6tTF5IleOCc7R3ThIBYNO-q
前言:
安全测试范围极广,开门见山,楼主对这行了解的也不是太深,也是在学习探索阶段,此文,也是对自己学习的总结与记录和简单的分享;这里没有具体工具的使用方法,更多的是原理细节的了解和解决方案的探讨。
code部分:
html+jsp+mysql,实现登录与新增数据功能。
html
<!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>
jsp1
<%@ 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>
jsp2
<%@ 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>
登录原理简介:
html->jsp->db
html页面输入两个参数user、pass,按‘登录’按钮,调用chkLogin.jsp;chkLogin.jsp接收html传入两个参数,去数据库user表里面查询,返回不为null,则登录成功,否则登录失败,异常则登录异常。查询使用的方法是executeQuery,sql组装使用的+参数拼接。
正常场景:
数据库用户数据

页面登录(密码错误)

页面登录正常

到这里为止,我们的实验的环境有了,现在可以大展手脚了~~开始~
sql注入实例1(不知道用户密码密码情况下,登录):
界面信息输入值
user:test
pwd: ' or 1=1; --
效果

sql注入实例2(不知道用户名与密码情况下,登录):
界面信息输入值:
user:' or 1=1 ; --
pwd:
效果:


上面两个实例攻防升级案例:
初级方案:界面前端控制--界面参数做过滤与限制;比如' -- ;字符,or字符等;
应对方案:通过fiddler等http协议抓包工具,用户名与密码可以自由编辑,注意浏览器做了url编码,直接请求绕过前端字符串控制。

实例的升级方案:
中级方案:前端控制+逻辑业务控制,逻辑业务控制舍弃使用+拼接方方式,采取获取参数方式实现:
ps = con.prepareStatement("SELECT * FROM user WHERE name=? AND pwd =?");
ps.setString(1, user);
ps.setString(2, pass);
应对方案:
界面字符串输入参数注入与http协议接口方式参数注入失效。
尝试方案(未实践):
对参数进行各种编码转义,这个环节的内容比较多,楼主水平有限,这块有兴趣的欢迎补充。
以上,就是一个简单的实例,从以上列子中,也没见到多大的危险性啊,只是进入系统而已~~也没见到能产生多大的危险性与数据泄露的重大风险漏洞啊啊~~好的,大菜开始上场~~
新增数据功能原理:
参考登录~
新增功能正常使用:


sql注入实例3(任意添加数据):
界面输入数据
test','test'),('1','2'); --
效果:

好戏从这里开始~~
第一步,获取当前数据库版本,SELECT version()的使用~
sql注入实例4:
界面输入信息
test',(SELECT version())) --
效果:


第二步,获取数据库数据库对象,information_schema.TABLES使用~
sql注入实例5:
界面输入参数:
test',(select table_schema from information_schema.TABLES group by table_schema limit 1)); --
效果:
dblist

界面:

数据:

后面的过程就是周而复始,你懂的~直到获取所有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.其它维度欢迎补充与讨论。
现码的,下班~周末快乐~
web安全测试&渗透测试之sql注入~~的更多相关文章
- 渗透测试之sql注入验证安全与攻击性能
由于渗透测试牵涉到安全性以及攻击性,为了便于交流分享,本人这里不进行具体网址的透露了. 我们可以在网上查找一些公司官方网站如(http://www.XXXXXX.com/xxxx?id=1) 1.拿到 ...
- 渗透测试之sql注入点查询
一切教程在于安全防范,不在于攻击别人黑别人系统为目的 寻找sql注入点方法: 拿到网页后进行查找注入点: 1.通过单引号 ' ; 在 url 后面输入单引号进行回车(如果报错可能存在sql注入为 ...
- Web安全测试学习笔记-SQL注入-利用concat和updatexml函数
mysql数据库中有两个函数:concat和updatexml,在sql注入时经常组合使用,本文通过学习concat和updatexml函数的使用方法,结合实例来理解这种sql注入方式的原理. con ...
- 【数据库】软件安全测试之SQL注入
这些年我们发现越来越多的公司开始注重安全测试了,为什么?因为安全测试可以在某种程度上可以排查掉你项目的一些安全漏洞,这样你的系统上线后才会相对安全,才有可能尽量避免来自外部的攻击.每一年互联网都会发生 ...
- Web渗透测试入门之SQL注入(上篇)
题记: 本来今天想把白天刷的攻防世界Web进阶的做个总结,结果估计服务器抽疯环境老报错,然后想了下今天用到了SQL注入,文件上传等等,写写心得.相信很多朋友都一直想学好渗透,然后看到各种入门视频,入门 ...
- web攻击与防御技术--SQL注入
sql注入是WEB安全中比较重要而复杂的一个东西.而且危害性比较大. 一般来讲SQL注入的话首先要识别注入点.一个是看能不能注入另外一个是看是什么类型的注入比如说字符,数字,搜索(?)等等 GET.P ...
- CTFHub Web题学习笔记(SQL注入题解writeup)
Web题下的SQL注入 1,整数型注入 使用burpsuite,?id=1%20and%201=1 id=1的数据依旧出现,证明存在整数型注入 常规做法,查看字段数,回显位置 ?id=1%20orde ...
- Web攻防之XSS,CSRF,SQL注入
摘要:对Web服务器的攻击也可以说是形形色色.种类繁多,常见的有挂马.SQL注入.缓冲区溢出.嗅探.利用IIS等针对Webserver漏洞进行攻击.本文结合WEB TOP10漏洞中常见的SQL注入,跨 ...
- 安全测试之sql注入
不管是web界面还是app,都会涉及表单输入和提交,如果程序员没有对提交的字符进行过滤或者特殊处理,很容易会产生问题,这里讲的的sql注入就是其中一种方式,在表单中输入sql语句达到进入系统的目的. ...
随机推荐
- Compare_Connect_Letter
题目描述: 比较两个数字mn和nm(如果mn<nm则m<n, 如果nm<mn则n<m,否则n=m) 连接这两个数字 如(mnnm) //比较两个数字mn和nm(如果mn< ...
- Linux 修改计算机名
查看计算机名:在终端输入hostname 修改的话 hostname +计算机名(重启后失效) 要永久修改的话要修改配置文件/etc/sysconfig/network 修改hostname=你要改的 ...
- 1、创建一个JPA project(解决“at least one user library must be selected”问题)
(注:本系列笔记是在学习尚硅谷JPA课程的时候写下的,结合课程内容和自我理解,方便自己以后进行复习) 一.在创建JPA之前看看什么是JPA 1.Java Persistence API:用于对象持久化 ...
- VB 语言学习笔记.
暂时用到,学习学习. 变量声明 Dim 变量名 as 数据类型类型 Set 实例 = new 类名 自定义数据类型 Type 数据类型标识符 域名 As 数据类型; 域名 As 数据类型; 域名 As ...
- andorid源码中察看版本
build\core\version_defaults.mk //搜索该文件中的 PLATFORM_VERSION值
- [转载]浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- Bug调试
iPhone开发笔记——Xcode升级后的警告.错误的解决办法(一) http://blog.sina.com.cn/s/blog_58af95150101slit.html iPhone开发笔记—— ...
- awk当中使用外部变量
1.awk命令使用双引号的情况下 此时在awk命令里面使用\"$var\"就可以引用外部环境变量的var的值 $ var="BASH";echo "u ...
- Android开发之三种动画
转载:http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html http://www.lightskystreet.com/2 ...
- Hibernate与Jpa的关系,终于弄懂
我知道Jpa是一种规范,而Hibernate是它的一种实现.除了Hibernate,还有EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用Jpa的一个好处是,可以更换实 ...