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.其它维度欢迎补充与讨论。

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

时间: 2024-10-10 01:34:25

web安全测试&渗透测试之sql注入~~的相关文章

【数据库】软件安全测试之SQL注入

这些年我们发现越来越多的公司开始注重安全测试了,为什么?因为安全测试可以在某种程度上可以排查掉你项目的一些安全漏洞,这样你的系统上线后才会相对安全,才有可能尽量避免来自外部的攻击.每一年互联网都会发生一些重大的安全事件,而且每一次带来的后果也是很严重的,而这些教训恰恰都说明了安全测试的重要性. 那什么是安全测试呢?百度百科上给出来的解释是:安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程 .按照小编的理解,简单点

web攻击与防御技术--SQL注入

sql注入是WEB安全中比较重要而复杂的一个东西.而且危害性比较大. 一般来讲SQL注入的话首先要识别注入点.一个是看能不能注入另外一个是看是什么类型的注入比如说字符,数字,搜索(?)等等 GET.POST.HEADER 专门针对一个waf进行测试的时候就要将这几个点全测试个遍,header中还包括Cookie.X-Forwarded-For等,往往除了GET以外其他都是过滤最弱的 一般来讲也是先进行输入尝试,判断WAF.一般来讲简单的语法会被过滤. 不过尝试起来最简单的判断法是这个1^1^0

Web攻防之XSS,CSRF,SQL注入

摘要:对Web服务器的攻击也可以说是形形色色.种类繁多,常见的有挂马.SQL注入.缓冲区溢出.嗅探.利用IIS等针对Webserver漏洞进行攻击.本文结合WEB TOP10漏洞中常见的SQL注入,跨站脚本攻击(XSS),跨站请求伪造(CSRF)攻击的产生原理,介绍相应的防范方法. 关键字:SQL注入,XSS,CSRF 1.SQL注入 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令. 攻击者通过在应用程序预先定义好的SQ

Web攻防之XSS,CSRF,SQL注入(转)

摘要:对Web服务器的攻击也可以说是形形色色.种类繁多,常见的有挂马.SQL注入.缓冲区溢出.嗅探.利用IIS等针对Webserver漏洞进行攻击.本文结合WEB TOP10漏洞中常见的SQL注入,跨站脚本攻击(XSS),跨站请求伪造(CSRF)攻击的产生原理,介绍相应的防范方法.关键字:SQL注入,XSS,CSRF1.SQL注入 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令. 攻击者通过在应用程序预先定义好的SQL语

web实验三——pikachu之sql注入

(一)数字型注入 首先更改1项的值构造payload找到注入点,之后构造payload注出其他信息 查表名 查字段名 最终输入payload: value="1 union select concat(id,'|',username,'|',password,'|',level),2 from users" 结果 (二)字符型注入 使用单引号跳出字符串,最后使用#注释掉多余sql语句,跳过前面查表名字段名的步骤,直接给出最后payload: ' union select id,conc

渗透技术--SQL注入写一句话木马原理

讲一下SQL注入中写一句话拿webshell的原理,主要使用的是 SELECT ... INTO OUTFILE 这个语句,下面是一个语句的例子: SELECT * INTO OUTFILE 'C:\log1.txt' 这样就可以把查询到的数据写入到C盘的log1.txt这个文件里面.利用这个原理我们可以把PHP的一句话木马写到磁盘上从而拿到webshell. 本地的目标站点来实战一下,我们的目的是在目标的物理路径D:/WWW/下面生成一个php文件,从而可以使我们用菜刀连接上去: 先简单的判断

网络安全、Web安全、渗透测试之笔经面经总结(一)

对称加密非对称加密? 对称加密:加解密用同一密钥,密钥维护复杂n(n-1)/2,不适合互联网传输密钥,加解密效率高.应用于加密数据. 非对称加密:公钥推不出私钥,每个用户一个非对称密钥对就可以,适合于互联网传输公钥,但是加密效率低,应用于数字签名及加密. 什么是同源策略? 为了防止不同域在用户浏览器中彼此干扰,浏览器对从不同来源(域)收到的内容进行隔离. 浏览器不允许任何旧有脚本访问一个站点的cookie,否则 ,会话容易被劫持. 只有发布cookie的站点能够访问这些cookie,只有通过该站

渗透常用SQL注入语句合集

1.判断有无注入点; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等..and 0<>(select count(*) from *)and 0<>(select count(*) from admin) —判断是否存在admin这张表 3.猜帐号数目 如果遇到0< 返回正确页面 1<返回错误页面说明帐号数目就是1个and 0<(select count(*) from admi

渗透常用SQL注入语句大全

QL注入大全 Crack8小组 整理 1.判断有无注入点; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等..and 0<>(select count(*) from *)and 0<>(select count(*) from admin) ---判断是否存在admin这张表 3.猜帐号数目 如果遇到0< 返回正确页面 1<返回错误页面说明帐号数目就是1个and 0<(sele